码迷,mamicode.com
首页 > 编程语言 > 详细

初步学习位图算法

时间:2020-03-30 12:52:33      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:windows   set   class   lse   scanf   col   color   初始   现在   

最近 初步地学习了位图算法,现在我对于位图算法的理解是一种用空间来换取时间的算法。

例如  我们 要找寻一个数在不在指定的数据集合中,假定这个数据集合有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("\n请输入一个您想检测的数:");
    scanf_s("%d", &value);
    if (check(data, len, value))
        printf("\n是的!");
    else
        printf("\n不是的!");
    system("pause");
}

把所有是三的倍数的数设为集合中的数。

初步学习位图算法

标签:windows   set   class   lse   scanf   col   color   初始   现在   

原文地址:https://www.cnblogs.com/Ybossy/p/12597623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!