`
kjkhi
  • 浏览: 181691 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

大数据处理--BitSet

阅读更多

java.util.BitSet可以按位存储。
计算机中一个字节(byte)占8位(bit),我们java中数据至少按字节存储的,
比如一个int占4个字节。
如果遇到大的数据量,这样必然会需要很大存储空间和内存。
如何减少数据占用存储空间和内存可以用算法解决。
java.util.BitSet就提供了这样的算法。
比如有一堆数字,需要存储,source=[3,5,6,9]
用int就需要4*4个字节。
java.util.BitSet可以存true/false。
如果用java.util.BitSet,则会少很多,其原理是:
1,先找出数据中最大值maxvalue=9
2,声明一个BitSet bs,它的size是maxvalue+1=10
3,遍历数据source,bs[source[i]]设置成true.

最后的值是:
(0为false;1为true)
bs [0,0,0,1,0,1,1,0,0,1]
                3,   5,6,       9

这样一个本来要int型需要占4字节共32位的数字现在只用了1位!
比例32:1  

这样就省下了很大空间。

 

 

看看测试例子

[html] view plaincopy
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MainTestThree {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         BitSet bm=new BitSet();  
  12.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  13.         bm.set(0);  
  14.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  15.         bm.set(1);  
  16.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  17.         System.out.println(bm.get(65));  
  18.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  19.         bm.set(65);  
  20.         System.out.println(bm.isEmpty()+"--"+bm.size());  
  21.     }  
  22.   
  23. }  

 输出:
 true--64
false--64
false--64
false
false--64
false--128
 
说明默认的构造函数声明一个64位的BitSet,值都是false。
如果你要用的位超过了默认size,它会再申请64位,而不是报错。

[html] view plaincopy
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MianTestFour {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         BitSet bm1=new BitSet(7);  
  12.         System.out.println(bm1.isEmpty()+"--"+bm1.size());  
  13.           
  14.         BitSet bm2=new BitSet(63);  
  15.         System.out.println(bm2.isEmpty()+"--"+bm2.size());  
  16.           
  17.         BitSet bm3=new BitSet(65);  
  18.         System.out.println(bm3.isEmpty()+"--"+bm3.size());  
  19.           
  20.         BitSet bm4=new BitSet(111);  
  21.         System.out.println(bm4.isEmpty()+"--"+bm4.size());  
  22.     }  
  23.   
  24. }  


 

输出:
true--64
true--64
true--128
true--128

说明你申请的位都是以64为倍数的,就是说你申请不超过一个64的就按64算,超过一个不超过
2个的就按128算。

 

[html] view plaincopy
 
  1. package com;  
  2.   
  3. import java.util.BitSet;  
  4.   
  5. public class MainTestFive {  
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {  
  11.         int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};  
  12.         BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));  
  13.         System.out.println("bm1.size()--"+bm1.size());  
  14.           
  15.         MainTestFive.putValueIntoBitSet(shu, bm1);  
  16.         printBitSet(bm1);  
  17.     }  
  18.       
  19.     //初始全部为false,这个你可以不用,因为默认都是false  
  20.     public static void initBitSet(BitSet bs){  
  21.         for(int i=0;i<bs.size();i++){  
  22.             bs.set(i, false);  
  23.         }  
  24.     }  
  25.     //打印  
  26.     public static void printBitSet(BitSet bs){  
  27.         StringBuffer buf=new StringBuffer();  
  28.         buf.append("[\n");  
  29.         for(int i=0;i<bs.size();i++){  
  30.             if(i<bs.size()-1){  
  31.                 buf.append(MainTestFive.getBitTo10(bs.get(i))+",");  
  32.             }else{  
  33.                 buf.append(MainTestFive.getBitTo10(bs.get(i)));  
  34.             }  
  35.             if((i+1)%8==0&&i!=0){  
  36.                 buf.append("\n");  
  37.             }  
  38.         }  
  39.         buf.append("]");  
  40.         System.out.println(buf.toString());  
  41.     }  
  42.     //找出数据集合最大值  
  43.     public static int getMaxValue(int[] zu){  
  44.         int temp=0;  
  45.         temp=zu[0];  
  46.         for(int i=0;i<zu.length;i++){  
  47.             if(temp<zu[i]){  
  48.                 temp=zu[i];  
  49.             }  
  50.         }  
  51.         System.out.println("maxvalue:"+temp);  
  52.         return temp;  
  53.     }  
  54.     //放值  
  55.     public static void putValueIntoBitSet(int[] shu,BitSet bs){  
  56.         for(int i=0;i<shu.length;i++){  
  57.             bs.set(shu[i], true);  
  58.         }  
  59.     }  
  60.     //true,false换成1,0为了好看  
  61.     public static String getBitTo10(boolean flag){  
  62.         String a="";  
  63.         if(flag==true){  
  64.             return "1";  
  65.         }else{  
  66.             return "0";  
  67.         }  
  68.     }  
  69.   
  70. }  


 


输出:
maxvalue:42
bm1.size()--64
[
0,0,1,0,0,1,1,0,
0,0,0,0,0,0,0,1,
0,0,1,0,0,0,0,0,
0,1,0,0,1,0,0,1,
0,1,0,0,0,1,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
]

这样便完成了存值和取值。
注意它会对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1.

出现的次数这个信息就丢了。

 

转:http://blog.csdn.net/lushuaiyin/article/details/7546144

分享到:
评论

相关推荐

    javabitset源码-awesome-go-cn:AwesomeGo项目的中文翻译

    bitset源码 Awesome Go 中文翻译 awesome Go项目的中文翻译,原文请点击 . 贡献 首先请看一下这个 。同时感谢这些 。 you rock! 如果你看到下面的某个项目已经不再被支持或者并不适用,请提交一个pull request建议来...

    Java工具包提供了强大的数据结构

    Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类: ...该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。

    大数据存储系统与管理1

    引入java.util.BitSet,使用BitSet类实现。同时,为每一维数据分配一组 hash 函支持三维数据处理的 Bloom Filter 需要的变量如

    C和C++头文件对比一览

    #include &lt;bitset&gt; //STL 位集容器 #include #include #include #include #include &lt;complex&gt; //复数类 #include #include #include #include #include &lt;deque&gt; //STL 双端队列容器 #include &lt;exception&gt;...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    8.4.2 BitSet 8.4.3 Stack 8.4.4 Hashtable 8.4.5 再论枚举器 8.5 排序 8.6 通用集合库 8.7 新集合 8.7.1 使用Collections 8.7.2 使用Lists 8.7.3 使用Sets 8.7.4 使用Maps 8.7.5 决定实施方案 8.7.6 未支持的操作 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    8.4.2 BitSet 8.4.3 Stack 8.4.4 Hashtable 8.4.5 再论枚举器 8.5 排序 8.6 通用集合库 8.7 新集合 8.7.1 使用Collections 8.7.2 使用Lists 8.7.3 使用Sets 8.7.4 使用Maps 8.7.5 决定实施方案 8.7.6 未支持的操作 ...

    本人精心收集,c++头文件一览

    bitset&gt; //STL 位集容器 #include &lt;cctype&gt; #include &lt;cerrno&gt; #include &lt;clocale&gt; #include &lt;cmath&gt; #include &lt;complex&gt; //复数类 #include &lt;cstdio&gt; #include &lt;...

    C++大学教程,一本适合初学者的入门教材(part1)

    11.7.7 大/小写控制(ios:uppercase) 11.7.8 设置及清除格式标志(flags、setiosflags、resetiosflags) 11.8 流错误状态 11.9 把输出流连到输入流上 小结 术语 自测练习 自测练习答案 练习 第12章 模板 12.1 ...

    Java21Days_Exercises:学习Java的练习

    数据结构(BitSet,ArrayList,Stack,HashMap,通用对象,枚举)。 Swing库: -接口的基本组件, 布局-FlowLayout,BoxLayout,GridLayout,BorderLayout,CardLayout, -事件处理, -Graphics2D类, -Java Web ...

    tarantool:在RAM中获取数据。 使计算接近数据。 欣赏表演

    全面支持Lua模块和丰富的自有模块,包括协作式多任务处理,非阻塞I / O,对外部数据库的访问等 数据库的主要功能: ANSI SQL,包括视图,联接,引用和检查约束 MsgPack数据格式和基于MsgPack的客户端-服务器协议 ...

    写给大忙人看的JAVA SE 8

    6.2.2 批量数据操作 134 6.2.3 Set视图 136 6.3 并行数组操作 137 6.4 可完成的Future 138 6.4.1 Future 138 6.4.2 编写Future 139 6.4.3 Future流水线 139 6.4.4 编写异步操作 141 练习 143 第7章 JavaScript引擎...

    C++ Primer第四版【中文高清扫描版】.pdf

    3.5.1 bitset对象的定义和初始化 88 3.5.2 bitset对象上的操作 90 小结 92 术语 92 第4章 数组和指针 95 4.1 数组 96 4.1.1 数组的定义和初始化 96 4.1.2 数组操作 99 4.2 指针的引入 100 4.2.1 什么是指针 100 ...

    CCF CSP2012-4 区块链[解决中0.8]

    用邻接链表换了bitset,无明显改善效果,去掉了结束后的指针保护无明显效果.手动处理输入无明显结果 第二版拿到了80分超时了, 减掉了消息队列中消息传递时相同的时候取消传递. 题目内容...

    C++标准程序库STL的架构

    2.4 基本类型数据初始化 3 2.5 异常处理 4 2.6 命名空间 4 2.7 using声明 4 2.8 namespace std 4 2.9 explicit关键字 5 2.10 新的类型转换符 5 2.11 静态常量成员的初始化 6 2.12 时间复杂度O记号 6 3 一般概念 7 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    11.7.7 大/小写控制(ios:uppercase) 11.7.8 设置及清除格式标志(flags、setiosflags、resetiosflags) 11.8 流错误状态 11.9 把输出流连到输入流上 小结 术语 自测练习 自测练习答案 练习 第12章 模板 12.1 ...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     3.5 标准库bitset类型  小结  术语  第4章 数组和指针  4.1 数组  4.2 指针的引入  4.3 C风格字符串  4.4 多维数组  小结  术语  第5章 表达式  5.1 算术操作符  5.2 关系操作符和逻辑...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     1.4.3 读取数量不定的输入数据 13  1.4.4 if语句 15  1.5 类简介 17  1.5.1 Sales_item类 17  1.5.2 初识成员函数 20  1.6 书店程序 21  小结 23  术语表 23  第Ⅰ部分 C++基础 27  第2章 变量和基本类型...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     1.4.3 读取数量不定的输入数据 13  1.4.4 if语句 15  1.5 类简介 17  1.5.1 Sales_item类 17  1.5.2 初识成员函数 20  1.6 书店程序 21  小结 23  术语表 23  第Ⅰ部分 C++基础 27  第2章 变量和基本类型...

    Think in Java(中文版)chm格式

    8.4.2 BitSet 8.4.3 Stack 8.4.4 Hashtable 8.4.5 再论枚举器 8.5 排序 8.6 通用集合库 8.7 新集合 8.7.1 使用Collections 8.7.2 使用Lists 8.7.3 使用Sets 8.7.4 使用Maps 8.7.5 决定实施方案 8.7.6 未...

    ecs:基于Golang中的实体组件系统概念构建自己的游戏引擎

    组件仅包含一个特定方面的状态或数据,例如健康状况,位置,速度等。 系统处理组件的行为或逻辑。 运动系统使用位置和速度来执行实体运动。 目录 目标 提供易于使用的框架,以从头开始构建游戏引擎。 不依赖于...

Global site tag (gtag.js) - Google Analytics