`

bitmap与位排序法

 
阅读更多

编程珠玑下载:

http://ishare.iask.sina.com.cn/f/10532519.html?from=isnom


编程珠玑--位图法排序

位图法是《编程珠玑》第一章中出现的磁盘排序算法。

 

题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复。求如何将这n个正整数升序排列。

约束:最多有1MB的内存空间可用,有充足的磁盘存储空间。

 

分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码。而包含正整数的文件约为10^7个int大小。这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法。因此衍生出下面两种方法:

 

方法1(多通道法):

题目中的限制为所有正整数都不重复。这代表:

输入文件中范围在1~249 999的正整数至多只有250 000个,至多占内存为1MB。

输入文件中范围在250 000~499 999的正整数至多只有250 000个,至多占内存问1MB。

…..

 

多通道方法:

  1. 第1遍遍历文件,将文件中范围在1~ 249 999的正整数读取进入1MB内存,排序(可以使用各种排序方法),将排序后的正整数存储在磁盘文件temp中
  2. 第2遍遍历文件,将文件中范围在250 000~499 999的正整数读取进入1MB内存,排序,将排序后的正整数加入存储在磁盘文件temp中
  3. ….
  4. 第40遍遍历文件,将文件中范围在10^7-250 000~10^7的正整数读取进入1MB内存,排序,将排序后的整数加入存储在磁盘文件temp中
  5. 输出temp文件

 

此方法缺点是非常明显的:需要遍历40次文件,意味着读取输入文件40次,并且需要一个和中间文件temp。

因而我们使用更好的排序方法。

 

方法2(位图法):

我们想使用hash映射,将对应的正整数映射到位图集合中。即将正整数映射到bit集合中,每一个bit代表其映射的正整数是否存在。

比如{1,2,3,5,8,13}使用下列集合表示:

0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0

我们可以使用具有10^7位的字符串来表示这个文件。其中,当且仅当整数i在文件中存在时候,第i位为1

 

位图法方法:

  1. 创建有个10^7位(10^7/8/1024/1024≈1MB)的字符串,并将其每一bit设置为0;
  2. 读取包含正整数的文件,对每一个i,将内存中bit[i] 位设置成1.
  3. 按位顺序读取字符串。当读取到bit[j] 为1时输出(int)j。

 

根据位图法演变解决以下QQ面试题目:

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

 

unsign int范围为0~2^32-1(4294967295≈5*10^9) 使用位图hash对应5*10^9/8/10^3/10^3 = 625MB.

  1. 我们使用625M的字符串。每一位设置为0.
  2. 将40亿个unsign int 遍历一遍。使用位图法将字符串中的对应位转化为1。
  3. 读取“再给一个数i” 查看bit[i] 是否为1,1则有存在,0则不存在。

作者:Nick Ye(yjf512)
出处:(http://www.cnblogs.com/yjf512/
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

 

参考文档:

编程珠玑(第二版)

http://topic.csdn.net/u/20080615/10/aa830254-fa42-4e19-acbf-3cfb53f08619.html?641331689

http://zhishi.sohu.com/question/96449988.html

分类: C++/算法

 

分享到:
评论

相关推荐

    PHP实现bitmap位图排序与求交集的方法

    本文实例讲述了PHP实现bitmap位图排序求交集的方法。分享给大家供大家参考,具体如下: 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这...

    python实现bitmap数据结构详解

    bitmap实现思路 bitmap是用于对每一位进行操作。举例来说,一个Python数组包含4个32位有符号整型,则总共可用位为4 * 31 = 124位。如果要在第90个二进制位上操作,则要先获取到操作数组的第几个元素,再获取相应的位...

    数据结构与算法.xmind

    排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾中 做法 外层for循环控制次数 内层for循环找出最大的值的角标 找出...

    用位图排序无重复数据集实例代码(C++版)

    一、主要思想位图排序的思想就是在内存中申请一块连续的空间作为位图,初始时将位图的每一位都置为0,然后依次读取待排序文件的整数,将整数所在的位设置为1,最后扫描位图,如果某一位为1,则说明这个数存在,输出...

    使用纯Java语言写出来的数据结构

    使用纯Java语言写出来的数据结构,包含数据结构有 单向链表,双向链表,单向循环链表,双向循环链表,二叉树,队列,栈等, 关于实现的种类有分多种类型,包含有链表或者数组...跳表,图,bitmap,排序算法均有代码案例

    数据结构算法

    经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 ...

    blog:算法,WebRTC,节点,微服务,Golang,ELK,Kubernetes,Istio,JAVA,PHP,MongoDB,Ningx,OpenResty,GraphQL ..

    Bitmap算法(进阶篇)最小栈的实现判断 2 的乘方找出缺失的整数辗转相除法是什么鬼?什么是动态规划?通过金矿模型介绍动态规划什么是跳跃表?什么是 B- 树?什么是 B+ 树?什么是一致性哈希?无序数组排序后的最大...

    程序员编程艺术:面试和算法心得.pdf

    • 第六章 海量数据处理 o 6.0 本章导读 o 6.1 关联式容器 o 6.2 分而治之 o 6.3 simhash 算法 o 6.4 外排序 o 6.5 MapReduce o 6.6 多层划分 o 6.7 Bitmap o 6.8 Bloom filter o 6.9 Trie 树 o 6.10 数据库 o 6.11 ...

    Android 常用六大框架

    FinalBitmap的内存管理使用lru算法, 没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档), 更好的管理bitmap内存。FinalBitmap可以...

    JAVA大数据处理题.pdf

    s 对 这10个⽂件进⾏归并排序(内排序与外排序相结合)。 ⽅案2: ⼀般query的总量是有限的,只是重复的次数⽐较多⽽已,可能对于所有的query,⼀次性就可以加⼊到内存了。这样,我们就可以采⽤trie 树/hash_map等...

    分布式图数据库NebulaGraph的Index实践

    不同的数据库系统有不同的排序结构,目前常见的索引实现类型如B-Treeindex、B+-Treeindex、B*-Treeindex、Hashindex、Bitmapindex、Invertedindex等等,各种索引类型都有各自的排序算法。虽然索引可以带来更高的查询...

    数据结构和算法.zip

    内部包含: 数据结构与算法 + 数组 + 数组排序 + 栈 + 队列 + 堆 + 树 + 红黑树 + Bitmap算法 + 最小生成树 + 图的最短路径等。。。。 共25个项目,大家下载自行查看。

    算法:数据结构和算法

    算法 整理一下使用过的算法和数据结构 课程来源:《数据结构和算法之美》-作者:王争 复杂度分析 清单 项目 描述 AC自动机 斑点 二叉平衡树 二叉查找树 位图 B +树 B树 组合 完全二叉树 分治算法 动态规划 图 ...

    jemalloc深入分析

    1. bitmap查找算法的优化-32路查找 2. paring heap,配对堆的使用,提高排序效率 3. RB tree 红黑树 4. Tcache机制 5. 支持原子操作的线性同余伪随机数生成器 6. 动态头长度的计算过程map_bias 7. Region size设计...

    大数据的一些面试题.pdf

    ⼋、外排序 适⽤范围:⼤数据的排序,去重 基本原理及要点:外排序的归并⽅法,置换选择败者树原理,最优归并树 扩展: 问题实例: 1).有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16个字节,内存...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--图片的LRU算法内存保存和读取 |--图片的缩放处理(防内存溢出) |--多媒体应用设计图 |--多线程下载 |--多线程下载及断点续传 |--多线程之AsyncTask的用法 |--多线程之线程池ExecutorService |--字体为粗体 |--安卓...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。...

    gostl:go的数据结构和算法库,旨在提供类似C++ STL的功能

    功能列表数据结构优先队列堆rbtree(red_black_tree) 地图/多地图集/多集位图布隆过滤器hamt(hash_array_mapped_trie) 克塔玛跳过列表算法排序(快速排序) 稳定排序(合并排序) binary_search 下界upper_bound ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数,其中,M表示精度,代表数字的总位数;N表示小数点右边数字的位数 日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月...

    ActionScript开发人员指南中文版

    绘制API示例:算法可视化生成器 绘图API高级用法 第章:使用位图 位图使用基本知识 Bitmap和BitmapData类 处理像素 复制位图数据 使用杂点功能制作纹理 滚动位图 利用mipmap处理 位图示例:带动画效果的旋转的月亮 ...

Global site tag (gtag.js) - Google Analytics