内存有效的方式来存储字符串

时间:2013-03-29 15:18:15

标签: string algorithm data-structures

假设我有数百万字符串。每个字符串都有一个int值。我想通过输入字符串检索此值,但我不想存储所有这些字符串,因为它们占用了大量空间。我不能使用哈希表,因为它需要在内存中存储所有或至少许多字符串。那么对于我的情况来说什么是好的数据结构(我不需要添加或删除任何字符串,我已经准备好了数据并且只允许读取操作)

4 个答案:

答案 0 :(得分:4)

使用trie来阻止存储公共子串..

答案 1 :(得分:3)

如果可以预先处理单词列表,请查看完美的哈希值,例如CMPH。 (gperf是另一个,但似乎针对较小的数据集进行了优化。)

来自CMPH文档:

  

完美散列函数将一组静态n个键映射到一组m个整数而不发生碰撞,其中m大于或等于n。如果m等于n,则该函数称为minimal。

...

  

CMPH库将最新,更高效的算法封装在易于使用,生产质量快的API中。该库旨在处理无法放入主内存的大型条目。它已成功用于构建具有超过1亿个键的集合的最小完美散列函数,...

答案 2 :(得分:1)

您可能希望查看Judy tree,其设计既快速又紧凑,并且具有专为字符串键设计的版本。其实施可在sourceforge上获得。

答案 3 :(得分:0)

根据您当前问题中的有限信息,您不使用哈希表的原因听起来有效。如果实施得当,效率相当高。如果可以满足您的需要,它还可以具有不浪费存储重复字符串的内存的优点,如果可能存在重复字符串,则可以进一步减少内存消耗。

如果您对如何进行查找有创意,可以想象也可以在哈希表中存储每个字符串的压缩形式。字符串通常有多长?