位图算法是一种数据结构,用于表示一组元素的集合,其中每个元素占据一个位或一个比特位。位图算法通常用于解决需要高效地判断元素是否存在的问题,尤其是在元素的取值范围较小且空间利用效率要求较高的情况下。
例如上图数字0到数字15,分别将每一个bit的存储单位分配到每个数字,如果每个存储单元上是数字1,则表示该数字是数据集合里的数字,反之,则不在数据集合里。
代码实现:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
void init(char *data, int len)
{
int n = len * 8;
for(int i = 0; i < n; i++){
if (i % 3 == 0) {
char *p = data + i / 8;
*p = *p | (1 << (i % 8));
}
}
}
bool check(char *data, int value)
{
char *p = data + value / 8;
bool ret = *p & (1 << (value % 8));
return ret;
}
int main()
{
char *data;
int n = 100000;
int len = n / 8 + 1;
data = (char *)malloc(len);
memset(data, 0, sizeof(char) * len);
init(data, len);
while(1){
int value;
cout << "请输入数字【输入-1退出】:";
cin >> value;
if(value == -1){
break;
}
// cout << check(data, value) << endl;
if(check(data, value)){
cout << value << "是数据集合里面的数据" << endl;
}else{
cout << value << "不是数据集合里面的数据" << endl;
}
}
system("pause");
return 0;
}
该算法的时间复杂性较低,仅在初始化过程中所用时间较多,为O(n),在数据查找过程中的时间复杂度为O(1)。