在一个包含100,000,000个单词的c++文本文件中搜索单词



我有一个每行100000000字的txt文件。

我想写一个函数,它接受一个单词的输入,并搜索该单词在txt文件中是否存在。

我已经尝试过这个地图和trie方法,但我得到std:bac_alloc错误,这是由于大量的单词谁能建议如何解决这个问题

数据结构在编程时非常重要。如果可能的话,我建议你使用二叉树之类的东西。但这需要对文本文件进行排序。如果不能对文本文件进行排序,最好的方法是迭代文本文件,直到得到想要的单词。此外,您的评论应该包含更多的信息,以便我们更容易地诊断您的问题

我想你想要一遍又一遍地搜索这个单词列表。因为对于少量的搜索,只需在文件中线性搜索。

将单词列表解析为后缀树大约需要文件大小的20倍,如果不进行优化则更多。由于在构建单词列表的trie时耗尽了内存,我假设它非常大。所以我们不要把它保存在内存中,而是稍微处理一下,这样你可以更快地搜索。

我建议的解决方案是做一个字典搜索。

因此,首先将每个空格转换为换行符,这样每行只有一个单词,而不是多行包含多个单词,然后对文件进行排序并存储它。当您使用它时,可以删除重复项。那是我们的字典。当你这样做的时候,记住最长单词(L)的长度。

要访问字典,需要一个辅助函数来读取偏移量X处的单词,偏移量X可能位于某个单词的中间。该函数应该查找offset - L并将2 * L字节读入缓冲区。然后从缓冲区中间前后搜索,找到偏移量x处的单词

现在要搜索,打开字典,读取偏移量left=0和偏移量right = size_of_file处的单词,即第一个和最后一个单词。如果你的搜索词比第一个单词小,或者比最后一个单词大,你就完成了,没有找到单词。如果你找到了搜索词,你也完成了。

接下来,在二进制搜索中,您将取左和右的std::中点,读取该偏移量处的单词,并检查搜索项是小还是大,然后递归到该间隔中。这将需要O(log n)读取来查找单词或确定它不存在。

字典搜索可以做得更好。而不是使用中点,你可以估计单词应该在字典中的位置。假设你的字典从";aal &;";Zoo"而你正在搜索"斑马"。请你把字典中间的部分打开好吗?不,你会在最后打开它,因为泽巴离动物园比阿尔近得多。因此,您需要一个函数,该函数给出一个介于0到1之间的值(M),表示搜索项相对于左单词和右单词的位置。你的"midpoint"则为(right - left) * M。然后,像二进制搜索一样,确定搜索项是在左区间还是右区间,然后递归。

如果单词列表具有合理的均匀分布,则字典搜索平均只需要log log n次读取。

最新更新