【算法】位图算法

简介: 【算法】位图算法

我的小站——半生瓜のblog

位图算法

已空间换时间

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

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

上面为表示的数,下面为该数的个数。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

例如:要表示1,13,4,5,6

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0

要表示40亿个数

4000000000/8 = 500000000字节

500000000字节/1024= 488281K

488281k/1024 = 476.837M

单位换算

1字节== 8比特位

1K == 1024字节

1M == 1024K

代码实现

#include<iostream>
using namespace std;
//初始化容器内容
void init(char* data, int len)
{
    unsigned int tempN = len * 8;//40亿个数——40亿个位
    
    //假定需求:这个容器中存的是40亿以前能被3整数的数
    //就将他对应的比特位改成1(默认是0——memset())
    for (unsigned int i = 0; i < tempN; i++)
    {
        if (i % 3 == 0)
        {
            //找到这个数对应的字节
            char* p = data + (i / 8);
            //找到对应的位,并且将对应的位改成1
            *p = *p | (1 << (i % 8));//解释如下:
            /*
                如何将这个数对应的位(在比特位中的第几位数)改成1?


                对1进行左移操作,这个数 % 8等于多少
                (就是该数与该字节的最右侧中间间隔了几个位),
                1就左移几位,


                然后和这个字节进行按位或操作,例如

                i = 12;
                //上面是对应的数,下面是对应比特位的数
                15 14 13 12 11 10 9 8
                0  0  0  0  0  0  0 0 
                与   1 << (i % 8)  进行按位或操作
                0  0  0  1  0  0  0 0
                得到
                15 14 13 12 11 10 9 8
                0  0  0  1  0  0  0 0
                
            */
        }
    }
}

//位图算法实现
bool check(char* data,int len,int value)
{
    //找到对应的字节
    char* p = data + value / 8;
    //找到对应的位,并判断是否存在
    bool ret = *p & (1 << (value % 8));//解释如下
    /*
        对1进行的左移操作同上
        然后将这个所在的字节与1左移后的值,进行按位与
        1 & 1 = 1
        1 & 0 = 0
        0 & 0 = 0
        0 &1 = 0;
        
    */
    return ret;
}
int main(void)
{
    unsigned int n = 4000000000;//这个40亿代表40个数(80亿个比特位)
    int len = n / 8 + 1;//40亿个数对应的字节个数
    char* data = new char[len];//创建对应字节个数这么大的一个数组(容器)
    memset(data, 0, len);//容器清0
    init(data, len);//往容器中存数据
    int a = 0;
    //输入测试
    while (1)
    {
        cout << "请输入你要查找的数" << endl;
        cin >> a;
        if (a == -1)
        {
            break;
        }
        if (check(data, len, a))
        {
            cout << a << "被找到啦" << endl;
        }
        else
        {
            cout << a << "找不到" << endl;
        }
        
    }

    return 0;
}
相关文章
|
8月前
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
136 0
|
存储 人工智能 算法
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
97 0
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
|
缓存 算法 安全
位图算法(BitMap)
位图算法(BitMap)
233 0
|
存储 数据采集 缓存
数据结构与算法必知--- Bitmap位图与布隆过滤器
数据结构与算法必知--- Bitmap位图与布隆过滤器
|
存储 算法 搜索推荐
【算法思想】位图排序算法
问题的提出 一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序? 常规思想 我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据。
1225 0
|
8天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
21天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
156 80
|
9天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
9天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
7天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。