`

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++/算法

 

分享到:
评论

相关推荐

    c# 实现位图算法(BitMap)

    C# 实现位图算法(BitMap) 位图算法(BitMap)是一种高效的数据结构,主要用于快速查询和存储大规模数据。下面将详细介绍 C# 中如何实现位图算法(BitMap)。 什么是 BitMap BitMap 的基本思想就是用一个 bit 位...

    海量数据去重排序bitmap(位图法)在java中实现的两种方法

    海量数据去重排序bitmap(位图法)在java中实现的两种方法 海量数据去重排序是指在大量数据中找到重复出现的元素或去除重复出现的元素,这种问题在面试中经常被考察。针对这种问题,一种常用的解决方法是使用位图法。...

    java排序算法使用及场景说明

    Java 排序算法使用及场景说明 本文档主要介绍了 Java 排序算法的使用和场景说明,包括了五个实践场景的解决方案。 Scenario 1: 找出两个文件共同的 URL 在这个场景中,我们有两个文件 a 和 b,每个文件中存放了 ...

    位图数据结构在排序算法中的应用.pdf

    在介绍位图数据结构的应用前,让我们先了解几种排序算法的基本概念和它们的内存与时间效率。 1. 归并排序(Merge Sort): 归并排序是一种分治算法,它将数据分成较小的两部分进行排序,然后将排序好的两部分合并在...

    Bitmap转jpeg源码

    综上所述,Bitmap转JPEG的过程是一个涉及颜色空间转换、DCT、量化、Zig-Zag排序、Huffman编码以及JPEG头信息组织的复杂流程,这一过程中需要对图像处理原理和压缩理论有深入理解。在实际应用中,开发者需要根据需求...

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

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

    python实现bitmap数据结构详解

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

    解析bitmap处理海量数据及其实现方法分析

    例如,在排序示例中,我们用1Byte(8位)来表示0-7这8个数字,通过设置相应的位,可以快速定位和处理数据。 2. **Bitmap实现方法** - **设置位**:在上述代码中,`SetBit`函数用于设置某一位为1。它首先计算出目标...

    Bitmap Colour Shading_sort9op_period7ai_bitmap_

    "Bitmap Colour Shading_sort9op_period7ai_bitmap_" 这个标题暗示我们正在讨论一个与位图(Bitmap)相关的色彩着色程序或者算法,其中"sort9op"可能代表某种排序或操作流程,"period7ai"可能涉及周期性或者人工智能...

    大数据处理算法.pdf

    大数据处理算法目录中,主要介绍了三种大数据处理算法:Bitmap 算法、Bloom Filter 算法和分而治之/Hash 映射 + Hash 统计 + 堆/快速/归并排序。 大数据处理算法一:Bitmap 算法 Bitmap 算法是一种常用的大数据...

    易语言-易语言大数据去重复源码 bitmap

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业...通过学习和研究这个源码,开发者不仅可以掌握去重算法,还能深化对易语言的理解,提高在大数据环境下的编程技能。

    数据结构与算法.xmind

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

    asp.net 算法题

    在ASP.NET项目中,快速排序是一种常用的排序算法,其主要思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分的所有记录都比另一部分的所有记录小,然后分别对这两部分记录继续进行排序,以达到整个序列...

    算法java实现

    2. **排序算法**:排序是数据处理的基础,Java中实现的经典排序算法有冒泡排序。"bubbleSort.class" 可能包含了冒泡排序的Java代码。冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素...

    【保证工作用的上】趣味数据结构与算法

    1. 算法与数据结构的重要性 数据结构和算法是计算机科学的基础,对于提高程序的效率、处理大规模数据以及解决复杂问题至关重要。在这个部分,提到了“通俗的”常用数据结构和算法介绍,强调了理解这些基础概念对于...

    面试常见基础算法题总结

    7. **排序算法**:快速排序、归并排序和堆排序是常见的排序算法。快速排序在平均情况下效率高,但最坏情况为O(n^2),可以通过随机化选取枢轴优化。归并排序稳定但需要额外空间,堆排序不稳定但原地排序。 8. **快排...

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

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

    Bits_and_Pizzas-源码.rar

    3. **算法**:如排序算法(快速排序、冒泡排序等)和搜索算法(二分查找、深度优先搜索等),可能用于处理披萨订单或配料的排列。 4. **数据库交互**:如果项目涉及存储和检索披萨订单,可能用到了SQL查询或NoSQL...

Global site tag (gtag.js) - Google Analytics