存储大量一位数据的最佳数据结构

时间:2011-05-09 09:54:17

标签: data-structures

我想存储大量数据,以便

  1. 可以通过索引访问它们
  2. 每个数据只是是和否(因此每个数据可能只有一位)
  3. 我正在寻找性能最高且占用空间最小的数据结构。

    可能将数据存储在平面存储器中,每个数据一位不是一个好选择另一方面使用不同类型的树结构仍然使用大量内存(例如,每个节点中的指针都需要制作这些树,即使每个节点只有一位数据。)

    有没有人有任何想法?

5 个答案:

答案 0 :(得分:3)

使用单个内存块并且每个字节存储1位(容易索引,但每字节浪费7位)或打包数据(稍微更棘手的索引,但内存效率更高)有什么问题)?

答案 1 :(得分:2)

在Java中,BitSet可能是一个不错的选择http://download.oracle.com/javase/6/docs/api/java/util/BitSet.html

答案 2 :(得分:1)

如果我正确理解你的问题,你应该将它们存储在无符号整数中,你可以将每个值分配给整数(标志)的位。

假设您代表3个值,它们可以打开或关闭。然后你将第一个分配给1,将第二个分配给2,将第三个分配给4.你的unsigned int可以是0,1,2,3,4,5,6或7,具体取决于打开或关闭的值,你检查使用按位比较的值。

答案 3 :(得分:1)

取决于语言以及如何定义'index'。如果您的意思是索引运算符必须工作,那么您的语言将需要能够重载索引运算符。如果您不介意使用索引宏或函数,则可以通过将给定索引除以类型中的位数来访问第n个元素(例如,对于char为8,对于uint32_t和变量为32),然后返回结果arr[n / n_bits] & (1 << (n % n_bits))

答案 4 :(得分:1)

查看布隆过滤器:http://en.wikipedia.org/wiki/Bloom_filter

表现非常好,节省空间。但请确保您阅读下面的细则;-):从上面的维基页面引用。

  

空Bloom过滤器是一个位数组   m位,全部设为0.必须   也是k个不同的哈希函数   定义,每个映射或散列   一些设置元素到m数组之一   具有均匀随机的位置   分配。要添加元素,请执行Feed   它对每个k哈希函数来说   获得k阵列位置。将位设置为   所有这些位置为1.查询   一个元素(测试它是否在   设置),将其提供给每个k哈希   获取k个数组位置的函数。如果   这些位置的任何位都是   0,元素不在集合中 - 如果   它是,然后所有的位都有   插入时设置为1。如果   所有都是1,然后要素是   在集合中,或已设置位   在插入其他时间为1   元素。设计要求   k个不同的独立散列函数   对于大k来说可能是禁止的。为一个   具有宽输出的良好散列函数,   如果有的话应该很少   不同之间的相关性   这样一个哈希的比特字段,所以这个   哈希类型可用于生成   多个“不同”的哈希函数   将其输出切换为多位   领域。或者,可以通过k   不同的初始值(例如0,   1,...,k - 1)到哈希函数   取初始值;或添加(或   将这些值附加到键上。对于   更大的m和/或k,独立性   哈希函数可以放宽   假阳性增加微不足道   率(Dillinger&amp; Manolios(2004a),   基尔希&amp; Mitzenmacher(2006))。   具体来说,Dillinger&amp; Manolios   (2004b)显示了有效性   使用增强的双​​重散列或   三重哈希,双重变体   散列,用于导出k个索引   两三个简单算术   用独立散列计算的索引   功能。从中删除元素   这个简单的Bloom过滤器是   不可能。元素映射到k   比特,虽然设置任何一个   这些k位到零就足够了   删除它,这有副作用   删除任何其他映射元素   到那一点,我们没有办法   确定是否有任何此类要素   已被添加。这种删除会   引入虚假的可能性   否定,这是不允许的。   从a。一次性删除元素   布隆过滤器可以模拟   有第二个Bloom过滤器   包含已删除的项目。   然而,第二个误报   过滤器成为假阴性   复合滤波器,不是   允许的。在这种方法重新添加   以前删除的项目不是   可能,因为必须删除   它来自“删除”过滤器。然而,   通常情况下所有的钥匙   可用,但价格昂贵   枚举(例如,需要很多   磁盘读取)。当假阳性   速率太高,过滤器可以   再生;这应该是一个   相对罕见的事件。