开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情
Bitmap
在计算机科学中,Bitmap是一种数据结构,用于表示一个集合,其中每个元素被映射到一个位或一个数组的单元,而该单元可以设置或清除,以表示元素是否属于该集合。
Bitmap的应用范围非常广泛,例如在搜索引擎的索引和查询处理中,用于快速定位和匹配关键字;在数据库中,用于索引和快速查找数据;在网络协议中,用于网络流量监控和过滤;在算法和计算机科学中,用于快速排序、排重和计算问题等。
在Bitmap数据结构中,每个元素通常表示一个非负整数,该整数可以作为索引,映射到一个位或数组单元上。如果该元素属于该集合,则该位被设置为1,否则被清除为0。这种表示方法允许快速判断某个元素是否在集合中,只需检查对应的位或数组单元即可。
Bitmap数据结构在空间利用方面非常高效,因为每个元素只需要占用一个位或数组单元,因此对于大型数据集合,可以显著减少存储空间的使用。同时,由于位操作和数组操作是计算机中最基本和最快的操作之一,因此Bitmap数据结构在性能方面也具有很高的优势。
代码实现
type Bitmap struct {
bits []byte
size int
}
func NewBitmap(size int) *Bitmap {
n := (size + 7) / 8
return &Bitmap{make([]byte, n), size}
}
func (b *Bitmap) SetBit(i int) {
if i < 0 || i >= b.size {
return
}
index := i / 8
bit := uint(i % 8)
b.bits[index] |= 1 << bit
}
func (b *Bitmap) ClearBit(i int) {
if i < 0 || i >= b.size {
return
}
index := i / 8
bit := uint(i % 8)
b.bits[index] &= ^(1 << bit)
}
func (b *Bitmap) GetBit(i int) bool {
if i < 0 || i >= b.size {
return false
}
index := i / 8
bit := uint(i % 8)
return b.bits[index]&(1<<bit) != 0
}
func main() {
bitmap := NewBitmap(16)
bitmap.SetBit(0)
bitmap.SetBit(1)
bitmap.SetBit(3)
bitmap.ClearBit(1)
for i := 0; i < 16; i++ {
fmt.Printf("%v \n", bitmap.GetBit(i))
}
}
1个byte(字节)等于8个bit(比特),因此对于长度为n的bitmap,使用n/8长度的byte数组即可存储。
- SetBit:将某一位置1
- ClearBit:将某一位置0
- GetBit:判断某一位是否为1