`

位图排序

 
阅读更多

       位图排序是一种效率极高(复杂度可达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++实现位图排序实例

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

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

    位图排序算法的优势在于其时间复杂度为O(n),在内存开销方面,位图排序只需要足够的位数来表示数据集合中所有可能的值。不过,这种方法在某些情况下仍然存在限制,例如当输入文件中的整数范围非常大时,可能需要超过...

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

    位图排序是一种特殊的排序算法,尤其适用于处理包含无重复元素的整数集合。该方法利用了计算机内存中的一位可以代表一个状态的事实,通常用于表示一个整数是否存在。位图排序的基本思想是创建一个与待排序数据最大值...

    个人针对学习几种排序算法的总结

    位图排序是一种使用位运算的高效排序方法,特别适合于排序那些可以表示为固定范围的整数数组。它通过建立一个位图,每一位对应一个数据值,然后依次检查每个数据值,并在位图上相应位置置为1,最终通过位图直接生成...

    你要找的这里~滴滴滴1

    【部分内容】:介绍了使用位图排序解决十亿个QQ号判断问题的思路与方法。 在Java面试中,位图排序是一种有效的数据处理策略,特别是在处理大量数据且内存有限的情况下。本例中,问题是如何在一个十亿个QQ号的列表中...

    Java 位图法排序的使用方法

    位图法排序是一种在特定情况下效率较高的排序技术,尤其适用于数据范围相对较小的整数排序。这种方法基于位操作,利用数组来表示一个位图,其中每一位对应一个可能的数值。在Java中,虽然标准库中的排序算法如`...

    点阵LCD液晶模块的实现方案

    位图必须是黑白单色并旋转270度,然后通过添加到下载位图排序中。连接模块和电脑后,选择正确的串口,使用“状态测试”检查连接,然后下载位图到模块的FLASH中。下载完成后,断电并切换模块至正常模式,再次上电,就...

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

    根据给定的文件信息,我们可以总结出以下关于“二分法排序算法C语言实现”的相关知识点: ### 1. 二分法搜索算法原理 二分法搜索算法,也称为折半查找算法,是一种在有序数组中查找特定元素的搜索算法。其基本思想...

    c# 实现位图算法(BitMap)

    2. 不可对重复的数据进行排序和查找。 C# 中的 BitMap 实现 在 .NET 中已经实现了 BitMap 的数据结构——BitArray,我们可以直接使用官方的 BitArray 来解决问题。但是,我们也可以参照 .NET 源码实现一个简化版的...

    BMP位图转换AVI视频例程

    然后,这些帧按照特定的帧率进行排序和组合,形成连续的动态画面。 4. **编程实现**:通常,这个过程可以通过编程语言如C++、Python或Java来实现,利用图像处理库如OpenCV、FFmpeg等。例如,在OpenCV中,可以使用...

    mfc实现排序算法的动态演示 (源程序)

    `res`文件夹通常包含应用程序所需的资源,如位图、图标等,而`sortTest.dsw`是Visual Studio的工作空间文件,用于管理项目。 在MFC环境中,动态演示排序算法可能涉及到使用C++的绘图函数,如GDI(Graphics Device ...

    pb 点击标题排序 title order powerbuild9

    1. ORDERUP.BMP和ORDERDW.BMP:这可能是两个位图文件,分别表示升序和降序的图标。在PowerBuilder中,可以将这些图标设置到DataWindow的列标题上,以视觉上指示当前的排序状态。 2. DWSORT.PBL:这是一个Power...

    能够自动排序的源代码适合初学者下载

    - .BMP 文件是位图图像文件,通常用于存储项目中的图标或图片资源。 - .CFG 文件是配置文件,可能包含了项目的设置和编译选项。 - .DCU 文件是编译后的单元文件,包含了编译过的Pascal源代码,是DELPHI编译后生成的...

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

    在图像处理领域,有时我们需要分析位图(Bitmap)中的颜色分布,找出最常出现的颜色,这一过程称为“颜色直方图”分析。本主题将深入探讨如何使用不同的算法和技术来解决这个问题,包括位图的基本概念、颜色表示法、...

Global site tag (gtag.js) - Google Analytics