我们看到谷歌,Firefox,一些AJAX页面显示可能的项目列表,而用户键入字符。
有人可以提供一个好的算法,数据结构来实现自动完成吗?
答案 0 :(得分:58)
trie是一种数据结构,可用于快速查找与前缀匹配的单词。
编辑:以下是一个示例,说明如何使用其中一个实现自动填充http://rmandvikar.blogspot.com/2008/10/trie-examples.html
这是3种不同auto-complete implementations的比较(虽然它是用Java而不是C ++)。
* In-Memory Trie
* In-Memory Relational Database
* Java Set
查找键时,trie比Set实现略快。 trie和set都比关系数据库解决方案快得多。
Set的设置成本低于Trie或DB解决方案。您必须决定是否经常构建新的“字集”,或者查找速度是否为更高优先级。
这些结果是用Java编写的,您的里程可能因C ++解决方案而异。
答案 1 :(得分:19)
对于大型数据集,后端的一个很好的候选者是三元搜索树。它们结合了两个世界中最好的:二叉搜索树的低空间开销和数字搜索尝试的基于字符的时间效率。
参见Dr. Dobbs Journal:http://www.ddj.com/windows/184410528
目标是在用户输入时快速检索有限结果集。让我们首先考虑搜索“计算机科学”,你可以从“计算机”或“科学”而不是“计算机”开始输入。因此,给定一个短语,生成以单词开头的子短语。现在,对于每个短语,将它们输入TST(三元搜索树)。 TST中的每个节点将表示到目前为止已键入的短语的前缀。我们将在该节点中存储该前缀的最佳10(说)结果。如果一个节点的候选者数量多于有限数量的结果(此处为10个),则应该有一个排序函数来解决两个结果之间的竞争。
每隔几个小时就可以构建一次树,具体取决于数据的动态性。如果数据是实时的,那么我猜其他一些算法会给出更好的平衡。在这种情况下,绝对要求是每次键入击键的结果的快速检索,它做得非常好。
如果涉及拼写更正的建议,则会出现更多并发症。在这种情况下,还必须考虑编辑距离算法。
对于像国家列表这样的小型数据集,可以使用Trie的简单实现。如果要在Web应用程序中实现此类自动完成下拉列表,则在列表中提供数据后,YUI3的自动完成小组件将为您完成所有操作。如果您使用YUI3作为大数据支持的自动完成的前端,请在C ++中创建基于TST的Web服务,然后使用自动完成小部件的脚本节点数据源从Web服务而不是简单列表中获取数据。 / p>
答案 2 :(得分:6)
Segment trees可用于有效实施auto complete
答案 3 :(得分:4)
如果您想建议最受欢迎的完成,“建议树”可能是一个不错的选择: Suggest Tree
答案 4 :(得分:2)
对于一个简单的解决方案:您生成一个具有最小编辑(Levenshtein)距离(1或2)的“候选人”,然后使用哈希容器测试候选者的存在(设置将足以进行简单的求解,然后使用tr1或boost中的 unordered_set 。
实施例: 你写了carr,你想要车。 arr由1删除生成。你的unordered_set是arr吗?编号crr由1删除生成。 crr在你的无序集中吗?号码车由1删除生成。汽车在你的无序集中吗?是的,你赢了。
当然有插入,删除,换位等......
你看到你生成候选人的算法确实是你在浪费时间的地方,特别是如果你有一点 unordered_set 。