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

时间:2009-11-06 06:41:13

标签: c++ boost data-structures trie

我必须在c ++ map中存储大量字符串以保留唯一字符串,并且当出现重复字符串时,我只需要递增计数器(pair.second)。我使用过c ++ map,它很适合这种情况。由于现在处理的文件已经消失了30gig,我试图将其保存在文件而不是内存中。

在这种情况下,我也遇到了比地图更快的特里。任何人都知道文件支持的trie实现?我遇到了类似于我正在寻找的Trie实现,但似乎没有错误......

2 个答案:

答案 0 :(得分:2)

你如何一次性将30GB加载到内存中?因为它是你想要的基于字典的行为,我想你每次插入或增加时,你都需要加载整个文件(即使是一块一块)进行查找。

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

答案 1 :(得分:1)

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

如果您无法排序,请考虑digesting字符串。 MD5对于您的目的而言可能过度。你可以凑合一些东西。对于数十亿字符串,您可以使用8字节摘要。使用摘要树(可能是BST)。对于每个摘要,存储产生该摘要的唯一字符串的文件偏移量。

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

要比较字符串,您需要转到该文件,因为您存储的所有内容都是文件偏移量。

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