C++(面试题):给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中

40亿个数中找一个数?1GB内存足够,这个算法绝了! 在处理40亿个不重复的unsigned int整数时,传统方法如哈希表或排序搜索在内存和时间效率上难以满足1GB内存限制。位图算法(Bit Map)通过使用1位(bit)来表示每个数的存在性,仅需512MB内存即可实现O(1)时间复杂度的查询。该算法将42.9亿个可能值映射到位图中,每个值对应一个位,存在则置1,不存在则置0。通过将位图分组为字节抽屉,可以快速定位和查询特定数。位图算法通过数据填充、位图构建和快速查询三个步骤,高效解决了大数据处理中的内存和时间限制问题。 阅读详情
给40亿个不重复的无符号整数,没排过序,给你一个无符号整数,如何快速判断这个数是否在这40亿个数中?

首先看到这个题第一个想到的就是遍历一遍,看这个数在不在。但是这样的时间复杂度太高了O(N),数据量太大,因此该方法不行。

其次我们想到排序,利用二分查找,时间复杂度是O(logN),但是排序本身就有很大的消耗,并且40亿个数据内存一次也存不下。

那么就采用位图!位图就是用来判断一个数据在不在的最好方法了!

分析
  1. 位图是一种直接定址法的哈希,因此效率很高,用O(1)就可以探测到对应位是0还是1,效率非常高,因此可以快速判断。
  2. 40亿个数据,我们可以大概计算一下,一个数据4字节,那么40亿数据就是160亿字节。我们都知道4G大概是42亿九千万字节,那么1G大概也就是10亿字节,所以160亿字节大约就是16G,因此要把40亿个数据存放到内存中需要16G的内存空间。数据量还是非常大的,如果我们采用位图的话,一个数据就占一个比特位,42亿九千万个字节需要512M就可以存下,因此用位图存的话也节省了空间。【但是这里我们开空间的话需要注意要开42亿九千万字节,有人可能会有疑问?为什么不是40亿,题目不就是40亿个数据吗?但是我们要注意,位图开的是一个范围,因为难免这40亿个数据中会有大于40亿的数据出现,万一出现一个大小为41亿的数据呢,那我们把这个数据映射到哪里呢,所以开的范围是就是42亿九千万字节,一个位置对应一个数】
  3. 使用位图,先将这些数遍历一般进行set(把每个出现的数据的对应位图的位置为1),然后要查找某个数在不在时,直接test这个数即可,返回真就是存在,返回假就是不存在。

具体代码的实现可以戳博主的上一篇文章~数据结构:位图

大数据:快速查找一个数字是否存在在40亿个数字中 首先,我们先看个问题 在给定的一台4G的PC机器上实现,一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,找出给定的某个数 m,是否在文件40亿个数据当中的需求。 我这边推荐两个做法。 第一种做法: 需求分析:Int类型在Java中的存储占用4个Byte,32Bit,如果在内存中定义40亿个int类型数组来读取文件,占用大小:(40*100000000*4/... 阅读详情

相关推荐

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】

40亿占多少个字节:4G 10个亿需要1G 一个整型需要4个字节,40亿个则需要16G 由于如果我们直接使用这种方式去存储需要16个G显然这是不可能的,因此我们需要用到下面的方式去存储,采用位图 我们用一个Bit位去标识一个数存在还是不存在 我们都是到一般字节是存储的最小单位 那么一个字节有8个位,巧妙的利用这一点来实现我们的位图 比如10我们先确定他存在第几个字节,再去确定它在第几个

persistence_s的博客 1879

大数据面试题-场景题

首先前5轮还是要比的,任选一组的第3名和其他组的第一名进行比赛,如果这组的第三名恰好是这次比赛的第一名,那就意味着这一组对应的前三名就是25匹马中的前三名,这种方法虽然是碰运气,但好像跟题目中的“至少”并不冲突,所以自我感觉面试的时候可以提一嘴。结果上面的分析,我们发现这题有意思的地方就是,第一快的马是单独比赛一次选出来的,而第二快和第三快的马是在同一场比赛中选出来的,找出最少比赛次数的关键所在就是我们要根据实时的比赛结果淘汰掉不可能有排名的马,从而达到压缩马数量的目的,这样可以让比赛的次数少很多。

qq_40382400的博客 816

面试题:给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何快速判断这个数是否在这40亿个数中

//**********************位图***********************//腾讯面试题:// 给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何// 快速判断这个数是否在这40亿个数中//解题思路://(1)直接存进内存//40亿个无符号数,如果放到内存,就需要开辟4*4G=16G的空间,因为数的范围不确定,所以//开辟尽可能大的空间来存放,需42亿9千万×4字

饭饭的博客 5585

面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中

如果常规的想法是给这40亿数,放到一个很大的数组中,快速排序,然后采用二分查找,来判断这个数是否存在; 但是计算机的内存就是4G,大小差不多刚好是2^32大约为42亿左右,一个整形4个字节,40亿数大约需要16G个字节,在现实基本不可能实现,那么该如何存储呢? 方法:位存储 一个整形32个位,16G个字节只需要500M就可以,然后设置比特位1表示这个数存在,0表示这个数不存在。#include

f2016913的博客 3704

C++位图详解(BitMap)

题目:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快 速判断一个数是否在这40亿个数中。 【腾讯】思路:这道题首先要判断40亿个不重复的无符号整数究竟占多大的内存,因为太大的内存我们无法加载到现有的计算机中。一个整数是4个字节,40亿个整数就是160亿个字节,也就相当于16G内存,就一般的计算机而言很难实现这个加载,所以我们可以采取以下两种方案,一种是分割,一种是位图。方法:①分割

ArchyLi 1万+

C语言位图算法

位图法定义: 位图法就是bitmap的缩写,所谓bitmap,是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示。那么就可以开一个int数组,一个int有32个位,就可以表示32个人。操作的时候可以使用位操作。   数据结构: ?

zdc_8023的博客 3104

给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

总共有4*10^9个数字,如果直接放在内存中,需要的内存量是 4*10^9*4bytes(一个unsigned int为4bytes) ~= 16GBytes内存 用bitmap表示就是4*10^9bits~=512MBytes=2^32 = 4 294 967 296 ,所以索性就分配512M内存,然后依次将这个40亿不重复的数字添加到bitmap中,默认为0,添加后为1。最后直接判断要查找

jackywgw的专栏 3425

如何在40亿个乱序的数中快速查找某个数值是否存在

题目描述 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 分析与解法 海量数据处理往往会很有趣,有趣在什么地方呢? 空间,available的内存不够,需要反复交换内存 时间,速度太慢不行,毕竟那是海量数据 处理,数据是一次调用还是反复调用,因为针对时间和空间,通常来说,多次调用的话,势必会增加预处理以减少每次调用的时候的时间代价。 解法一 咱们回到眼前要解决的这个问题,1个unsigned int占用4字节,40亿大约

愿君出走半生,归来时仍是少年 2072

c语言判断一个数是否为偶数源代码,c语言判断一个数是否为偶数

#include #include _Bool isOu(int n){ //高度注意:&的优先级低于== )==){ return true; } else{ return false; } } int main(int argc, char *argv[]) { ,b=; printf("a=23,b=26\n"); printf("a is %s\n",isOu(a)?"ou…#...

weixin_42176827的博客 5826

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

yolov8源码下载地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLiteyolov8使用文档: Home - Ultralytics YOLOv8 Docs教学视频参考: 包会!YOLOv8训练自己的数据集_哔哩哔哩_bilibili先用conda prompt创建一个虚拟环境,我的叫yolov8, python版本用3.10 源码地址:GitHub - ul

CV在读 25万+

哈希变形—位图(给定40亿个不重复的无符号数整数,没排过序,给一个无符号整数,如何快速判断一个数是否在这40亿个数中)

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef struct BitMap { size_t* _bits;// size_t _range;// }BitMap; void BitMapInit(BitMap* bm, si...

mt_09的博客 481

Vue路由守卫实战:利用token实现跨项目免登录跳转(最新版)

本文详细介绍了如何利用Vue路由守卫和Token验证实现跨项目免登录跳转方案。通过核心架构设计、路由守卫精细化控制及Token交换安全实践,有效解决了多系统跳转中的认证问题,提升用户体验和系统连贯性。

n7o8p的博客 138

在2.5亿个整数中找出不重复的整数的C++实现源代码

6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。   方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。   

brk1985的专栏 2929

开源网格划分软件-Gmsh二次开发教程 (4)网格生成与控制​

​本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。

ZQGG的博客 1474

Windows下用VS2022编译libcurl全流程(含openssl配置避坑指南)

本文详细介绍了在Windows平台使用Visual Studio 2022编译libcurl库的完整流程,重点解决了集成OpenSSL支持HTTPS功能时的常见配置难题。从环境准备、源码获取、依赖编译到工程配置,提供了清晰的步骤和针对非默认安装路径的避坑指南,帮助开发者高效完成网络库的集成工作。

weixin_29291185的博客 245

40亿个数中快速查找

40亿个数中快速查找 题目描述 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 分析与解法 海量数据处理往往会很有趣,有趣在什么地方呢? 空间,available的内存不够,需要反复交换内存时间,速度太慢不行,毕竟那是海量数据处理,数据是一次调用还是反复调用,因为针对时间和空间,通常来说,多次调

pjk1129专栏 4947

一步一步实现基于COMSOL的单模光纤波导仿真

一步一步实现基于COMSOL的单模光纤波导仿真,简单易懂,跟着博客就能实现

君莫笑lucky的博客 1万+

C++位图(Bitmap)

首先普及一下将要用到的逻辑运算符号:【与】运算符号为 & ,运算法则为遇0得0。也就是说只要有0,结果即为0。【或】运算符号为 | ,就是一个竖线,运算法则为遇1得1。也就是说,只要有1,结果就为1。【非】预算符号为 ~,就是一个波浪线,运算法则为按位取反,也就是遇1取0,遇0取1,即 ~1 = 0 , ~0 = 1;【异或】运算符号为 ^,就是一个乘方符号,运算法则为相同取0,不同取1。异或运算,关键在异上面,异为1,否则为0。 位图 (Bitmap) 是一种基于位操作的数据结构,用于表示一

chen_ever的博客 3693

在 SAP ECC 中定义 ledger 时遇到 “Define exactly one leading ledger“(消息号 FAGL_LEDGER_CUST012)的错误

摘要:SAP系统要求必须且只能定义一个主导分类账(Leading Ledger)。当出现错误消息FAGL_LEDGER_CUST012时,需通过事务码FINSC_LEDGER或SPRO路径检查分类账配置,确保仅有一个分类账被标记为"LeadingLedger",其余设为"Non-leadingLedger"。主导分类账是SAP默认用于标准报表的核心分类账,修改配置需谨慎以免影响已有数据。若问题未解决,建议检查未完成配置或查阅SAP Notes获取解决方案。

金牌架构师 802

SAP UI5 主题设置全解析:从启动参数到运行时切换、跨域白名单与事件监听

SAP UI5主题体系深度解析:从配置到切换的完整指南 摘要:SAP UI5主题机制远不止CSS换肤,其工程化实践涵盖启动配置、运行时API切换、跨库路径映射及安全管控等关键环节。通过bootstrap标签或URL参数设置初始主题,运行时可用Theming.setTheme无刷新切换。自定义主题需配置theme-roots路径,跨域加载需声明sap-allowed-theme-origins白名单。主题切换完成后会触发applied事件,适合执行视觉同步操作。该体系支持多品牌适配、集中式主题管理,在Fior

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 327

新C++(12):位图与海量数据处理

一个树的节点,最起码就包含三叉链(left,right,parent)。想想看,这些庞大的数字堆积起来的内存空间是有多么可怖。得到一个有序序列,emm,然后可以通过二分查找,以LogN的效率查看该数是否存在。因此,用位图结构来处理大量数据时,对于存储数值在内存上的消耗能显著降低!此时,我们本来用一个4字节int或者1字节的char表示一个整数,变为用一个bit位来标识一个整数是否存在。emm,听起来不错,甚至我还想将这40多亿个整数放在红黑树、哈希表中查找。位图结构中,set、reset是最重要的。

RNGWGzZs的博客 819

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c语言如何判断一个数是否为整数_如何对 1 千万个整数进行快速排序

(给算法爱好者加星标,修炼编程内功)作者:编程珠玑/守望(本文来自作者投稿)前言输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。输出:按升序排列的输入整数的列表。约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化。这是《...

weixin_39630771的博客 1722

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

位图【概念 + C/C++实现】

加载8次,然后每加载一次都进行查找.在这个过程中,我们需要8次从磁盘将数据加载进内存,这是IO操作,所以会非常慢,而且遍历查找时间复杂度。给40亿个不重复的无符号整数,没排过序. 给一个无符号整数,如何快速判断一个数是否在这40亿个数中?,所以我们不可能一次性将它加载进内存,所以只能将这些数据分批加载,比如一次加载。但是40亿个整数,假设在32位机器下,40亿整数所占空间为。由于文件中的数据不支持随机访问,所以也不可行。

smf12138的博客 792

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言快速判断素数——不超时

这属于算法上的问题,好好考虑一下算法,还要考虑一下素数的定义。素数是只有1和本身能整除的整数。所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数了。但是从算法上考虑,为了减少重复量,开平方后面的数就不用相除了,因为a/b(平方数)=c(小一点的数),同样a/c=b。举例说明:25,开平方以后是5,那么整除2~5就可以了,如果有满足...

deng0004的博客 2960
上一篇: 数据结构:位图
下一篇: 数据结构:布隆过滤器
ETalien_
博客等级 码龄8年 154粉丝 199原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值