所以,我有这个文本文件(用Aspell生成),里面有200 000个单词。它将被用于螃蟹游戏,以检查这个词是否合法。这意味着,很可能会有相当多的检查,其中没有这个词,我想知道最有效的方式是什么。
检查每行的文本文件行每次检查需要20万次迭代,这是我的最后选择。
获取QList中的所有单词,并使用Qlist :: contains()函数(或QList :: indexOf(),因为我认为我使用的是Qt4.8)。我不知道它的效率,并且会使用相当多的内存。
使用哈希表。老实说,我不确定它是如何工作的,所以如果有人能告诉我们提供了Qt数据类型,我可以做一些研究。
还有其他有效的方法吗?目前倾向于QList方法,似乎最容易实现:)
答案 0 :(得分:1)
您可以使用std::unordered_set
,它通过哈希表执行查找。
Qt有它自己的实现QSet
不要使用QList或第一个文件遍历方法,因为两者都比一个散列表查找慢几个数量级。
答案 1 :(得分:1)
假设散列是好的,使用散列表肯定是最快的方法(因为它是一个简单的散列计算 - 因为字符串可能不是很长,这不应该花费太多时间 - 典型的英语单词是围绕5个字符长)。
本页的QHash部分中有一个示例,说明如何散列字符串:http://doc.qt.digia.com/qq/qq19-containers.html
答案 2 :(得分:0)
对列表进行排序 - 一次性操作:保存已排序,或在启动程序时对其进行排序 - 并使用二进制搜索。在200,000个项目中查找任何单词平均需要17.6次查找,其中大约四个第一次操作只需要检查单个字符。