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

Performance 存储从字符串到整数的映射最节省空间的方法是什么,performance,optimization,data-structures,compression,Performance,Optimization,Data Structures,Compression,基本上,我需要在内存中存储一组字符串,并能够获得与一个字符串关联的唯一整数和与一个整数关联的字符串 看起来我需要实现Map和Map的东西,但我不需要决定整数,只要它们是唯一的 我想做的一个选择是存储一个Trie,其中叶节点包含整数和一个按整数值排序的指向叶节点的指针数组 有没有一种更紧凑的方法可以在保持良好检索性能的同时将其存储在内存中?由于您没有指定除查找之外的任何其他函数,因此可以使用无序映射(hashmap)来存储这两个函数 如果控制唯一整数:然后使其从0开始连续,则可以使用简单数组(向量

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

看起来我需要实现Map和Map的东西,但我不需要决定整数,只要它们是唯一的

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


有没有一种更紧凑的方法可以在保持良好检索性能的同时将其存储在内存中?

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

如果控制唯一整数:然后使其从0开始连续,则可以使用简单数组(向量)替换int-to-string查找


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

这只是一个暂时的想法,但是用trie来反转trie映射呢

地图:

您的字符串trie:

        a
      / | \
     n  s  f
    / \    |
   d   t   t
           |
           e
           |
           r
您的整数trie:

       5
    / / \ \
   1  2  3  4
现在,从每个trie中的“word”节点保留一个指针,以在两种表示中指向彼此

所以。。。e、 g.字符串trie中的节点“r”指向整数trie中的节点“4”,反之亦然

a <-> 5 (root)
d <-> 1
t <-> 2
s <-> 3
r <-> 4
您将保留高度和结果变量:

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更多的空间,因为它必须存储所有string@skyde因为您可以拥有字符串数组(int-to-string)和未排序映射(string-to-int)如果包含所有要添加的指针,并且数组可以是指向哈希键所在字符串的指针,那么可能会占用更少的内存。您可以更好地解释“只要整数是唯一的,我就不需要决定整数”的含义吗?当我向字典添加新字符串时,可以为我生成整数,与数据库生成主键的方式相同。添加新字符串时,API的客户端不需要提供自己的整数。您应该查看HAT-trie。HAT-trie是一种突发trie(对于存储叶节点来说是有效的),设计为具有缓存意识。请参见此pdf:crpit.com/confpapers/CRPITV62Askitis.pdf,也可能重复:使用有限状态传感器似乎更节省空间,请参见
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