位图算法

位图算法利用位的0和1状态存储数据,适用于判断数据是否存在。本文介绍了如何在Go语言中实现位图,包括创建位图、设置数据和检查数据存在性。通过直接用整数作为数组索引,避免了哈希运算,提高了查找效率。
摘要由CSDN通过智能技术生成

     计算机里面,最基本的单元就是位(bit),在java中一个byte= 8bit ,位图算法实际就是通过bit来存储,判断数据。

     位图算法实际就是通过计算bit的位置来计算数据是否存在。 因为bit只有0和1两重值,所以使用位图时只能判断数据是否存在之类的判断,无法计算数据存在的实际次数。

 

    在int范围类的一组int数据,如果需要判断数字是否重复, 常规的做法就是使用set集合来判断。在java中的hashSet的实现当中,通过将int值做hash运算,计算出数组的index,通过index在数组中查找数据,然后判断数据是否存在。 

   但是在位图算法中,是不需要做hash运算的, 直接将Int作为数组的index,查找当前index下的值为0,还是1 。 在java中,实际无法直接使用bit类型,只能通过使用其他类型来间接使用到bit。那么做数据设置,查找时,需要做部分转换才能实现。

   编写的一个go语言实现版本:

package bitMap

import (
    "sync"
)
var lock sync.RWMutex

type BitMap struct {
    data *[]uint64
    max  uint32
}

func NewBigMap(max uint32) *BitMap {
    bm := BitMap{}
    length := max / 64
    if max%64 > 0 {
        length++
    }

下面是一个使用C语言实现位图算法的简单示例: ```c #include <stdio.h> #include <stdlib.h> #define BITMAP_SIZE 32 // 设置位图中指定位置的位为1 void setBit(unsigned int* bitmap, int pos) { int index = pos / 32; int offset = pos % 32; bitmap[index] |= (1u << offset); } // 设置位图中指定位置的位为0 void clearBit(unsigned int* bitmap, int pos) { int index = pos / 32; int offset = pos % 32; bitmap[index] &= ~(1u << offset); } // 检查位图中指定位置的位是否为1 int checkBit(unsigned int* bitmap, int pos) { int index = pos / 32; int offset = pos % 32; return (bitmap[index] & (1u << offset)) != 0; } int main() { // 创建一个位图数组,大小为BITMAP_SIZE个无符号整数 unsigned int* bitmap = (unsigned int*)malloc(sizeof(unsigned int) * BITMAP_SIZE); // 初始化位图,将所有位都设置为0 for (int i = 0; i < BITMAP_SIZE; i++) { bitmap[i] = 0; } // 设置第5、10和15位置的位为1 setBit(bitmap, 5); setBit(bitmap, 10); setBit(bitmap, 15); // 检查第5和20位置的位是否为1 if (checkBit(bitmap, 5)) { printf("Bit at position 5 is set.\n"); } else { printf("Bit at position 5 is not set.\n"); } if (checkBit(bitmap, 20)) { printf("Bit at position 20 is set.\n"); } else { printf("Bit at position 20 is not set.\n"); } // 清除第10位置的位 clearBit(bitmap, 10); // 检查第10位置的位是否为1 if (checkBit(bitmap, 10)) { printf("Bit at position 10 is set.\n"); } else { printf("Bit at position 10 is not set.\n"); } free(bitmap); return 0; } ``` 这个示例中,我们定义了`BITMAP_SIZE`为32,表示位图的大小为32个无符号整数。然后,我们使用`setBit`函数设置位图中指定位置的位为1,使用`clearBit`函数清除位图中指定位置的位为0,使用`checkBit`函数检查位图中指定位置的位是否为1。最后,我们通过一些示例操作来演示位图的使用。 请注意,这只是一个简单的示例,实际应用中可能需要更复杂的位图算法来满足具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值