说我有一个对象:
var names = ["john", "jane", "al", "mary", "zane" ... 1000+ Names]
我想创建一个自动建议来搜索这些名称。
最有效的方法是什么?我读过创建trie或三元数据结构是最好的,但我不确定如何在js中实现这些。
有什么想法吗?
答案 0 :(得分:9)
特里是一个很好的解决方案。您的数据集如下所示:
{"j":
{"a":
["jacob", "jane", ..],
{"o":
["john", "joesph", ..],
..
};
您可以逐个字符地索引尽可能多的级别(因此最里面的数组可能有20-30个条目。)然后对存储在最内层的数组进行简单搜索。
您可以通过循环遍历您的名称集来生成此项,然后检查特定索引条目是否存在。如果是这样,请向下走一层,检查下一个字符是否存在等等,直到达到最深层。然后插入到数组中,或者如果没有数组则启动新数组。如果在添加新名称时不存在字符级别,则创建它。然后你想要缓存最终结果,而不是在每次请求时重新生成它。
答案 1 :(得分:1)
我认为trie是一种考虑从大型池中进行自动建议的自然方式 - 您需要做的是前缀搜索,并尝试擅长此操作。也就是说,我真的不确定数组的底层实现如何在javascript中运行,所以你必须对它进行基准测试,看看trie在什么时候变得高效。也就是说,可能存在一些数字n,使用线性搜索比使用线索更有意义。最重要的是,由于每个浏览器使用不同的js引擎,因此效率可能会有所不同。
那就是说,这是js中的trie实现:http://notdennisbyrne.blogspot.com/2008/12/javascript-trie-implementation.html
如果js数组以我认为可能的方式工作(即作为花哨的哈希表,意味着甚至做trienode [10]将最终成为哈希表查找),那么另一个考虑的简单选项是存储每个前缀数组中的单词。例如对于名称john
,您要将j
jo
joh
john
插入数组中,这样可以为您提供持续的时间查找,但当然会使用大量的存储器中。
答案 2 :(得分:1)
为什么不使用Array.sort()对数组进行排序,然后对其执行二进制搜索?
以下是在js中演示二进制搜索的代码。
http://www.nczonline.net/blog/2009/09/01/computer-science-in-javascript-binary-search/
另外检查页面上的注释,它有更高效的二进制搜索实现
答案 3 :(得分:0)
您可以使用Jquery UI框架的自动完成功能。您会找到文档here 它会避免你重制轮子......
答案 4 :(得分:0)
如果你想在John找到Jan而不是看看PHP函数soundex和metaphone。此函数转换语音字符串中的字符串。在http://php.net是一些可以轻松转换为JS的示例。你很高兴 - 英语没有特殊字符。
使用此语音均衡创建第二个数组,并添加指向源元素的指针。 您需要对第二个数组进行多重排序。 https://stackoverflow.com/a/9374631/817152
翻译搜索词。
然后使用区间搜索算法快速。 https://stackoverflow.com/a/16371484/817152
不要放弃。