问题描述:

      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. Linux搭建NFS提供磁盘给Windows使用

    在Windows2008系统下设置挂载Linux服务器磁盘 一.系统环境 系统平台:CentOS release 5.8 (Final) NFS Server IP:X....X...153.157 ...

  2. 单列模式(data与business交互)

    public class CommentsBusiness //Business { #region 单列模式 private static CommentBusiness instance; pri ...

  3. C#生成不重复随机数列表

    C#生成不重复(随机数 http://www.jbxue.com/tags/suijishu.html)列表实例的代码.例子: ;             Random rnd = ; i <  ...

  4. Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值

    感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...

  5. 第二章 管理程序流(In .net4.5) 之 管理多线程

    1. 概述 本章包括同步资源以及取消长时间任务相关的内容. 2. 主要内容 2.1 同步资源 ① lock关键字实现.会阻塞程序,有可能会导致死锁. ② volatile关键字可以禁用编译优化,用于避 ...

  6. SRF之权限控制

    框架目前提供url访问.菜单和页面元素的权限控制和数据权限,权限基于角色来分配,1个用户可以属于多个角色,权限项分模块.页面.操作3级别,其中模块.页面用于url和菜单的控制,操作是对页面元素的控制. ...

  7. MIFARE系列1《MIFARE简介》

    随着社会的发展,智能卡在很多领域得到了广泛的应用.特别是非接触卡,由于使用方便以及功能强大的特点,在管理.公交.工作证.身份识别等领域得到了快速的普及和推广. 非接触卡已经逐步发展成为一个独立的跨学科 ...

  8. 菜鸟学习Hibernate——简单的一个例子

    一.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了能够使用Hibernate快速上手,我们先讲解一个简单的Hibernate应用实例hibernate ...

  9. DB2物化表

    DB2物化查询表(MQT)是DB2数据库中一类特殊的表 物化表和视图的区别 物化表是一个查询结果集,视图是一个SQL语句. 以下是一个简单例子(说明物化表) 1.创建表,插入测试数据 ----创建表 ...

  10. MongoDB牛刀小试

    MongoDB基本操作 1.MongoDB的启动 首先创建一个目录作为MongoDB的工作目录: 进入MongoDB的bin目录: 执行mongod命令,使用参数--dbpath指定MongoDB的工 ...