我想在C ++中实现以下内容:
1)检查字典中是否存在给定的单词。字典文件是一个巨大的文件;考虑100MB或3-4百万字。
2)建议更正错误的单词。
3)自动填充功能。
1)我打算建一棵树,所以搜索效率会很高。
2)我没有得到如何实现自动校正功能。
3)我可以使用树实现自动完成功能
实现上述所有功能的最佳数据结构和算法是什么?
答案 0 :(得分:3)
我一直在研究同样的问题。到目前为止,我遇到的最佳解决方案是使用三元搜索树进行自动完成。三元搜索树比尝试更节省空间。 如果我无法在我的三元搜索树中找到查找的字符串,那么我使用已经构建的BK树来查找最接近的匹配。 BK Tree内部使用Levenshtein距离。 你
你也可能想要探索元音,但是我还没有进入metaphone的深度。
如果你愿意的话,我有一个用于BK TREE + TERNARY SEARCH TREE的Java解决方案。
答案 1 :(得分:2)
您可以通过查看给定子树中的所有字符串来执行自动完成。一些分数可以帮助你挑选可能有所帮助。这就像你有“te”一样,你可以沿着trie中的那条路走下去并遍历那里的整个子树以获得所有可能的结局。
对于更正,您需要在树上实现http://en.wikipedia.org/wiki/Levenshtein_distance之类的内容。您可以使用以下事实:如果您在trie中处理了给定路径,则可以将结果重用于路径末尾的子树中的所有字符串。
答案 2 :(得分:1)
1)除了树木,另一个有趣的方法是BWT
http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
BWT后缀数组可以很容易地用于跟踪具有给定前缀的单词。
2)对于纠错,现代方法是LHS:
http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search
谷歌搜索随机提供的一些链接:
https://cs.stackexchange.com/questions/2093/efficient-map-data-structure-supporting-approximate-lookup
https://code.google.com/p/likelike/
http://aspguy.wordpress.com/2012/02/18/the-magic-behind-the-google-search/