【发布时间】:2010-11-16 15:55:39
【问题描述】:
我已经使用新手手册中的位数组做了一个示例。我想知道它们可以用来做什么以及它们有哪些常见的数据结构(假设“数组”是相当松散的术语。)
谢谢。
【问题讨论】:
-
你在说什么语言?
-
特别是 C++,或者可能是 D.
我已经使用新手手册中的位数组做了一个示例。我想知道它们可以用来做什么以及它们有哪些常见的数据结构(假设“数组”是相当松散的术语。)
谢谢。
【问题讨论】:
在Bit array 维基百科文章的Applications 部分列出了几个:
由于其紧凑性,位阵列在空间或效率非常重要的领域有许多应用。最常见的是,它们用于表示一组简单的布尔标志或布尔值的有序序列。
我们在上面提到位数组用于优先级队列,其中索引 k 处的位被设置当且仅当 k 在队列中;例如,Linux 内核就使用了这种数据结构,并且从硬件中的 find-first-zero 操作中受益匪浅。
位数组可用于分配内存页、inode、磁盘扇区等。在这种情况下,可以使用术语位图。但是,该术语经常用于指代光栅图像,每个像素可能使用多个位。
位数组的另一个应用是布隆过滤器,它是一种概率集合数据结构,可以在小空间中存储大集合,以换取小的错误概率。也可以基于接受误报或误报的位数组构建概率哈希表。
位数组及其上的操作对于构建简洁的数据结构也很重要,它使用的空间接近于最小的可能空间。在这种情况下,诸如找到第 n 个 1 位或计算直到某个位置的 1 位的数量等操作变得很重要。
位数组也是检查压缩数据流的有用抽象,这些压缩数据流通常包含占据部分字节或未按字节对齐的元素。例如,单个 8 位字符的压缩霍夫曼编码表示可以是 1 到 255 位长。
在信息检索中,位数组是非常频繁的术语发布列表的良好表示。如果我们计算严格递增整数列表中相邻值之间的间隙并使用一元编码对它们进行编码,则结果是一个位数组,当且仅当 n 在列表中时,第 n 个位置具有 1 位。 n 间隙的隐含概率是 1/2n。这也是参数 M 为 1 的哥伦布编码的特例;此参数通常仅在 -log(2-p)/log(1-p) ≤ 1 时选择,或者大致上该术语出现在至少 38% 的文档中。
【讨论】: