将特殊purpoes-strings转换为Integers的方法

时间:2018-06-04 08:10:53

标签: c algorithm data-structures hash

我需要一个Key-Value对的内存数据结构(400 MB的数据)。我对密钥有以下约束:

  1. 键和值都是长度为256和1024的文本字符串 分别
  2. 任何键通常看起来像k1k2k3k4k5,每个k(i)本身是4-8字节的字符串。某些k(i)可能存在或不存在于按键中。
  3. 每个k(i)有6-8种可能性。但是k3和k4有256000种可能性。
  4. 可以使用prefix_key迭代DS。 DS应针对此操作进行优化。该操作分配一个迭代器,即迭代整个DS并返回与prefix_key匹配的键值列表(例如" k1k2k3。*",k(i)如上定义)。每次迭代都迭代这个迭代器(列表)。释放迭代器会释放列表。
  5. 使用DS获取字符串键会使密钥比较过于昂贵。因此,DS(Hash,B + Tree)的某些选项被排除在外。

    我的问题是我们如何创造性地将String键转换为整数键?解决方案需要具有以下属性:

    对于关键模式" k1k2k3。*"它应该对整数的上限和下限进行生成,以便根据这些边界在DS中查找少量条目。

    我在solution towards this

    的背景下提出这个问题

1 个答案:

答案 0 :(得分:3)

每个k(i)有6-8种可能性。然而,k3和k4有256000种可能性。

如果你可以在k1 k2 k3 k4 k5中拆分键,你可以这样编码:

 3 bits for k1  
 3 bits for k2  
18 bits for k3  
18 bits for k4  
 3 bits for k5

这使得45位。 因此,您可以将键缩小为0到2 ^ 45-1之间的整数。 如果你只使用k3和k4的一些可能值,这种接缝就会很多。

所以我将k1 k2的6位用于精确映射到索引,而不是取决于k3 k4的密集程度,k3和k4的某种树结构以及再次精确映射到k5的索引