[英]What is the best auto-suggest search algorithm for javascript
说我有一个对象:
var names = ["john", "jane", "al", "mary", "zane" ... 1000+ Names]
我想创建一个自动建议来搜索这些名称。
这样做最有效的方法是什么? 我读过创建trie或三元数据结构是最好的,但我不确定如何在js中实现这些。
有什么想法吗?
特里是一个很好的解决方案。 您的数据集看起来像这样:
{"j":
{"a":
["jacob", "jane", ..],
{"o":
["john", "joesph", ..],
..
};
您可以逐个字符地索引尽可能多的级别(因此最里面的数组可能有20-30个条目。)然后对存储在最内层的数组进行简单搜索。
您可以通过循环遍历您的名称集合来生成此项,然后检查特定索引条目是否存在。 如果是这样,请向下走一层,检查下一个字符是否存在等等,直到达到最深层。 然后插入到数组中,或者如果没有数组则启动新数组。 如果在添加新名称时不存在字符级别,则创建它。 然后,您希望缓存最终结果,而不是在每个请求上重新生成它。
我认为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
插入一个数组中,这会给你恒定的时间查找,但当然会使用大量的内存。
为什么不使用Array.sort()对数组进行排序,然后对其执行二进制搜索?
这是一个在js中演示二进制搜索的代码。
http://www.nczonline.net/blog/2009/09/01/computer-science-in-javascript-binary-search/
还要检查页面上的注释,它有更高效的二进制搜索实现
如果你想在John找到Jan而不是看看PHP函数soundex和metaphone。 此函数转换语音字符串中的字符串。 在http://php.net上有一些例子可以轻松转换为JS。 你很高兴 - 英语没有特殊字符。
使用此语音均衡创建第二个数组,并添加指向源元素的指针。 您需要对第二个数组进行多重排序。 https://stackoverflow.com/a/9374631/817152
翻译搜索词。
然后使用区间搜索算法快速。 https://stackoverflow.com/a/16371484/817152
不要放弃。
您可以使用Jquery UI框架的自动完成功能。 你会在这里找到文档。
它会避免你重拍轮子......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.