Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >位图算法

位图算法

作者头像
半生瓜的blog
发布于 2023-05-12 13:40:22
发布于 2023-05-12 13:40:22
35100
代码可运行
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog
运行总次数:0
代码可运行

位图算法

已空间换时间

很多不重复的整数,其中最大值不超过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

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分
之前我们已经在这篇文章中 【C++高阶】哈希函数底层原理全面探索和深度解析-CSDN博客
IsLand1314
2024/10/15
1530
【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分
数据结构面试题之位图查找
  有的人一看到这个题,很简单嘛最麻烦的就是从头遍历一遍的事情嘛. 不过要看清楚题! 40亿个无符号整数. 我们生活中1G内存占用的字节数1024*1024*1024为1073741824个字节.粗略就是10亿个字节. 而40亿个无符号整数是160亿个字节. 也就是这些数据存储下来需要16G的内存. 那么问题来了,普通的工作电脑的内存都4G,好点的就是8G. (如果你是16G内存光速吃鸡那么当我没说)我们可以发现这些数据的内存大于电脑的内存所以存储不下. 这个时候就很头大了,内存都存不下那么你怎么读取呢? 当然你说你直接去硬盘里面读.好! 没问题.从硬盘里面读取数据的速度和从内存中读取的速度根本没得比的.如果你的时间多也可以.不过我们有一个更厉害的方法就是我们的位图.位图就是给定一段连续的空间然后让这个空间的每一位都为0,再然后让每一个位表示一个数字.再然后当你这个数字出现的 时候将它对应的那个位->置为1.这样的话存储40亿个数据,也就是存储40亿个位.也就是5亿个字节.大概512MB的样子. 这样的话我们的内存存储这些数据也就是绰绰有余了.所以位图对于大数据的问题有着显著的效果。
全栈程序员站长
2022/07/18
3640
【C++】位图应用 | 布隆过滤器
给40亿个不重复的无符号整数,没排过序,给一个无符号整数,如何快速判断一个数是否在这40亿个数中
lovevivi
2023/10/17
2000
【C++】位图应用 | 布隆过滤器
哈希的应用——位图
所以上面这些思路都不太合适,而且我们这里只是要判断在不在,其实没必要把它们全部存起来。
YIN_尹
2024/01/23
1760
哈希的应用——位图
【C++】哈希应用:位图 哈希切分 布隆过滤器
1. 大厂经典的面试题,给你40亿个不重复的无符号整数,让你快速判断一个数是否在这40亿个数中,最直接的思路就是遍历这40亿个整数,逐一进行比对,当然这种方式可以倒是可以,但是效率未免太低了。 另一种方式就是排序+二分的查找,因为二分查找的效率还是比较高的,logN的时间复杂度,但是磁盘上面无法进行排序,排序要支持下标的随机访问,这40亿个整数又无法加载到内存里面,你怎么进行排序呢?所以这样的方式也是不可行的。 那能不能用红黑树或者哈希表呢?红黑树查找的效率是logN,哈希表可以直接映射,查找的效率接近常数次,虽然他们查找的效率确实很快,但是40亿个整数,那就是160亿字节,10亿字节是1GB,16GB字节红黑树和哈希表怎么能存的下呢?这还没有算红黑树的三叉链结构,每个结点有三个指针,而且哈希表每个结点会有一个next指针,算上这些的话需要的内存会更大,所以用红黑树或哈希表也是无法解决问题的。
举杯邀明月
2023/04/12
6200
【C++】哈希应用:位图 哈希切分 布隆过滤器
C++ 哈希的应用【位图】
位图(bitset)是一种特殊的数据结构,仅仅依靠 0、1 表示当前位置是否有数据存在,常用于对查找速度和存储空间有着高要求的场景中,除此之外,位图还可以配合宏定义,实现同时传递多个参数,比如系统调用 open,其中的参数2(打开方式)就是一个简单的位图结构
北 海
2023/07/28
3130
C++ 哈希的应用【位图】
C++语法中bitset位图介绍及模拟实现
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。
芯动大师
2023/10/14
2680
C++语法中bitset位图介绍及模拟实现
✅上亿数据,限制1G内存,如何去重?
有许多方法可以用来去重,比如使用列表、集合等等,但这些方法通常只适用于一般情况。然而,当涉及到大量数据去重时,常见的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就显得不太合适了。在处理大量数据的需求场景下,我们不得不提及 BitMap。
@派大星
2024/03/04
4280
C++:位图和布隆过滤器
问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】
小陈在拼命
2024/05/10
1130
C++:位图和布隆过滤器
C++哈希应用-位图/布隆过滤器/海量数据处理
C++位图/布隆过滤器/海量数据处理 零、前言 一、位图 1、位图概念 2、位图接口的介绍以及实现 3、位图的应用 二、布隆过滤器 1、布隆过滤器概念和介绍 2、布隆过滤器的操作及实现 3、布隆过滤器的分析 三、海量数据处理 零、前言 本章主要讲解C++中对哈希的应用有关方面的内容,位图,布隆,海量数据处理 一、位图 1、位图概念 位图概念: 位图其实就是哈希的变形,同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记 通过一个比特位来标记这个数据是否存在,1代表存在,0代表不
用户9645905
2022/11/30
5330
C++哈希应用-位图/布隆过滤器/海量数据处理
【数据结构进阶】位图
在计算机科学中,高效地存储和操作数据是永恒的追求。面对海量数据,传统的存储方式往往显得笨拙而低效,因此,位图作为一种简洁而强大的数据结构,应运而生。它将数据的存在与否抽象为二进制的0和1,利用比特位的排列组合,巧妙地实现了对数据的压缩存储和快速检索。从图像处理到数据库索引,从网络爬虫到布隆过滤器,位图的身影无处不在。本文将带你走进位图的世界,探索其精妙的设计思想和广泛的应用场景。
ephemerals__
2025/03/23
990
【数据结构进阶】位图
极致高效的数据处理:位图、布隆过滤器与哈希切分的奇妙之旅
本文将带领你深入探索哈希的三大高效应用——位图、布隆过滤器和哈希切分。它们如同精巧的齿轮,共同驱动着现代计算系统的高效运作。从减少存储空间到加速查找效率,从数据去重到流式处理,这些技术在幕后悄然发挥着巨大的力量。让我们一起揭开哈希算法的神秘面纱,领略数据处理的艺术之美。
suye
2024/11/19
1600
极致高效的数据处理:位图、布隆过滤器与哈希切分的奇妙之旅
C++:哈希拓展-位图
第二种方法就是先排序+二分查找:肯呢个有些人会觉得,排序的代价太大了;其实不然,我们只需要排序一次那么接下来的查找就好办了; 对于二分查找,效率是O(logn),根据2^10=1024,那2^30的数量级就是10^9,就已经上升到亿了,2^32大约就是40亿;所以我们使用二分在40亿个数中查找一个数最多只需要查找32次就可以了,效率是相当客观的;
啊QQQQQ
2024/11/19
480
C++:哈希拓展-位图
【C++从小白到大牛】位图讲解
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】
用户11316056
2024/10/16
980
【C++从小白到大牛】位图讲解
关于位域如何节省内存(C++)
         位域:  最先使用在c语言中后来C++继承了这一优良的特点。          举个栗子:     int  -->  4字节   2^32位 ,如果我们只需要其表达一个0~16的数字,              使用一个int就显得稍稍有些许浪费,所以我们这里就可以使用到位域0~16  --> 2^1 ~ 2^5               我们就可以这样来声明了:      int   sudo: 5; 就可以了!  1 /* 2 设计一个结构体存储学生的成绩信息, 3
Gxjun
2018/03/26
7990
C/C++练习题(一)
(分析:第一个坑:运算符优先级,+的优先级大于>>;第二个坑:当小类型变量和整型做运算的时候,会转化为int类型。
Daotin
2018/08/31
1.4K0
【C++修炼之路】24.哈希应用--位图
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。
每天都要进步呀
2023/03/28
2640
【C++修炼之路】24.哈希应用--位图
MD5加密概述,原理及实现
MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。
全栈程序员站长
2022/09/15
3K0
数据结构--位图 BitMap
我们有1千万个整数,整数的范围在1到1亿之间。如何快速查找某个整数是否在这1千万个整数中呢?
Michael阿明
2021/02/20
2.1K0
数据结构--位图 BitMap
面试官问:BitMap了解么?
来自:https://www.cnblogs.com/cjsblog/p/11613708.html
良月柒
2020/12/18
7350
面试官问:BitMap了解么?
相关推荐
【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档