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*/ ...
随机推荐
- pthreads多线程数据采集
以前使用curl的多线程并不是真正的多线程,只是一种模拟的多线程,现在使用pthreads来实现真正意义上的多线程. 下载: windows下: http://windows.php.net/down ...
- PHP面向对象之旅:static变量与方法
static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”. 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“ ...
- Hive启动时的棘手问题的处理
Hive是存在于Hadoop集群之上的数据仓库,作为大数据处理时的主要工具,对于大数据开发人员的重要性不言而喻.当然要使用Hive仓库的前提就是对于hive的安装,hive的安装是很简单的过程,主要关 ...
- webpack 学习笔记 01 使用webpack的原因
本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解. 伴随着websites演化至web apps的过程,有三个现象是很明显的: 页面中有越来越多的Js. 客户端能做的事情越来越多. 越来越少 ...
- linux动态库编译和使用详细剖析
引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, 预编译,编译,生成机械码最后链接输 ...
- automapper的简单用法
AutoMapper对象转换方面(Object-Object Mapping)对象映射工具,实现对象和对象之间的转化.主要应用在项目的dto,model,entity或viewmodel之间转换,其实 ...
- 用js进行日期的加减
如题,开始查了查js的使用文档,但没发现可以直接用的函数,于是就想自己写函数来着,这就要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,虽然不复杂但我想js应该不会这么低级,于是查了下 ...
- 7.Knockout.Js(Mapping插件)
前言 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些o ...
- C# socket 实现消息中心向消息平台 转发消息 (修改)
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
- flask环境配置
1.首先要看装python环境,最好是python 2.7版本的: 2.安装easy_install,至今也不确定这个东西是怎么装的,我先下载了一个ez_setup,用命令“python ez_set ...