位图算法--速度

Posted Respect@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位图算法--速度相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

问题:
有很多不重复的整数, 其中最大值不超过40亿, 最小值是0.
要求判断某个指定的整数, 是否在这个集合中.

一、位图算法

使用2个字节,表示16个数(0-15)的状态(有或者没有)

如果数据为【5,1,7,15,0,4,6,10】,则存储状态为:

二、使用步骤

1.demo

#include <stdio.h>
#include <Windows.h>

void init(char *data, int len) 
	// 根据实际需求来实现.
	// 这里只是为了测试后面的算法效果, 假设:
	// 能够被3整数的数, 都在这个集合中.[假设的需求]
	
	unsigned int n = len * 8; //一共有n个数据
	for (unsigned int i = 0; i < n; i++) 
		// 假设: 能够被3整数的数, 都在这个集合中.[假设的需求]
		if (i % 3 == 0) 
			//计算这个位对应哪个字节
			char  *p = data + i / 8;
			*p = *p | (1 << (i % 8));
		
	


// 位图算法
bool check(char *data, int len, int value) 
	// 定位到指定的字节
	char *p = data + value / 8; 

	// 判断这个字节中指定的位是否为1
	bool ret =  *p  & (1 << (value % 8));

	return ret;


int main(void) 
	// 很配一块足够的内存, 用来表示位图
	unsigned int n = 4000000000;
	int len = n / 8 + 1;
	char *data = (char*)malloc(len);
	memset(data, 0, len); //清零

	// 装载数据集合(只需要装载一次)
	init(data, len);

	while (1) 
		printf("请输入要检测的数: [输入-1退出] ");
		int value;
		scanf_s("%d", &value);
		if (value == -1) 
			break;
		

		if (check(data, len, value)) 
			printf("%d在数据集合中\\n", value);
		
		else 
			printf("%d不在数据集合中\\n", value);
		
	

	system("pause");
	return 0;

以上是关于位图算法--速度的主要内容,如果未能解决你的问题,请参考以下文章

位图数据结构

位图数据结构

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度

初步学习位图算法

位图算法及其应用

这些缩放算法有啥区别?