海量数量处理之位图

海量数据排序:外部排序、位图排序、基数排序、桶排序 基数排序又称桶排序,它不直接比较关键字的大小,而是比较关键字中各位的值来实现排序的。 假设关键字从高位到低位可以由k1、k2、……、kd构成。 最高位优先(MSD)法:先按k1排序分组,再对各组按k2排序分组,直到按最次位kd分组后,再将各组连接起来,便得到一个有序序列。 最低位优先(LSD)法:先从kd开始分组,再对kd-1进行排序,直到对k1分组后得到一个有序序列。 二进制快速排序 阅读详情

编程珠玑第二章开始提出了三个问题,其中第一个问题是这样的:一个顺序文件至多包括40亿个32位的整数,这些数是无序的,找出一个不在该文件中的32位整数。(可能有数字是不在该文件中的,因为2^32总共包括了42+亿个数,因此肯定有整数是不在该文件中的,这是鸽巢原理吧?)

据说这是腾讯的一道面试题,大概描述如下:

image

问题描述:

image

问题的描述大概就是这样了。

刚看到这个题目就想到了bitmap,很适合使用,下面简单说明下。

1、bitmap方法

如果问题对于内存没有要求,可以采用bitmap的方法。对这40亿个数进行bitmap,如果某个数在文件中,那么将其bitmap设置为1,如果不在则设为0;这样操作后在遍历文件对应的bitmap,遇到某一位为0,则说明这个数是不在文件中的,输出就可以了。

这样的情况下总共需要至多:40亿/(8*1024*1024)M,这个大约是500m。如果内存空间够的话就可以采用这种方法。但如果内存有严格限制,这种方法就不可取了。

2、二分法

这里利用了二分的巧妙思想:因为二进制中每一位要么是0要么是1,因此可以根据数据的某一位来分,该位为1的在分配在一组,该位为0的分配在另一组。这里的二分法就是采用了这种思想。

对这40亿数来说,进行如下操作:从最高位到最低位(反过来也可以)按照上面的思想进行分组,例如对于最高位为1的分在一组,最高位为0的分在另一组,这样40亿数据就被分配成了两组了,下面考察这两组数据。

经过上次划分后两组数据可能有下面的情况:

a、两组数据包含的数是相等的,即都是20亿。

b、两组数据包含的数是不等的,一个大一个小。

对于a来说,因为两组数有相同的个数,那么我们可以判断这两组数中都缺少了全体数(2^32个)中的某一个或者多个数。

对于b来说,我们可以肯定是小的那部分数据肯定缺少了某一个或者多个数,而多的那一部分是不确定的,当然也可以判断出来。(通过跟2^32/2=2^31比较)

对于情况a来说,我们可以任选一组数继续进行二分操作;对于情况b来说,我们选择数据量小的那部分数据继续进行二分操作,这样不断的进行下去,就可以找到某个不在40亿数中的数了。

这里很巧妙的利用了二分法,而且与平常使用的不太相同。这里是根据一个数的某一位来将数据分配到不同的组中。

上面就是这个问题的大概思路:用位图法很直接,但占用内存量会大点;利用二分法比较巧妙,不太容易想到。

 

编程珠玑课后提出了另外一个问题:

找出43亿32位整数中至少重复两次的数?首先肯定是有数是重复的,因为2^32总共的数据是42亿多,不到43亿,根据鸽巢原理,肯定是有重复的。如何操作?

当然,有了前面的介绍很容易想到继续采用二分法,思路完全一样。

其实当内存空间没有要求的话,用位图法也是可以的,因为题目只是要找到一个至少重复两次的数就ok了,这样使用位图在遍历数据的时候发现重复的话就可以结束了,时间复杂度是线性的,当然空间复杂度是大点。

 

在网上又看到了这样一个问题:

给定一个包含40亿个随机排列的整数的顺序文件,找出一个出现至少两次的32位整数。这个问题的难道比上面的应该都高。

这里首先想到bitmap,是可以操作的。

还有其他更高效的算法了吗?应该有吧。hash?其实感觉bitmap就是hash的一个特例,bitmap是将数据hash到了位置上。

==============================华丽的分割线============================

上面是关于编程珠玑第二章的问题A和课后类似题目的解答,其实这里面最重要的思想还是bitmap,而且bitmap的应用十分的广泛,简单总结下:

1、bitmap可以用于海量数据的排序

这种情况可能有一些要求,比如数据尽量不重复。如果数据不重复的话,而且空间没有要求,那么bitmap是很高效的。当然如果数据有重复,但能知道重复至多不超过多少,也是可以的。例如数据至多重复10次,那么可以用4位来表示一个数据,这样还是比4个字节(一般整数是4个字节)的空间减少了很多。

2、bitmap用于查找缺少的数据、重复的数据

这个问题在上面的描述中都有体现了,40亿数据中不包含那个32位的整数;43亿数据中哪个数是至少重复两次的?

3、其他应用

后面找找看,再补充

==============================华丽的分割线============================

从上面以及前面的分析可以知道,bitmap是很赞的一种思想,也是很值得应用和掌握的。当然它也有一些限制条件。例如,当内存使用有限制,而且数据量比较大的时候,bitmap可能也是不行的,这样的情况下就可以考虑上面的二分法了。

C++上机——2023年“信息与未来”小学生编程思维展示官方题解 本次活动前三题是“根据问题描述实现代码”类型的问题,题解和示例代码由人工智能GPT-4直接阅读题面后生成――只要熟悉C++的语法和基本的编程、调试,即可解决p1、p2、p3。后三题有一定的算法性,我们给出命题思路和一些可能的解法。注意:本题解是面向指导教师的;指导教师在讲解时可以根据学生掌握程度进行调整。 阅读详情

相关推荐

【完美解决】Anaconda3安装后缺失大量文件,没有scripts、Library等目录

Anaconda3是官网下载的:https://www.anaconda.com/distribution/#download-section 我选择的是64位python 3.7的版本。 问题出现及现象: 我自己选择了一个D盘的目录D:\Tools\Anaconda3进行安装,装完后发现conda list命令无法执行,首先都到的是配置环境变量,然后发现安装目录下缺失大量文件(如下图)...

android之行 3万+

位图法;海量数据处理之位图技巧;位图技巧;海量数据;编程珠玑第二章问题A;40亿整数;腾讯面试题

编程珠玑第二章开始提出了三个问题,其中第一个问题是这样的:一个顺序文件至多包括40亿个32位的整数,这些数是无序的,找出一个不在该文件中的32位整数。(可能有数字是不在该文件中的,因为2^32总共包括了42+亿个数,因此肯定有整数是不在该文件中的,这是鸽巢原理吧?) 据说这是腾讯的一道面试题,大概描述如下: 问题描述: 问题的描述大概就是这样了。 刚看到这个题目就想到了bitmap,很适合使用,下面简单说明下。 1、bitmap方法 如果问题对于内存没有要求,可以采用bitmap的方

疯狂算法~ 6942

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 366

腾讯面试题——位图的应用

题目: 给40亿个不重复的无符号整型,没排过序。给一个无符号整数,如何快速判断这个数是否存在在这40亿个数中 set()函数图解 reset()函数图解 “BitMap.h” #pragma once #include class BitMap { public: //range 范围 BitMap(size_t range) { //size_t有四个字

poison_biti的博客 784

【NCBI】SRA toolkit安装及使用-Windows&Linux版本

由于市面上的文章介绍SRA toolkit基本上都是基于Linux,而在windows下运行SRA toolkit基本上可以达到相同的效果且更为方便,故本文将分别阐明在Windows和Linux环境下SRA toolkit的安装及使用。

weixin_48076899的博客 2万+

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 676

【操作系统】-10

每个空闲块里有一个指针指向下一个空闲块,这样只需要在系统中维护一个指针(令它指向第一个空闲块)便可以找到所有的空闲块,结构简单,但是不能随机访问,工作效率低,同时数据块的指针消耗了一定的存储空间。空闲表法就是为所有的空闲空间建立一张表,表中的内容包括空闲区的第一个块号和该空闲区的个数。当用户删除一个文件时,系统也需要回收空间,扫描空闲表,寻找一个空闲表条目并将第一个物理块号和它占用的块数填到这个条目中。位图法就是利用二进制的每一位来表示磁盘中一个块的使用情况,磁盘上所有的块都有一个二进制位与之对应。

desson_的博客 3056

CSM中一些常见问题的解决方式

CSM中一些常见问题的解决方式 抖动 摄像机在每帧移动或者旋转时,会产生较严重的抖动问题。

小龙虾的博客 2130

海量数据常用技巧之位图法

介绍 位图的基本概念是用一个位(bit)来标记某个数据的存放状态,一个bit只能表示两种状态,所以不适合用来表示多状态(缺点1)。如果要表示多状态,需要用多个bit,但此时位图的性能会大打折扣,复杂度却增加了。由于采用了位为单位来存放数据,所以节省了大量的空间。一般把这种方法称为位图法,即Bitmap。 BitSet 正因为位图运算在空间方面(指的是海量数据的存储)的优越性,很多语言都有直接对

冬木 2049

34、量子概率幅世界与相关操作解析

本文详细解析了量子概率幅的概念及其在量子力学中的核心作用,介绍了量子态的表示方法与叠加原理,讨论了幺正操作在量子演化中的重要性,并阐述了量子测量的基本原理与影响。此外,文章还分析了量子系统在量子计算中的应用,包括干涉在量子算法中的作用、量子门的组合使用以及量子测量的关键地位,总结了量子系统的独特特性与面临的挑战,展望了量子计算的未来发展趋势。

pytorch8learner的博客 175

BEV和OCC学习-4:数据准备生成pkl文件(NuSences)

info[‘cam_instances’][‘CAM_XXX’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。info[‘cam_instances’][‘CAM_XXX’][i][‘bbox’]:2D 边界框标注(3D 框投影的矩形框),顺序为 [x1, y1, x2, y2] 的列表。info[‘cam_instances’][‘CAM_XXX’][i][‘attr_label’]:实例的属性标签。

zfjBIT的专栏 1699

数据结构---位图算法

位图。bitmap

记录我目之所及的世界 1185

【3D Slicer】的小白入门使用指南一

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 5554

位图法JAVA

位图法 bit-map(位图)法基本原理是使用位数字来表示某些元素是否存在,如8位电话号码中查重复号码,它适用于海量数据的快速查找、判重、删除等。 具体而言,位图是一个N位长的串,我们可用int[] 来描述。 例如集合{5,8,1,12,6,2},那么首先开辟2个字节的空间,也就是16位,分别对应0-15这16个数。位图缺点: 1、可读性差 2、位图存储的元素个数虽然比一般做法多,但是存储

qfzxhy的博客 7482

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

位图 && 布隆过滤器

有关哈希的相关应用【位图】【布隆过滤器】【海量数据处理的面试题】【一致性哈希(了解)】

aaa114514aaaa的博客 890

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

位图与布隆过滤器:原理、差异与应用

在这篇文章中,你会学习到关于哈希思想的最常见的两个应用,也就是 位图 与 布隆过滤器,文章会讲解位图和布隆过滤器的概念,底层实现,对应的适应的场景,以及相关经典 海量数据面试题 及解析。

2301_77509762的博客 3465

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

海量数据存储与查询之布隆过滤器

海量数据存储与查询提出问题如何存储海量数据布隆过滤器使用场景 提出问题 如何快速在亿级黑名单中快速定位URL地址是否在黑名单中?(每条URL平均64字节) 目前有十亿数量的自然数,乱序排列,需要对其进行排序,在32位机器上完成,内存限制2G 如何存储海量数据 链表:O(1)的插入删除,O(n)的查找速度,由于过慢的查找速度所以不适合。 散列表(hashmap):数组+链表/红黑树,具有优秀的查找速度。但是经过计算,一亿的int需要花费12GB+,因此全部无法放入内存中,不适合。 假设存放1,3,5

lzh824359508的博客 592

海量数据问题

在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。 一.重复问题 在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题。针对此类问题,一般可以通过位图法实现。例如,已知某个文件内包含一些...

weixin_30699465的博客 120

大数据排序问题

问题1:从100亿个数据中找出前100个数据 分析:由于只要找出前100个数据,可以采用堆来进行处理。堆特别适合的场景是从海量数据中找出前m个最大值或最小值,当m不大的时候效率很高。 步骤: 1.读取前100个数据,建立最小堆(最小堆的作用是方便找出目前最大的100个数据中的最小值,把待比较的数据与这个最小值比较就好。由于一次性只读取100个数据,不需要一次性读完所有数据,降低对内存的要求)

assert_false的博客 531

bitmap

【转载:https://blog.youkuaiyun.com/lcb1992/article/details/70915952】 简介     bitmap在很多海量数据处理的情况下会用到。一些典型的情况包括数据过滤,数据位设置和统计等。 它的引入和应用通常是考虑到海量数据的情况下,用普通的数组会超出数据保存的范围。使用这种位图的方式虽然不能在根本上解...

zilin-lynn的博客 367

海量数据去重与布隆过滤器

海量数据去重的应用场景有很多,例如在使用word文档的时候,如何判断某个单词是否拼写正确;网络爬虫程序,如何不去爬取相同的url页面;垃圾邮件过滤等。这就涉及到了海量数据去重。 我们将问题简化: ‘如何从海量数据中查询某字符串是否存在。’ 常用查询数据结构 set and map C++ STL中的set和map都可以用来进行查询。他们都是采用红黑树来实现的,增删查改的事件复杂度为o(logn),这里不多展开介绍 优点:存储效率高,访问速度高 缺点:对于数据量大且查询字符串比较场且查询字符串相似时将会是

qq_43058348的博客 336

PostgreSQL eighth class

Query 执行过程 query execution plan 根据 sql 的 query 语句,产生执行计划。用最合理的方式完成query 操作。 attribute 数量小 可以 进行 bitmap index 部署db 上进行优化,在不同库存放不同时期数据,当数据海量的情况时。 事务过程 ACID transaction failure: 终止,回滚,恢复 三步 并发控制 postg...

Edwin_Wcs的博客 197

【数据结构进阶】位图

位图,这一简洁而高效的数据结构,以其独特的二进制存储方式,在数据处理领域展现了强大的生命力。尽管存在局限性,它仍是解决特定问题的利器,并为更高级的数据结构,如布隆过滤器奠定了基础。在数据爆炸的时代,位图的思想将继续闪耀,为高效数据处理提供源源不断的灵感。

2301_80955819的博客 2019

哈希思想应用【C++】(位图,布隆过滤器,海量数据处理面试题)

目录一,位图1. 位图概念2.实现3. 测试题位图的优缺点二,布隆过滤器1). 布隆过滤器提出2). 概念3). 布隆过滤器的查找4). 布隆过滤器删除(了解)5). 布隆过滤器优点6). 布隆过滤器缺陷三,海量数据面试题1)哈希切割我们首先由一道面试题来理解位图40亿无符号整形,我们知道1G大概是10亿个字节,也就是说起码 16G数据,排序,二分查找都需要在内存下进行,16G的内存性价比着实有些低。而我们使用位图的方法,用40亿个比特位来表示这40亿个数是否存在,大概就是要消耗 512MB(1G-> 10

菜菜成长为后端开发大佬 1436

STL:位图和布隆过滤器

位图和布隆过滤器可以帮助我们解决一些海量数据处理问题!!

weixin_51142926的博客 3241

【C++】 哈希位图 + 布隆过滤器 + 海量数据处理方法

本文系统讲解了哈希位图和布隆过滤器两大海量数据处理技术。哈希位图利用bit数组实现极致的空间压缩(1bit/元素),支持O(1)时间复杂度的精确查询,适合稠密整数场景;布隆过滤器通过多哈希函数映射实现任意数据类型的概率型存在判断,以可容忍的误判率为代价换取内存极致节省。文章详细剖析了两者的底层原理、数学建模、工程实现及典型应用场景(如缓存穿透防护、URL去重等),并对比了其与HashSet的优劣。最后提出了海量数据处理的四大核心方法论(分治、哈希映射、外存归并、概率统计)及经典题型解法,为分布式系统和大数据

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 720
上一篇: 教你如何迅速秒杀掉:99%的海量大数据处理面试题
下一篇: xmpp 带内注册
vic__vic
博客等级 码龄15年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值