2-BitMap算法是BitMap算法的一种扩展,核心是:每个数分配2个bit,00表示不存在,01表示出现一次,10表示出现2次,11表示多次或无意义。

一个int类型,占4个字节,在2-BitMap中可以表示16个数,表示全部int类型数据需要内存2^32*2bit=1G。时间复杂度O(n)。

经常用来解决的问题如下:

2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。

分析:

每个数据分配2个bit,然后扫描这 2.5亿个整数,查看 Bitmap中相对应位,如果是 00 变 01 ,01 变 10 ,10 保持不变。所描完 事后,查看bitmap,把对应位是 01 的.

代码如下:

0x3是十六进制,在十进制中表示3

public class TwoBitMap {

//用两个bit为来标记某个元素的个数

int bNum=2;

//一个32位字节能标记多少个数

int bSize=32/bNum;

//数据范围(0到2^32内的数)

int numSize = 160000;//此处是16万,便于测试

//定义bitmap数组大小

int arraySize =(int)Math.ceil((double)numSize/bSize);

private int array[] = new int[arraySize];

/**

* 初始化BitMap

*/

public void initBitMap(){

for(int i=0;i

array[i] = 0;

}

}

/**

* 往BitMap中设置对应的数的个数

* @param x 要添加的数

* @param num 对应的个数

*/

public void set(int x,int num){

//获得bitMap的下标

int m = x >> 4;//或 int m = x /bSize;

//获得对应的位置

int n = x % bSize;

//将x对应位置上的数值先清零,但是有要保证其他位置上的数不变

array[m] &= ~((0x3<

//重新对x的个数赋值

array[m] |= ((num&3)<

// printInfo(array[m]);

}

/**

* 获取x在BitMap中的数量

* @param x

* @return

*/

public int get(int x){

int m = x >> 4;

int n = x % bSize;

return (array[m] & (0x3<> (2*n);

}

/**

* 往BitMap中添加数

* 如果x的个数大于三,则不在添加(2个bit为最多只能表示到3:00 01 10 11)

* @param x

*/

public void add(int x){

int num = get(x);

//只处理num小于3的

if(num<3) {

set(x, num + 1);

}

}

public static void main(String[] args) {

TwoBitMap test = new TwoBitMap();

test.initBitMap();

int sortArray[] = new int[]{1,4,1,32,2,6,4,2,69,9,4,185,2};

for(int i=0;i

test.add(sortArray[i]);

}

System.out.println("对BitMap中的所有数据排序:");

for(int i=0;i

if(test.get(i) !=0){

// System.out.print((i)+"出现的次数:"+test.get(i)+" ");

System.out.print(i+" ");

}

}

System.out.println("\n只出现一次的数据:");

for(int i=0;i

if(test.get(i) == 1){

System.out.print(i+" ");

}

}

}

/**

* 输出一个int的二进制数

* @param num

*/

public static void printInfo(int num){

System.out.println(num+" 二进制为"+Integer.toBinaryString(num));

}

}

java bitmap 排序_Java实现2-BitMap排序相关推荐

  1. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  2. java中queue排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  3. java对象排序_Java™ 教程(对象排序)

    对象排序 List l可以如下排序. Collections.sort(l); 如果List包含String元素,它将按字母顺序排序,如果它由Date元素组成,它将按时间顺序排序,这是怎么发生的?St ...

  4. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  5. java util 排序_Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...

  6. java comparable排序_java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 packa ...

  7. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  8. java自然排序_Java中的自然排序顺序字符串比较 - 是内置的吗?

    String实现了Comparable,这就是Java中的自然顺序(使用类似的接口进行比较).您可以将字符串放在TreeSet中,也可以使用Collections或Arrays类进行排序. 但是,在您 ...

  9. java线程排序_Java中的并发排序

    我目前正在开发一个程序来同时对字符串进行排序.我的程序接收一个文件,将文件的每一行读入一个数组,并将字符串数组拆分成较小的字符串数组.然后,程序为每个较小的数组启动一个线程,并对它们进行快速排序.每个 ...

  10. java 线性表排序_Java线性表的排序

    Java线性表的排序 前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下"." ...

最新文章

  1. 数据库期末复习样卷,临时抱佛脚高分通过考试
  2. python学习笔记系列----(五)输入和输出
  3. 4.无监督学习--K-means聚类
  4. 关于access数据库打不开
  5. Hibernate-Criteria
  6. 学习笔记 ---- 设计模式之观察者模式
  7. 深度学习里面的正态分布
  8. unity Rigidbogy组件
  9. 计算机前摄像头怎么录视频教程,电脑摄像头录制视频_电脑摄像头录像怎么录...
  10. Nginx学习使用记录
  11. 小米平板2刷remix_【游戏体验】老旧电脑装安卓系统当平板玩街球
  12. 西安硬科技创新大会前奏,一起玩转陕西首档广播双创节目乐创power
  13. 【SpringBoot 】 十三、使用Redis
  14. 【快速幂取模】NOI 7833:幂的末尾
  15. The application was unable to start correctly (0xc000007b)的勉强解决方案
  16. TIA博途SCL入门学习(二)常用基本控制语句用法和举例
  17. 数据仓库的四个层次设计
  18. java在文件尾部写文件_Java在文件尾部追加内容
  19. 平方求和、立方求和公式
  20. oracle数据库查询近五年数据,Oracle数据库查询基本数据

热门文章

  1. npm命令运行时报错_运行npm update等命令出错后如何分析问题根源(示例代码)
  2. Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索
  3. Python中的datetime日期格式化
  4. 在ibatis中做等值判断(if-else)
  5. Linux中切换用户(su命令)
  6. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅
  7. oracle清理trace、alert、aud、listener等日志文件
  8. ideadebug热更新_Spring Boot 在IDEA中debug时的hot deployment(热部署)
  9. json序列化时忽略属性设置
  10. Java语言 List 和 Array 相互转换