什么是最好的自动完成/build议algorithm,数据结构

我们看到谷歌,Firefox的一些AJAX页面显示可能的项目列表,而用户input字符。

有人能给出好的algorithm,实现自动完成的数据结构吗?

一个trie是一个数据结构,可以用来快速find匹配前缀的单词。

编辑:这里是一个例子,展示如何使用一个实现自动完成http://rmandvikar.blogspot.com/2008/10/trie-examples.html

下面是3个不同的自动完成实现的比较 (虽然它是Java而不是C ++)。

* In-Memory Trie * In-Memory Relational Database * Java Set 

查找密钥时,树状结构比集合实现稍快。 trie和set都比关系数据库解决scheme好一点。

Set的设置成本低于Trie或DB解决scheme。 您必须决定是否要频繁构build新的“词汇集”,或者查询速度是否优先。

这些结果是用Java编写的,你的里程可能会随着C ++解决scheme而变化。

对于大型数据集,后端的一个好候选是三元search树。 它们结合了两个最好的世界:二叉search树的低空间开销和数字search尝试的基于字符的时间效率。

请参阅Dr. Dobbs杂志: http : //www.ddj.com/windows/184410528

我们的目标是在用户input时快速检索一个有限的结果集。让我们首先考虑search“计算机科学”,你可以从“计算机”或“科学”开始打字,而不是“计算机”。 所以,给一个短语,生成一个单词开始的子句。 现在为每个短语,喂他们进入TST(三元search树)。 TST中的每个节点将表示迄今为止input的短语的前缀。 我们将在该节点中存储该前缀的最佳10个(说)结果。 如果一个节点的候选数量比有限的结果数量多10个,那么应该有一个sorting函数来解决两个结果之间的竞争。

树可以每隔几个小时build一次,这取决于数据的活力。 如果数据是实时的,那么我想其他一些algorithm会给出更好的平衡。 在这种情况下,绝对的要求就是每次击键都能够快速检索结果。

如果涉及到拼写纠正的build议,会出现更多的复杂性。 在这种情况下,编辑距离algorithm也必须考虑。

对于像国家名单这样的小型数据集,Trie的一个简单实现就可以做到。 如果您要在Web应用程序中实现这种自动完成下拉列表,YUI3的自动完成小部件将在列表中提供数据后为您执行所有操作。 如果您使用YUI3作为大数据支持的自动填充的前端,请在C ++中使用基于TST的Web服务,然后使用自动填充小部件的脚本节点数据源从Web服务而不是简单列表中获取数据。

可以使用分段树来有效地实现自动完成

如果你想build议最stream行的完成,一个“build议树”可能是一个不错的select: build议树

对于一个简单的解决scheme:你生成一个具有最小编辑( Levenshtein )距离(1或2)的“候选”,然后你用一个散列容器testing候选的存在( set将足够简单的soltion,然后使用unordered_set tr1或boost)。

例如:你写了carr,你想要汽车。 arr是由1删除产生的。 你的unordered_set是否是arr? 号码crr是由1个删除产生的。 crr在你的unordered_set? 号汽车是由1删除产生的。 汽车是在你的无序吗? 是的,你赢了。

当然还有插入,删除,换位等

你会发现你的候选algorithm真的是浪费时间的地方,特别是如果你有一个很小的unordered_set