算法设计与分析1——位图算法

位图算法是一种数据结构,用于表示一组元素的集合,其中每个元素占据一个位或一个比特位。位图算法通常用于解决需要高效地判断元素是否存在的问题,尤其是在元素的取值范围较小且空间利用效率要求较高的情况下。

例如上图数字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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值