什么是最好的自动建议搜索算法的JavaScript

时间:2011-02-24 23:27:43

标签: javascript algorithm search data-structures

说我有一个对象:

var names = ["john", "jane", "al", "mary", "zane" ... 1000+ Names]

我想创建一个自动建议来搜索这些名称。

最有效的方法是什么?我读过创建trie或三元数据结构是最好的,但我不确定如何在js中实现这些。

有什么想法吗?

5 个答案:

答案 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

不要放弃。