高效的字典查找

Efficient Dictionary lookup

本文关键字:查找 字典 高效      更新时间:2023-10-16

对于我的C++应用程序,需要检查一个单词是否是有效的英语词典单词。做这件事最好的方法是什么?有没有免费的字典我可以用。我只需要收集所有可能的单词。如何使此查找成本最低。我需要散列它吗?

使用std::set<std::string>std::unordered_set<std::string>。后者在C++0x中是新的,您的C++标准库实现可能支持也可能不支持;如果它不支持它,它可能会包含某种类型的hash_set:请参阅您的文档以了解更多信息。

其中哪一个(使用二进制搜索树的set和使用哈希表的unordered_set)更高效取决于存储在容器中的元素数量以及标准库实现如何实现它们。你最好同时尝试这两种方法,看看哪一种更适合你的特定场景。

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

关于单词列表的存在,它取决于平台。在Linux下,/usr/share/dict/words包含一个英文单词列表可能会满足您的需求。否则,毫无疑问会有这样的名单网络上可用。

考虑到这些列表的大小,最快速的访问将是加载它转换为哈希表。std::unsorted_set,如果你有;否则,许多C++编译器附带hash_set,尽管不同的编译器有一个稍微不同的界面,并将其放入不同的命名空间。如果仍然存在性能问题,可以如果你事先知道条目的数量(这样表就永远不会必须增长),并在std::vector(甚至是C型数组);处理冲突将稍微复杂一些,然而

另一种可能性是trie。这几乎肯定会导致在查找中最少的基本操作中易于实现。典型的实现会非常糟糕然而,这可能会使它比其他地方慢实际实践中的解决方案同时执行和测量)。

我实际上是几个月前做的,或者是类似的事情。你可能可以在网上免费找到一个。

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

只需将其放在一个文本文件中,并将单词与列表中的单词进行比较。它的顺序应该是n,n是列表中的单词数。您是否需要更快的时间复杂性?

希望这能有所帮助。