位图原理、代码实现及应用实例

位图的原理:

  • 在位图中采用比特位表示对应的元素存在或者不存在
    0:不存在
    1:存在
  • 例如一个int整数有32个比特位可以表示0-31个整数。

在这里插入图片描述

  • 再举一个例子
    存入的数字为8988
    首先: 8988/32 = 280
    其次: 8988%32 = 28

  • 再来一个例子
    存入的数字16
    首先: 16/32 = 0
    其次: 16%32=16

位图的应用

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集。

  • 将第一个文件的数据分成1000份存储到位图里,再判断第二份文件中的数据是否在位图中。

源码

  • 测试代码
#include <stdio.h>
#include "BitMap.h"int main()
{BitMap bm;BMInit(&bm,100000);int i, j;    // 插入数据for (i = 0; i < 100000; i++) {BMSetOne(&bm, i);}// 判断数字是否在位图里面for (j = 990; j < 100010; j++) {if (BMTestOne(&bm, j) != 0) {printf("数字 %d存在于位图, 返回值: %d\n", j, BMTestOne(&bm, j));} else {printf("数字 %d不存在于位图, 返回值: %d\n", j, BMTestOne(&bm, j));}}return 0;
}
  • 运行结果
数字 99993存在于位图, 返回值: 33554432
数字 99994存在于位图, 返回值: 67108864
数字 99995存在于位图, 返回值: 134217728
数字 99996存在于位图, 返回值: 268435456
数字 99997存在于位图, 返回值: 536870912
数字 99998存在于位图, 返回值: 1073741824
数字 99999存在于位图, 返回值: -2147483648
数字 100000不存在于位图, 返回值: 0
数字 100001不存在于位图, 返回值: 0
数字 100002不存在于位图, 返回值: 0
数字 100003不存在于位图, 返回值: 0
数字 100004不存在于位图, 返回值: 0
数字 100005不存在于位图, 返回值: 0
数字 100006不存在于位图, 返回值: 0
数字 100007不存在于位图, 返回值: 0
数字 100008不存在于位图, 返回值: 0
数字 100009不存在于位图, 返回值: 0

位图占用的空间大小
unsignedint 的取值范围是0到2^32-1=4 294 967 296-1(大约40亿)
申请了约2^32/8=512M的内存
源码

  • 优质参考:
    https://blog.csdn.net/tonglin12138/article/details/93382025

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过修改注册表,实现网页链接中的私有协议启用本地exe进程

私有协议为 coffeeclass://xxxxxx.mp4 注册表如下 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\coffeeclass] "coffeeClass Protocol" "URL Protocol"""[HKEY_CLASSES_ROOT\coffeeclass\DefaultIcon] "D:\\Program Files (x…

布隆过滤器的原理、应用场景和源码分析实现

原理 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组&#xff0c;长这样&#xff1a; 如果我们要映射一个值到布隆过滤器中&#xff0c;我们需要使用多个不同的哈希函数生成多个哈希值&#xff0c;并对每个生成的哈希值指向的 bit 位置 1。 例如针对值 “baid…

判断一个数字是否存在于某一个数据之中

哈希表 这个没啥说的&#xff0c;后面补充 位图 https://blog.csdn.net/csdn_kou/article/details/95337121 布隆过滤器 哈希表位图 https://blog.csdn.net/csdn_kou/article/details/95371085

根据语句自动生成正则表达式

自动生成 http://www.txt2re.com 速查手册 https://www.jb51.net/shouce/jquery/regexp.html

免密登录堡垒机和服务器

免密登录堡垒机 安装oathtool和sshpass 这两个文件安装比较耗费时间&#xff01; brew install oath-toolkit brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb免密登录堡垒机 书写shell脚本 #!/usr/bin/env bash …

mysql建表sql

mysql建表 文章目录mysql建表mysql学生表插入数据建表&#xff0c;学生和idgroup byinner joinmysql学生表 CREATE TABLE courses ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增id, student VARCHAR(255) DEFAULT NULL COMMENT 学生, class VARCHAR(255) DEFAU…

Effective C++学习第一天

1&#xff1a;区分C中的术语声明、定义、初始化的概念声明&#xff08;declaration&#xff09;&#xff1a;告诉编译器某个东西的名称和类型&#xff0c;但略去其他细节&#xff08;可以出现多次&#xff0c;编译器不分配内存&#xff09;。定义&#xff08;definition&#x…

Redis运维和开发学习笔记(1) Redis简介

文章目录Redis的特性速度快持久化多种数据结构主从复制高可用和分布式典型的应用场景Redis启动和可执行文件Redis可执行文件说明启动方式验证redisredis常用配置redis数据结构和内部编码Redis是单线程&#xff0c;不会同时执行两条命令哈希慢查询pipelineRedis的特性 速度快 …

Effective C++学习第二天

1&#xff1a;确保对象被使用前已先被初始化&#xff0c;读取未初始化的值会造成不明确的行为&#xff0c;可能导致程序终止运行或者其他不可预期的现象&#xff1b;在C中&#xff0c;当你使用C part of C(C中C语言部分的内容&#xff09;且初始化可能导致运行期成本&#xff0…

Redis运维和开发学习笔记(3)redis搭建集群

Redis运维和开发学习笔记(3)redis搭建集群 文章目录Redis运维和开发学习笔记(3)redis搭建集群Redis集群搭建Redis集群搭建 cp /etc/redis.d/redistest_7001.conf /etc/redis.d/redistest_XXXX.conf :%s/7001/xxxx/g 配置文件内容&#xff1a;cluster-enabled yes ############…

Effective C++学习第三天

1&#xff1a;为多态基类声明virtual析构函数当我们创建一个base class指针指向新生成的derived class时&#xff0c;当删除基类指针时&#xff0c;如果base class是一个non-virtual析构函数时&#xff0c;实际执行的结果通常是derived class中的base成分被销毁&#xff0c;der…

linux创建指定大小的文件

一、生成文件大小和实际占空间大小一样的文件 dd if/dev/zero ofname.file bs1M count1 文件名称name.file bs1M表示每一次读写1M数据&#xff0c;count50表示读写 50次&#xff0c;这样就指定了生成文件的大小为50M。 二、生成文件大小固定&#xff0c;但实际不占空间命令 …

Effective C++学习第四天

条款11&#xff1a;在operator中处理自我赋值的现象虽然我们在平时可能不会出现显示自我赋值的现象&#xff0c;当加入指针或者引用时&#xff0c;可能会出现不同的指针或引用指向同一对象&#xff08;对象的不同别名&#xff09;&#xff0c;这时候我们就得考虑对象是否是同一…

Effective C++学习第五天

条款14&#xff1a;在资源管理类中小心copy行为当我们深入理解“资源取得时机是初始化时机&#xff08;RAII&#xff09;”概念&#xff0c;并以此作为“资源管理类”的核心时&#xff0c;我们可能会遇到将RAII对象复制的情况&#xff0c;一般有两种情况处理这个现象&#xff1…

Redis运维和开发学习笔记(2) redis持久化

Redis运维和开发学习笔记(2) redis持久化 文章目录Redis运维和开发学习笔记(2) redis持久化持久化持久化方式一:RDB触发~~的三种~~方式1. save命令2. bgsave配置触发机制RDB 总结持久化方式二:AOFAOF的三种策略三种策略的优缺点AOF重写机制持久化 redis将所有数据保存在内存中&…

Effective C++学习第六天

条款18&#xff1a;让接口更容易被正确使用&#xff0c;不易被误用设计接口的原则&#xff1a;正确性、高效性、封装性、维护性、延展性以及协议的一致性&#xff1b;设计原则&#xff1a;1&#xff09;导入新类型来预防很多客户端的错误&#xff0c;多使用系统类型&#xff08…

Redis运维和开发学习笔记(4) Redis参数意义

Redis运维和开发学习笔记(4) Redis参数意义 文章目录Redis运维和开发学习笔记(4) Redis参数意义参数意义参数意义 Client连接 问题 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++学习第七天

条款23&#xff1a;宁以non-memeber、non-friend替换member函数non-member/non-friend可以给对象带来更大的封装性&#xff0c;从两个方面来考虑&#xff1a;1&#xff09;考虑封装&#xff0c;越多东西被封装&#xff0c;它们就越不可见&#xff0c;就越少人看到它&#xff0c…

Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据读写分离 存在的问题&#xff1a; 手动干预切主等操作主节点的写能力受到单机限制主节点的存储能力受到单机限制 主从模式的故障恢复 当主节点发生故障时&am…

Effective C++学习第八天

条款26&#xff1a;尽可能延后变量定义式的出现时间当你定义了一个变量&#xff0c;如果在使用变量之前出现异常&#xff0c;那么你得承受一次构造成本和析构成本&#xff0c;而且你没有使用该变量&#xff1b;本条款给出的建议是延迟变量的定义&#xff0c;直到非得使用该变量…