【问题标题】:What is the most space efficient way to store a mapping from string to integer存储从字符串到整数的映射的最节省空间的方法是什么
【发布时间】:2013-11-18 21:54:06
【问题描述】:

基本上我需要在内存中存储一​​组字符串,并且能够获取与一个字符串关联的唯一整数以及与一个整数关联的字符串。

所以看起来我需要一些实现 Map 以及 Map 的东西,但只要它们是唯一的,我就不需要确定整数。

我正在考虑的一个选项是存储一个 Trie,其中叶节点包含整数和一个指向叶节点的指针数组,按整数值排序。

是否有更紧凑的方式将其存储在内存中,同时仍具有良好的检索性能?

【问题讨论】:

  • 你能更好地解释一下“我不需要决定整数,只要它们是唯一的”是什么意思
  • 当我向字典中添加新字符串时,可以为我生成整数,就像数据库生成主键一样。 API 的客户端在添加新字符串时不需要提供自己的整数。
  • 您应该查看 HAT-trie。 HAT-trie 是一种 Burst trie(对于存储叶节点非常有效),设计为具有缓存意识。请参阅此 pdf:crpit.com/confpapers/CRPITV62Askitis.pdf 另外,可能重复:stackoverflow.com/questions/3986158/…

标签: performance optimization data-structures compression


【解决方案1】:

这只是一个简单的想法,但是 trie-to-reverse-trie 映射呢?

地图:

a   = 5
and = 51
ant = 52
as  = 53
after = 54

你的字符串尝试:

        a
      / | \
     n  s  f
    / \    |
   d   t   t
           |
           e
           |
           r

你的整数树:

       5
    / / \ \
   1  2  3  4

现在,您在每个 trie 中保留一个来自“单词”节点的指针,以在两种表示中相互指向。

所以...例如字符串 trie 中的节点 'r' 指向整数 trie 中的节点 '4',反之亦然。

a <-> 5 (root)
d <-> 1
t <-> 2
s <-> 3
r <-> 4

所以,如果你想从字符串中获取整数;您将搜索字符串 trie,直到到达代表该单词的节点。现在,跟随指向表示整数最后一位的节点的指针。您从该节点转到根节点,这将为您提供整数的每个数字(反向)。

要反转整数,您实际上只需跟踪必须跟随父指针的次数。

假设您的整数树中有这样的链接:(例如 integer=14235)

5->3->2->4->1->root

你会保留一个高度和结果变量:

current=5; height=1;          result=5 
current=3; height*=10==10;    result+=(current*height)==35
current=2; height*=10==100;   result+=(current*height)==235
current=4; height*=10==1000;  result+=(current*height)==4235
current=1; height*=10==10000; result+=(current*height)==14235

如果您可以将整数 trie 中的分支因子降低到

显然,您可以对整数到字符串执行相反的操作......

只是一个短暂的想法。此外,使用“compact trie”会更好,但我使用传统的 trie 作为示例。

【讨论】:

【解决方案2】:

由于您没有指定除查找以外的任何其他功能,因此您可以使用无序映射(hashmap)来存储两者

如果你控制唯一的整数:那么让它从0开始连续,那么你可以用一个简单的数组(向量)替换int到字符串查找

hash 和 vector 都具有很好的局部性 - 用 trie 很难击败它。

【讨论】:

  • 这会起作用,但会比 Trie 占用更多空间,因为它必须存储所有字符串
  • @skyde 因为您可以拥有一个字符串数组(int 到 string)和一个未排序的映射(string 到 int),如果包含所有要添加的指针,它可能会占用更少的内存并且您的数组可以是指向与哈希键相同的字符串的指针
猜你喜欢
  • 2013-03-24
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
相关资源
最近更新 更多