Javascript 使用trie自动完成
我正在编写一个自动完成脚本,并考虑使用trie。我的问题是我想要所有匹配的东西都被退回。例如,我输入字母Javascript 使用trie自动完成,javascript,algorithm,trie,Javascript,Algorithm,Trie,我正在编写一个自动完成脚本,并考虑使用trie。我的问题是我想要所有匹配的东西都被退回。例如,我输入字母r,我希望返回所有以r开头的条目。然后,所有以re等开头的条目。这是否适用于trie,以及它是如何工作的。此外,如果有更好的方法,我愿意接受建议。我问这个问题的原因是,返回r分支的所有节点似乎很复杂,需要大量的处理 是的,我可能正在重新发明轮子,但我想了解它是如何工作的。你完全可以使用trie来完成。下面是我编写的一些代码,可以为您指出正确的方向: var tokenTree = functi
r
,我希望返回所有以r
开头的条目。然后,所有以re
等开头的条目。这是否适用于trie,以及它是如何工作的。此外,如果有更好的方法,我愿意接受建议。我问这个问题的原因是,返回r
分支的所有节点似乎很复杂,需要大量的处理
是的,我可能正在重新发明轮子,但我想了解它是如何工作的。你完全可以使用trie来完成。下面是我编写的一些代码,可以为您指出正确的方向:
var tokenTree = function (tokenArray) {
var createLetterObject = function (l) {
var pChildren = [];
var getMatchingWords = function (characterArr, availableWords, children) {
if (characterArr.length === 0) {
for (var child in children) {
if ({}.hasOwnProperty.call(children, child)) {
var currentChild = children[child];
var words = currentChild.getWords(characterArr);
for (var pos in words) {
if ({}.hasOwnProperty.call(words, pos)) {
availableWords.push(words[pos]);
}
}
if (currentChild.word) {
availableWords.push(currentChild.word);
}
}
}
} else {
var currentCharacter = characterArr.pop();
getMatchingWords(characterArr, availableWords, children[currentCharacter].children);
}
};
function doGetWords(wordPart) {
var len = wordPart.length;
var ar = [];
var wordList = [];
for (var ii = len - 1; ii >= 0; ii --) {
ar.push(wordPart[ii].toUpperCase());
}
getMatchingWords(ar, wordList, pChildren);
return wordList;
}
return {
letter: l,
children: pChildren,
parent: null,
word: null,
getWords: doGetWords
};
};
var startingPoint = createLetterObject();
function parseWord(wordCharacterArray, parent, fullWord) {
if (wordCharacterArray.length === 0) {
parent.word = fullWord;
return;
}
var currentCharacter = wordCharacterArray.pop().toUpperCase();
if (!parent.children[currentCharacter]) {
parent.children[currentCharacter] = createLetterObject(currentCharacter);
}
parseWord(wordCharacterArray, parent.children[currentCharacter], fullWord);
}
for (var counter in tokenArray) {
if ({}.hasOwnProperty.call(tokenArray, counter)) {
var word = tokenArray[counter];
if (!word) {
continue;
}
var ar = [];
var wordLength = word.length;
for (var ii = wordLength - 1; ii >= 0; ii--) {
ar.push(word[ii]);
}
parseWord(ar, startingPoint, word);
}
}
return startingPoint;
};
用法
我并不是说这是接近最佳或最有效的方式,但它至少应该让你指向正确的方向
下面是一个jsfiddle,它显示了它的工作原理:关于在根便笺中查找项目的时间,如果您这样做是为了自动完成,那么每个“匹配”可能不会返回太多结果。如果您想以空间换取速度,可以在每个节点上存储对“前n个”项的引用。当然,这需要更多的更新时间为什么要使用CharacterArr而不是CharacterArray,您声明了它?:)
var tokens = ["Token", "words", "whohaa", "mommy", "test", "wicked"];
var tree = tokenTree(tokens);
var currentTokenSet = 'w';
var list = tree.getWords(currentTokenSet);
// it will return words,whohaa,wicked.
console.log(list)