问题描述:

      BitMap排序思想:

            用1bit位标记某个元素对应的值

      优点:

            效率高,不允许进行比较和移位

            占用内存少,比如32个整数,使用bit存储需要4byte,使用int数组需要32*4byte

     缺点:

           无法对重复数据进行排序和查找

    应用场景:

                ①:对10亿个不重复的整数进行排序。

                ②:找出10亿个数字中重复的数字。

 

算法实现:

/*
* BitMap算法
* 思想:
* 用1bit位来标记某个元素对应的value,而key即是该元素。
*
* 优点:
* 效率高,不允许进行比较和移位
* 占用内存少,比如32个整数,使用bit存储需要4byte数据存储,使用数组需要32byte
*
* 缺点:
* 无法对重复的数据进行排序和查找
*/ #ifndef BitMap_H
#define BitMap_H using std::cout;
using std::endl; #define ByteLength 8 //返回数组元素中的最大值
int getMax(int* array,int size)
{
int max=array[0];
for (int i=1;i<size;i++)
max=array[i]>max?array[i]:max;
return max;
} //返回存储数组需要的byte个数
int getByteCount(int* array,int size)
{
int max=getMax(array,size);
int byteCount=max/ByteLength+1; //BitMap存储该数组需要byteCount个字节
return byteCount;
} //返回存储整数对应的byte索引
int index(int data)
{
return data/ByteLength;
} //返回存储整数对应的byte偏移
int shift(int data)
{
return data%ByteLength;
} //BitMap排序
void bitmapSort(int* array,char* byteArray,int size)
{
int j=0;
int k=0;
for (int i=0;i<size;i++)
{
j=index(array[i]);
k=shift(array[i]);
byteArray[j] |= (char)(k>0?(1<<k):0); //注意k为0的情况
}
} //输出byte位为1时对应的值
void getValue(char data,int index)
{
if (data & 0x1==0) //data为0的情况
{
cout<<index*ByteLength<<"\t";
} for (int i=0;i<ByteLength;i++)
{
if (data & (char)(1<<i))
cout<<index*ByteLength+i<<"\t";
}
} //输出排序后的数组
void print(char* array,int size)
{
int count=0;
for (int i=0;i<size;i++)
{
if (count>0 && count%10==0)
cout<<endl; if (array[i]==0)
{
continue;
}
else
{
getValue(array[i],i);
count++;
}
}
cout<<endl;
} #endif

BitMap排序的更多相关文章

  1. bitmap对海量无重复的整数排序--转

    原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...

  2. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  3. 经典算法题每日演练——第十一题 Bitmap算法

    原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...

  4. 经典算法题每日演练——第十一题 Bitmap算法 (转)

    http://www.cnblogs.com/huangxincheng/archive/2012/12/06/2804756.html 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash ...

  5. BitMap算法及其实现(Python)

    BitMap概述 本文介绍 BitMap 算法的应用背景,算法思想和相关实现细节. 概括而言,BitMap 主要用来解决海量数据中元素查询,去重.以及排序等问题.这里对海量数据场景的强调,似乎暗示了这 ...

  6. Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!

    Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...

  7. 算法——001BitMap(位图)算法

    哈希表在查找定位操作上具有O(1)的常量时间,常用于做性能优化,但是内存毕竟是有限的,当数据量太大时用哈希表就会内存溢出了.而考虑对这些大数据进行存盘分批处理又有IO上的开销,性能又不能满足要求.这个 ...

  8. PHP实现 bitmap 位图排序 求交集

    2014年12月16日 17:15:09 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这个二进制串,并将为1的位转换成 ...

  9. BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序

    BitMap利用byte特性 针对排序+去重  最佳实践: 100万条数据的排序+去重用时200毫秒左右 static void Main(string[] args) { ]; /*alias*/ ...

随机推荐

  1. 获取屏幕分辨率(C#)

    C#获取屏幕分辨率的方法 static void Main(string[] args) { // 控制台程序,需要添加程序集: // using System.Drawing; // using S ...

  2. group by和distinct语句的执行顺序

    同一条语句之中,如果同时有group by和distinct语句,是先group by后distinct,还是先distinct后group by呢? 先说结论:先group by后distinct. ...

  3. php __clone需要注意的问题

      当一个对象的属性是另外一个对象时,当有一个对象复制该对象时,当复制到这个属性(一个对象)时,只复制这个属性(对象)的引用,而不复制引用的对象. class Account{ public $bal ...

  4. (转)最强Android模拟器genymotion的安装与配置

    Android开发人员都知道,原生的模拟器启动比较慢,操作起来也不流畅,还会出现莫名的问题.当然很多人都会选择直接使用android手机来开发,但是有时候需要在投影仪上演示程序的时候手机不太好做到吧. ...

  5. 【Servlet】—在servlet中常混的请求路径

    在页面请求,后台获取相关请求路径是,自己长搞混的几个路径,再次做次标记,不要每次使用想不起来是,都去写一个小的demo来测试. request.getContextPath(); request.ge ...

  6. Delphi CxGrid 汇总(2)

    17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...

  7. Castle 集锦

    Castle Windsor http://www.cnblogs.com/RicCC/archive/2010/03/30/castle-windsor-ioc-di.html 官方配置说明(反正我 ...

  8. angularjs2 学习笔记(三) 服务

    在anglar2中服务是什么? 如果在项目中有一段代码是很多组件都要使用的,那么最好的方式就是把它做成服务. 服务是一种在组件中共享功能的机制,当我们使用标签将多个组件组合在一起时我们需要操作一些数据 ...

  9. 老工程升级到VS2010或以上时会出现 libc.lib 解决方法

    有些网上的工程都比较老,比如用2003之类.一般会有个静态libc.lib.在新版本里已经没有这个库,被微软无情的抛弃. 编译时会出现动态库找不到: 1>LINK : fatal error L ...

  10. 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).

    通过阅读MongoDB  3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...