这个算法相当的有创意,对于处理一些海量数据来说,该算法太具有代表性了,直接使用了bit为单位来存储数据,大大节省了存储空间,关键还有另外一点就是该算法对存储数据的检索效率那是相当的高。

package com.au.algorithm;import java.util.ArrayList;
import java.util.List;/*** 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,* 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。* * 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,* 假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。 那么我们就可以采用Bit-map的方法来达到排序的目的。* 要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间, 将这些空间的所有Bit位都置为0。* * @author fuyouming* */
public class BitMap {private int min = 0;private int max = 10;private byte[] bytes;public BitMap(int min, int max) {this.min = min;this.max = max;init();}public BitMap() {init();}private void init() {int l = (max - min + 1) + 8 / 8;bytes = new byte[l];for (int i = 0; i < l; i++) {bytes[i] = 0;}}public void add(int i) {i -= min;int idx = i / 8;int off = i % 8;ensureCapacity(idx);// 位左移,将对应的Bit位赋值1bytes[idx] = (byte) (bytes[idx] | 0x01 << off);}private void ensureCapacity(int index) {if (index + 1 > bytes.length) {byte[] oldBytes = bytes;bytes = new byte[Math.max(10, index) + 1];System.arraycopy(oldBytes, 0, bytes, 0, oldBytes.length);}}public void addAll(int[] intArr) {for (int i : intArr) {add(i);}}public List<Integer> getAll() {List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < bytes.length; i++) {for (int j = 0; j < 8; j++) {// 判断该位上是否是1,进行输出,这里的判断比较笨。// 首先得到该第j位的掩码(0x01<<j),将内存区中的// 位和此掩码作与操作。最后判断掩码是否和处理后的// 结果相同if ((bytes[i] & (0x01 << j)) == (0x01 << j)) {list.add(i * 8 + j + min);}}}return list;}public static void main(String[] args) {java.util.Random ran = new java.util.Random();int intArr[] = { 3, 5, 2, 10, 6, 12, 8, 14, 9 };BitMap bitmap = new BitMap(2, 14);bitmap.addAll(intArr);// BitMap bitmap = new BitMap(10000000, 99999999);// for (int i = 0; i < 100000; i++) {// bitmap.add(Math.max(10000000 + ran.nextInt(99999999), 99999999));// }List<Integer> list = bitmap.getAll();for (Integer o : list) {System.out.println("out: " + o);}}
}

傅老师课堂:BitMap相关推荐

  1. 傅老师课堂:Oracle高级应用之合并MERGE

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. MERGE是什么?这么厉害的东西你都不知道,你这学生是怎么学习的?老师不给你讲你就不会自学了吗?哎!可怜天下老师心啊, ...

  2. 傅老师课堂:Oracle高级查询之GROUP BY

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. 现在客户的需求是统计部门中每种工作的工资总额,最后还需要统计所有人的工资总数,相信这样的需求对大家来说还是比较简单的, ...

  3. 傅老师课堂:Ajax高级应用之DWR原理解析(二)

    开篇一笑:周杰伦在沙漠中迷路了,这时他捡到一个神灯,他摸摸神灯,出来一个神仙,神仙说,我能满足你三个愿望.周杰伦一看,高兴的脱口而出:"哇塞,屌爆了!"结果,他痛苦的在地上呻吟.神 ...

  4. 傅老师课堂:TrieTree

    TrieTree与其说是一种算法,还不如说是一种解题的思路,我对海量数据的处理一直都是保持着一种积极的学习态度,TrieTree可以说是处理海量数据诸多方法中比较典型的一种,下面我提供了两种TrieT ...

  5. oracle高级函数去重,傅老师课堂:Oracle高级应用之去重聚合函数

    开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车.我坐在后座看到前面一大妈跑步,很猥琐的对同学说:"你看前面那个肥婆跑得屁股都甩圆了!"这货沉默了一下.当我们和大妈擦身而过 ...

  6. 傅老师课堂:最大子序列

    直接贴代码,文字描述留待以后添加. package com.au.algorithm;/*** 最大子序列,动态规划思想.* * @author fuyouming* */ public class ...

  7. 傅老师课堂:Oracle高级查询之CONNECT BY

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递 ...

  8. 傅老师课堂:Oracle高级应用之解锁表

    每篇一笑:老鼠去方便,见熊也在,吓得不吭声,熊看了眼老鼠说:你掉不掉毛?老鼠哆嗦不语,熊又问:掉不掉毛?老鼠说:不掉!熊抓住老鼠擦擦屁股走了. 锁机制用于管理对共享资源的并发访问.注意,我说的是&qu ...

  9. 傅老师课堂:Oracle高级查询之OVER (PARTITION BY ..)

    [size=large][size=large][size=large]开篇一笑:某日一妹子对男友说:在一起这么久了你都没有夸过我漂亮,今天我要你夸夸我,男子想了一会看着女友鸡冻的说道:我硬了. 为了 ...

最新文章

  1. 2018年JavaWeb和移动程序员学习的12个框架
  2. MES系统模块设计之物料控制 Material Control -- 1
  3. 【面经】蚂蚁金服一二三面的面经总结(内推实习方面)
  4. 一个10年SEO工作者的35个SEO经验
  5. exhaustion java_Java Player.setExhaustion方法代碼示例
  6. 利用SQL语言修正与撤销数据库
  7. 视频分享:做“有料”的计算机大学生
  8. 不同计算机系统数据表示,计算机系统基础--第二章(数据的机器级表示与处理)...
  9. 基于jsp(java)学生成绩管理系统的设计和实现
  10. 在linux系统如何获得窗口句柄,编写控制台程序,获得标准输入输出的窗口句柄...
  11. WDM驱动实操No.1
  12. 二进制、八进制、十进制与十六进制的转换大全
  13. autoCAD 使用选择集
  14. 磊科路由器信号按键_磊科怎么隐藏wifi信号 磊科路由器如何隐藏wifi信号?-192路由网...
  15. 深度学习辅助决策医疗器械软件审评要点及相关说明
  16. alios下载_AliOS Studio开源工具|AliOS Cloud App集成开发环境(AliOS Studio)下载 v1.2.1 官方Windows版 - 比克尔下载...
  17. 【Python】【教程】Python 教程
  18. 不加班,最高20天全薪年假在微软做程序员究竟有多爽?
  19. 微信公众号游戏 服务器,永不消逝的69号服务器
  20. 湖南计算机本科,湖南搞计算机科学与技术的本科有哪些?

热门文章

  1. Python工程之设计模式总结
  2. 关于Java RDP协议实现远程桌面连接的开源项目properjavardp
  3. Python日期时间处理库dateutil
  4. JAVA键盘录入 分支结构if swtich语句+循环结构for while语句 练习
  5. 如何优雅的研究 RGSS3 (三) 调整窗口的细节
  6. asp.net园林绿化服务交易网站
  7. java车间调度算法_混合算法(GA+TS)求解作业车间调度问题代码解读+完整JAVA代码...
  8. 织梦CMS整站源码通用安装教程
  9. 仓库规模操作系统的背景之仓库规模计算机
  10. 电脑系统32位和64位有哪些区别?32位和64位是什么意思 ?