`

位图排序

 
阅读更多

       位图排序是一种效率极高(复杂度可达O(n))并且很节省空间的一种排序方法,但是这种排序方法对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。位图排序即利用位图或者位向量来表示集合。举个例子,假如有一个集合{3,5,7,8,2,1},我们可以用一个8位的二进制向量set[1-8]来表示该集合,如果数据存在,则将set相对应的二进制位置1,否则置0.根据给出的集合得到的set为{1,1,1,0,1,0,1,1},然后再根据set集合的值输出对应的下标即可得到集合{3,5,7,8,2,1}的排序结果。这个就是位图排序的原理。

一.位图排序的应用:

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

      因为unsigned int数据的最大范围在在40亿左右,40*10^8/1024*1024*8=476,因此只需申请512M的内存空间,每个bit位表示一个unsigned int。读入40亿个数,并设置相应的bit位为1.然后读取要查询的数,查看该bit是否为1,是1则存在,否则不存在。

      2.给40亿个unsigned int的整数,如何判断这40亿个数中哪些数重复?

      同理,可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位置1。如果是第一次读取某个数据,则在将该bit位置1之前,此bit位必定是0;如果是第二次读取该数据,则可根据相应的bit位是否为1判断该数据是否重复。

二.位图排序的实现

     由于在C语言中没有bit这种数据类型,因此必须通过位操作来实现。

     假如有若干个不重复的正整数,范围在[1-100]之间,因此可以申请一个int数组,int数组大小为100/32+1。

假如有数据32,则应该将逻辑下标为32的二进制位置1,这个逻辑位置在A[1]的最低位(第0位)。

因此要进行置1位操作,必须先确定逻辑位置:字节位置(数组下标)和位位置。

字节位置=数据/32;(采用位运算即右移5位)

位位置=数据%32;(采用位运算即跟0X1F进行与操作)。

分享到:
评论

相关推荐

    位图排序《编程珠玑》

    实现位图排序,其中假设n为10 000 000,且输入文件包含1 000 000个正数;具体细节详见《编程珠玑》第一章问题; 由于数据的大小问题,在这#define N 1000,即数据在1000以内的100个数据,进行排序(当然由于随机数...

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

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

    编程珠玑之位图排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数关联。 输出:按升序排列的输入整数列表。 约束:最多有(大约)1MB的...

    C++实现位图排序实例

    在《编程珠玑》一书里提到了一种算法导论里没有提到过的位图排序方法,这种排序方法是通过牺牲空间效率来追求时间效率(线性时间)以达到时间-空间折中与双赢的目的。本文以实例形式简单讲一下位图排序思想。 一、...

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

    《Programming Pearls》(编程珠玑下载)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下。 一、主要思想位图排序的思想就是在内存中申请一块连续的空间作为位图,初始时将位图的每一位都置...

    Java 位图法排序的使用方法

    本篇文章,小编将为大家介绍关于Java 位图法排序的使用方法,有需要的朋友可以参考一下

    二分法排序算法 C语言实现

    二分法排序算法 C语言实现 个人爱好 希望相互学习

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

    #资源达人分享计划#

    实现了图片背景(换肤)、外观定制、排序、拖拽功能于一身的CListCtrl(包括内置的CHeaderCtrl)的可复用类及其Demo程序

    1、ListCtrl和HeaderCtrl支持共用位图底图,可以整个应用程序使用同一张完整底图图片,完美实现换肤等需要; 2、ListCtrl和HeaderCtrl支持独立位图底图,绘制背景时各自使用自己的独立底图; 3、ListCtrl和...

    寻找位图中出现频次最多的颜色

    使用几种方法计算一个位图中出现频次最多的颜色

    以另一种位图的思想来解决一道OJ题目

    以前所接触到的位图的思想都是以1位的形式去存储某个数出现的次数是1次还是0次。常见的例子不外乎在《编程珠玑》上的开篇例子里,1千万个数的排序统计,用1.25M的内存空间就可以达到遍历一遍输入数据而排序好的目的...

    RGB位图转矢量图matlab

    代码实现了将彩色图像转换为矢量图形式的 SVG 文件,并保存。主要步骤如下: ...按照区域面积对区域进行排序。 将每个区域的轮廓向外扩展一定像素,并绘制模拟矢量图。 将绘制好的矢量图保存为 SVG 文件。

    C#实现bitmap 高效地排序 标记存储

    C#实现bitmap 高效地排序 标记存储

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

    今天小编就为大家分享一篇关于海量数据去重排序bitmap(位图法)在java中实现的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    基于预测与排序的大容量可逆水印算法 (2010年)

    针对大多数情况下可逆水印算法需要位图的情况,提出了一个不需要位图的可逆水印算法。该算法使用一种新的基于高效排序的全邻预测算法,经过排序以后形成预测误差集合,可以在很低失真度的情况下嵌入数据。实验的结果...

    RCS:重新排序ZX Spectrum屏幕以实现更好的压缩

    RCS在每个位图扇区内对字节重新排序,而不会影响属性。 如果在压缩之前应用RCS编码,则获得的压缩率应比通常至少好10%。 用法 要将RCS编码应用于文件,请使用命令行实用程序,如下所示: rcs Cobra.scr 这将生成...

Global site tag (gtag.js) - Google Analytics