高效的字典查找

时间:2011-06-02 06:34:18

标签: c++

对于我的C ++应用程序,需要检查单词是否是有效的英语词典单词。什么是最好的方法。有没有我可以使用的免费字典。我只需要收集所有可能的单词。如何使这个查找最便宜。我需要哈希吗?

3 个答案:

答案 0 :(得分:7)

使用std::set<std::string>std::unordered_set<std::string>。后者是C ++ 0x中的新功能,您的C ++标准库实现可能支持也可能不支持;如果它不支持它,它可能包含某种hash_set:请查阅您的文档以查找。

使用二进制搜索树的set和使用哈希表的unordered_set中的哪一个更有效取决于您在容器中存储的元素数量以及标准库实现实现它们。您最好的选择是尝试两者,看看哪种表现更适合您的特定情况。

或者,如果单词列表已修复,您可以考虑使用排序std::vector并使用std::binary_search在其中查找单词。

答案 1 :(得分:5)

关于单词列表的存在,它取决于平台。 在Linux下,/usr/share/dict/words包含英语单词列表 这可能符合您的需求。否则,无疑会有这样的清单 可在网络上找到。

鉴于此类列表的大小,最快速的访问将是加载它 进入哈希表。 std::unsorted_set,如果你拥有它;否则,很多 C ++编译器带有hash_set,尽管编译器有不同的编译器 一个稍微不同的界面,并把它放在不同的 命名空间。如果仍有性能问题,可以这样做 如果你事先知道条目的数量会更好(所以表永远不会 必须增长),并在std :: vector中实现哈希表(甚至是 C风格阵列);处理碰撞会有点复杂, 但是。

另一种可能性是特里。这几乎肯定会产生 在查找中的最少数量的基本操作中,并且是公平的 易于实施。典型的实施将非常糟糕 然而,这可能使它比其他一些慢 在实践中的解决方案(或不是 - 唯一的知道方法是 实施和测量)。

答案 2 :(得分:3)

几个月前我实际上是这样做的,或者接近这个。你可以在网上找到一个免费的。

喜欢这个网站:http://wordlist.sourceforge.net/

将其放入文本文件中,并将单词与列表中的内容进行比较。它应该是n阶,n是列表中的单词数。你需要更快的时间复杂度吗?

希望这有帮助。