初步学习位图算法
Posted ybossy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步学习位图算法相关的知识,希望对你有一定的参考价值。
最近 初步地学习了位图算法,现在我对于位图算法的理解是一种用空间来换取时间的算法。
例如 我们 要找寻一个数在不在指定的数据集合中,假定这个数据集合有40亿个整数数不重复且没有经过排序,我们需要使用循环语句把这40亿个数一个一个拉出来跟这个数进行比对,这样可行,但是很耗时间。位图算法是另外一个不耗多少时间的办法,位图算法先在初始化阶段先创建一个位图,位图使用40亿个 位来表示1到40亿的数的状态,用0表示不存在,用1表示不存在。然后再查询要求寻找的数,找到这个数在位图中的状态,1则表示该数在集合中。
这种办法用空间换取了时间,下面附上代码:
#include <stdio.h> #include <Windows.h> void init(char*data,size_t len){ //将所有是3的倍数的数给标记 for (unsigned int i = 0;i<=len*8;i++) { if (i % 3 == 0) { char* p = data + i / 8;//计算目的地数是第几个字节 *p = *p | (1 << (i % 8)); } } } bool check(char* data, size_t len, int number) { char* p = data + number / 8; return *p & (1 << (number % 8)); } int main(void) { int value; unsigned int n = 4000000000; size_t len = n / 8 + 1;//字节数 char* data = (char*)malloc(len); memset(data, len, 0); init(data, len); printf(" 请输入一个您想检测的数:"); scanf_s("%d", &value); if (check(data, len, value)) printf(" 是的!"); else printf(" 不是的!"); system("pause"); }
把所有是三的倍数的数设为集合中的数。
以上是关于初步学习位图算法的主要内容,如果未能解决你的问题,请参考以下文章