初步学习位图算法

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");
}

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

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

机器学习Sklearn的k近邻算法api初步使用

将位图从片段保存到内部/外部存储[关闭]

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)

用LSTM分类 MNIST

合并两个位图的问题

k近邻算法api初步使用