繁体   English   中英

文件支持的Trie(或前缀树)实现

[英]File backed Trie (or Prefix Tree) implementation

我必须在c ++映射中存储很多字符串以保留唯一的字符串,并且一旦出现重复的字符串,我只需要增加计数器(pair.second)即可。 我使用过c ++映射,它非常适合这种情况。 由于处理的文件现在已高达30gig,因此我试图将其保存在文件中而不是内存中。

在这种情况下,我还遇到了trie,它比map更快。 有人知道文件支持的Trie实现吗? 我遇到了一个Trie实现,它与我正在寻找的实现相似,但似乎没有错误。

如何将30GB一次全部加载到内存中? 而且由于您想要的是基于字典的行为,所以我想像您每次插入或递增时,都需要加载整个文件(即使是逐段加载)以进行查找。

我建议使用数据库。 那就是他们的目的...

如果您可以对包含字符串的文件进行排序 ,那么阅读排序列表和计算重复项将很容易。 (您可以保留原始文件,并创建一个新的已排序字符串的文件。)有效地对大型文件进行排序是旧技术。 您应该能够找到一个实用程序。

如果您不能排序 ,请考虑摘要这些字符串。 对于您的目的,MD5可能会过大。 你可以把东西弄平。 对于数十亿个字符串,您可以使用8个字节的摘要。 使用摘要树(可能是BST)。 对于每个摘要,存储产生该摘要的唯一字符串的文件偏移量。

当您读取一个字符串时,计算它的摘要,然后查找它。 如果找不到摘要,则说明该字符串是唯一的。 将其存储在树中。 如果找到摘要,请检查每个关联的字符串是否匹配,并进行相应处理。

要比较字符串,您将需要转到文件,因为您存储的只是文件偏移量。

重要的是要记住,如果两个摘要不同,则产生它们的字符串也必须不同。 如果摘要相同,则字符串可能不相同,因此需要检查。 当重复的字符串较少时,该算法将更加有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM