2016-05-17 28 views
1

我一直在尋找更好的自動完成alghoritm,我發現了關於trie。 我已經實現了基本線索在trie中查找word

var trie = {}; 
    for(var i = 0 ; i < words.length ; i++){ 
     var tmp_word = words[i]; 
     var tmp_arr  = tmp_word.split(""); 
     var current  = trie; 

     for(var j = 0; j < tmp_arr.length; j++){ 
     var letter = tmp_arr[j]; 
     var pos = current [ letter ]; 
     if(pos == null){ 
       current [ letter ] = j === tmp_arr.length - 1 ? 0 : {}; 
       current =current [ letter ]; 
     } 
     else if (pos === 0) { 
       current [ letter ] = { $: 0 }; 
       current =current [ letter ] 
     } 
     else{ 
       current = current [ letter ]; 
     } 

     }  
    } 

將採取從陣列的話,並創建每個字母鍵。 例如,如果數組是

var words = [ "Hello" , "world" ,"Helis" ] 

它將創建這個

{ 
    "H": { 
    "e": { 
     "l": { 
     "l": { 
      "o": 0 
     }, 
     "i": { 
      "o": { 
      "s": 0 
      } 
     } 
     } 
    } 
    }, 
    "w": { 
    "o": { 
     "r": { 
     "l": { 
      "d": 0 
     } 
     } 
    } 
    } 
} 

什麼,我掙扎的就是找到一個詞來完成。例如,如果我輸入「他」,它應該返回Hello和Helios,怎麼做最好的方法是什麼?我想到的唯一的東西就是蠻力循環,這真的是無效和緩慢。有沒有比蠻力更有效的方法?

+0

發生什麼事,如果** **他是你的線索詞。我建議使用自己的屬性,比如'isword'和值'true'。迭代我會去蠻力,因爲JavaScript是足夠快的散列表。 –

+0

也許你看看http://stackoverflow.com/a/32781195/1447675 –

回答

0

您可以嘗試https://github.com/pujansrt/trie-js

var trie = new Trie(); 
trie.insert('ant'); 
trie.insert('and'); 
trie.insert('antique'); 
console.log(trie.autoComplete('ant')); //['ant','antique']