BitMap排序
问题描述:
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排序的更多相关文章
- bitmap对海量无重复的整数排序--转
原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...
- 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法
外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
- 经典算法题每日演练——第十一题 Bitmap算法 (转)
http://www.cnblogs.com/huangxincheng/archive/2012/12/06/2804756.html 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash ...
- BitMap算法及其实现(Python)
BitMap概述 本文介绍 BitMap 算法的应用背景,算法思想和相关实现细节. 概括而言,BitMap 主要用来解决海量数据中元素查询,去重.以及排序等问题.这里对海量数据场景的强调,似乎暗示了这 ...
- Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高!
Android拼图游戏的设计逻辑,从切图到交互动画,从关卡到倒计时,实例提高! 群英传的最后一章,我大致的看了一下这个例子,发现鸿洋大神也做过,就参考两个人的设计逻辑,感觉都差不多,就这样实现起来了 ...
- 算法——001BitMap(位图)算法
哈希表在查找定位操作上具有O(1)的常量时间,常用于做性能优化,但是内存毕竟是有限的,当数据量太大时用哈希表就会内存溢出了.而考虑对这些大数据进行存盘分批处理又有IO上的开销,性能又不能满足要求.这个 ...
- PHP实现 bitmap 位图排序 求交集
2014年12月16日 17:15:09 初始化一串全为0的二进制; 现有一串无序的整数数组; 如果整数x在这个整数数组当中,就将二进制串的第x位置为1; 然后顺序读取这个二进制串,并将为1的位转换成 ...
- BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
BitMap利用byte特性 针对排序+去重 最佳实践: 100万条数据的排序+去重用时200毫秒左右 static void Main(string[] args) { ]; /*alias*/ ...
随机推荐
- 获取屏幕分辨率(C#)
C#获取屏幕分辨率的方法 static void Main(string[] args) { // 控制台程序,需要添加程序集: // using System.Drawing; // using S ...
- group by和distinct语句的执行顺序
同一条语句之中,如果同时有group by和distinct语句,是先group by后distinct,还是先distinct后group by呢? 先说结论:先group by后distinct. ...
- php __clone需要注意的问题
当一个对象的属性是另外一个对象时,当有一个对象复制该对象时,当复制到这个属性(一个对象)时,只复制这个属性(对象)的引用,而不复制引用的对象. class Account{ public $bal ...
- (转)最强Android模拟器genymotion的安装与配置
Android开发人员都知道,原生的模拟器启动比较慢,操作起来也不流畅,还会出现莫名的问题.当然很多人都会选择直接使用android手机来开发,但是有时候需要在投影仪上演示程序的时候手机不太好做到吧. ...
- 【Servlet】—在servlet中常混的请求路径
在页面请求,后台获取相关请求路径是,自己长搞混的几个路径,再次做次标记,不要每次使用想不起来是,都去写一个小的demo来测试. request.getContextPath(); request.ge ...
- Delphi CxGrid 汇总(2)
17. 怎样设计多表头的cxGrid? 解决:cxGrid可以解决如下的表头: --------------------------------- | 说明1 | 说明2 | ------------ ...
- Castle 集锦
Castle Windsor http://www.cnblogs.com/RicCC/archive/2010/03/30/castle-windsor-ioc-di.html 官方配置说明(反正我 ...
- angularjs2 学习笔记(三) 服务
在anglar2中服务是什么? 如果在项目中有一段代码是很多组件都要使用的,那么最好的方式就是把它做成服务. 服务是一种在组件中共享功能的机制,当我们使用标签将多个组件组合在一起时我们需要操作一些数据 ...
- 老工程升级到VS2010或以上时会出现 libc.lib 解决方法
有些网上的工程都比较老,比如用2003之类.一般会有个静态libc.lib.在新版本里已经没有这个库,被微软无情的抛弃. 编译时会出现动态库找不到: 1>LINK : fatal error L ...
- 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
通过阅读MongoDB 3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...