什么是存储从字符串到整数的映射的最节省空间的方法

时间:2013-11-18 21:54:06

标签: performance optimization data-structures compression

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

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

我想要做的一个选项是存储Trie,其中叶节点包含整数,并且指向叶节点的指针数组按整数值排序。

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

2 个答案:

答案 0 :(得分:0)

因为除了lookup之外你没有指定任何其他函数,你可以使用无序映射(hashmap)来存储它们

如果您控制唯一整数:然后从0开始连续,那么您可以用简单数组(向量)将int替换为字符串查找

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

答案 1 :(得分:0)

这只是一个过时的想法,但是对于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中“word”节点的指针在两个表示中相互指向。

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

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

所以,如果你想从字符串中获取整数;你会搜索字符串trie,直到你到达代表该单词的节点。现在,在指向表示整数最后一位数的节点之后。你从那个节点到根节点,它将给你整数的每个数字(反过来)。

要反转整数,您基本上只需跟踪您必须遵循父指针的次数。

假设你在整数trie中有这样的链接:(例如整数= 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中将分支因子保持在&lt; = 9,你只需要在整数trie的每个节点中存储一个字节(在指针之外)。

显然,你可以对整数到字符串做反向....

只是一个想法。此外,使用“紧凑的特里”会更好,但我使用传统的特里为例。