Bitmap算法,
问题:对40亿个数据进行排序,数据类型为 int,无相同数据。
思考:关于40亿个数据的排序,首先想如何存储呢?一个int 4个字节,也就是160亿个字节,也就是大概有16GB的数据,现在所有的计算机估计
没有这么大的内存吧,所以我们就可以文件归并排序,也可以分段读入数据在进行Qsort,但是都需要不停地读入文件,可以想象不停地读取文件硬件操作会有多么浪费时间。
我们这样都是用4个字节来存储了一个数据,在计算机里都是用二进制进行表示,
例如 5 :0000 0000 0000 0000 0000 0000 0000 0101
现在引入Bitmap,所谓Bitmap就是用一个bit来表示一个数据。平时32位存储一个数据,我们可以换一种想法,用一个字节32位来存储0-31这32个数据,例如我们对2,1,5,12这四个数据进行由小到大的排序,首先把32位初始化为0,我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110
我们就把32位中的分别把 2 1 5 12位置为1,然后从第0位开始遍历,看相应位是否为1,为1就进行输出,就完成了数据从小到大的排序。
再返回原题应用Bitmap就可以把16GB的存储空间缩小为16GB/32 = 512M,就可以大大减少读取文件的工作。直接读一次文件存入内存,然后遍历输出就完成了排序。
优点:既大量节省了空间,又把时间复杂度降低到O(n)。
不足:如果数据过于稀疏就会有大量无用遍历,浪费时间。
对于几亿int数据如要查找出相等的数据,利用Bitmap算法,只是使byte达到了极限,也是一种解决问题的一种方法。下一篇描述讲一下源代码的
描写。
- 大小: 14 KB
分享到:
相关推荐
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
使用纯Java语言写出来的数据结构,包含数据结构有 单向链表,双向链表,单向循环链表,双向循环链表,二叉树,队列,栈等, 关于实现的种类有分多种类型,包含有链表或者数组,二叉树里面包含有常见的二叉查找树,...
今天小编就为大家分享一篇关于高级数据结构及应用之使用bitmap进行字符串去重的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
咆哮位图 位集(也称为位图)通常用作快速数据结构。 不幸的是,它们会占用过多的内存。 为了补偿,我们经常使用压缩的位图。 咆哮的位图是压缩的位图,其性能通常优于传统的压缩位图,例如WAH,EWAH或Concise。 在...
数据结构与算法 排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾中 做法 外层for循环控制次数 内层for循环找出最大的值的角...
购票时系统在阈值次数内采用随机分配的方式产生车票,并对该车票进行检查,即查询 该车票是否可购买,如果可购买,则对该座位进行加锁(lock),之后再重复一次检查,若依 旧可购买,则对该 Seat 上的 bitmap 进行...
Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!
BitMap可以看成一种数据结构。 假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存。 在Java中,int占4字节,1字节=8位(1 byte = 8 bit)。 如果每个数字用int存储,那...
java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!
另外,sharedpreferences 不能存类,集合和bitmap等数据!这点也让人非常不爽啊!所以,我就在这个美好的星期天撸了名为 SHARE 的工具类用来替代 sharedpreferences。 ##项目介绍 整体架构 先来看一下,整体架构图...
咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,例如,用于搜索引擎和...
那么对于用户自己定义的数据结构是无法直接用Intent来传送的,如果想要通过Intent来传递自定义数据,可以让数据结构实现Parcelable接口,这样就可以把数据放入Intent。但是Intent的传送效率也不是很高,特别是当传递...
这是Roaring位图数据结构的Rust端口,最初定义为Java库,并在“使用Roaring位图提高位图性能”中进行了描述。 Rust版本策略此板条箱仅支持Rust的当前稳定版本,修补程序版本可能随时使用新功能。 开发此项目使用了...
constjs 使用在字符串,数组,对象或参数中指定的键名创建const / enum / bitmap对象用法npm install constjs 枚举(Java样式) var ConstJs = require ( 'constjs' ) ;var Colors = ConstJs . enum ( "blue red" ) ...
Go 开源项目 MIMIO 的对象存储方案在探探的实践分布式分布式事务etcd 的实现原理数据结构与算法基础Dijkstra什么是 Bitmap 算法?Bitmap算法(进阶篇)最小栈的实现判断 2 的乘方找出缺失的整数辗转相除法是什么鬼?...
虽然说 Infobright 没有提供索引结构,但它 Knowledge Grid 中的 Numerical Histogram、Character Map 和 Pack-to-Pack 结构,怎么看都和 bitmap 索引脱不了关系。只是它的组织形式不像传统数据库中的索引罢了。 ...
PContour Java /库,用于在二进制图像中查找轮廓,该库由CMU。| | 与的cv::findContours和cv:... 最初的计划是移植OpenCV实现( ),但他们的计划主要面向C / C ++内存管理,并与库中其余部分的数据结构交织在一起。 缺
Java版水果管理系统源码 some knowledge Android Android性能优化方案(如内存优化、网络优化、布局...使用经过优化后的数据容器,常规的HashMap效率低下,建议使用Android优化过的数据容器,如SparseArray,它可以避
当存储的值是相当小的整数时,BitSet(也称为Bitmap或位向量)是实现一组的理想数据结构。 它可能比通用集实现快几个数量级。 特别是,BitSet具有对设置操作(联合,差,交)的快速支持。 FastBitSet.js实现为速度...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 ...• SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...