`
chroya
  • 浏览: 656412 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

BitSet位图算法

阅读更多

    位图算法,使用bit存储数据并排序,优点是快速、占用资源少,缺点是只能对整数使用。
    Java和C++中都有已经实现的的BitSet类,可以直接使用。
    举个例子,0到10000中随机出1000个数,然后用位图算法排序:
   

import java.util.BitSet;

public class BitSetDemo {

	public static void main(String[] args) {
		int count = 10000;
		BitSet bit = new BitSet(count);
		int i = 1000;
		while(i > 0) {		
			bit.set((int)(Math.random()*count));
			i--;
		}
		
		for(int index=0; index<count; index++) {
			if(bit.get(index)) {
				System.out.print(index+",");
			}
		}
		System.out.println("end");			
	}
}
 

    Java中的BitSet还有很多其他用法,比如and、or、xor等操作,看下文档就明白了。

 

      下面是我自己的一个简单实现:

package chroya.java;

/**
 * 
 * @author chroya
 *
 */
public class BitSet {

	private int[] mBits;
	private int mSize;
	
	/**
	 * 初始化指定个bit
	 * @param size 初始化的bit数目
	 */
	public BitSet(int size) {
		mSize = size;
		initBits();
	}
	
	/**
	 * 将指定bit位置设为1
	 * @param pos 
	 */
	public void set(int pos) {
		//得到此pos在数组中的索引
		int index = (int)Math.floor(pos/32f);
		//把当前整数的第n位设置为1
		mBits[index] = mBits[index] | (1<<(pos%32));
	}
	
	/**
	 * 获取指定位是否存在
	 * @param pos
	 * @return
	 */
	public boolean get(int pos) {
		int index = (int)Math.floor(pos/32f);
		return mBits[index] == (mBits[index] | 1<<(pos%32));
	}
	
	/**
	 * 指定bit位置设为0
	 * @param pos
	 */
	public void reset(int pos) {
		int index = (int)Math.floor(pos/32f);
		//把当前整数的第n位设置为0
		mBits[index] = mBits[index] & ~(1<<(pos%32));
	}
	
	/**
	 * 初始化整型数组
	 */
	private void initBits() {
		//Java中整型为32位,所以数组长度为位长度/32。
		int count = (int) Math.ceil(mSize/32f);
		mBits = new int[count];
		clear();
	}
	
	/**
	 * 清空,全部置零
	 */
	private void clear() {
		int len = mBits.length;
		for(int index=0; index<len; index++) {
			mBits[index] = 0;
		}
	}
}

重点在:

set:     mBits[index] | (1<<(pos%32))    1移到指定位,加到原数上。如原数为4,pos为3,则0100 | 1000 = 1100
get:     mBits[index] == (mBits[index] | 1<<(pos%32)) 判断重新set指定位之后是否跟原数相等
reset:     mBits[index] & ~(1<<(pos%32))    原数减去1移到指定位的数。如原数为6,pos为2,则0110 & 1011 = 0010

3
1
分享到:
评论
4 楼 chroya 2010-12-12  
Coding.Ghost 写道

呵呵,多谢捧场。
3 楼 Coding.Ghost 2010-12-12  
2 楼 chroya 2010-10-22  
kimmking 写道
不错,
为啥叫位图?


因为每个数据都只用一个bit来存储
1 楼 kimmking 2010-10-21  
不错,
为啥叫位图?

相关推荐

    bitset用法 bitset用法

    bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法

    c++遗传算法,用bitset实现

    使用C++编写的遗传算法,代码量200行左右,供大家学习研究,互相交流。

    C语言头文件 BITSET

    C语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC...

    动态Bitset源代码

    在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset&lt;64&gt; bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...

    acm相关资料vector、bitset

    acm相关资料vector、bitset、大数乘法等等

    可以动态扩展的bitset

    文档模仿STL库的BITSET写的一个bitset,但是和STL不同的是这个类是一个可以动态扩展的,使用方法和STL的类似,可以参考STL使用

    Go-bitset-Go包实现bitsets

    bitset - Go包实现 bitsets

    BitSet 源码分析.txt

    基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    c++ bitset实现

    自己实现的bitset数据结构,在vs2005下编译通过。有测试成素。

    roaringbitmap:Cython中咆哮的位图

    Cython中咆哮的位图 咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,...

    详解C++ bitset用法

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset&lt;4&gt; bitset1; //无参构造,...

    javabitset源码-Study:学习

    bitset源码 Study 少有人走的路 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) 红黑树 B,B+,B*树 LSM 树 BitSet 常用算法 计数排序 桶排序 基数排序 二分...

    javabitset源码-javaewah:JavaBitSet类的压缩替代品

    bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。 我们提供 64 位和 32 位类似 RLE 的压缩方案。 它可用于实现位图索引。 它所依赖的 EWAH 格式用于运行 GitHub 的 git 实现。 字对齐压缩的目标不是实现最佳...

    MATLAB实现LSB音频水印算法

    主要实现思路,通过fopen()函数进行读取音频文件,得到一个数据范围在0~65535的数组,使用bitset()函数,能够将每个数据转换成二进制,并在最低位插入你想要插入的水印数据。水印数据用audioread来进行读取有一个...

    C++下bitset简介

    C++下的bitset,强大而简单的位运算功能,象使用数组一样对位进行操作

    认识C++中的bitset类型

    认识标准库bitset类型  位是用来保存一组项或者条件的yes/no(1或者0)信息的一种简洁方法,那么位集是二进制位的有序集。C++中标准库提供的bitset类在我们程序中很有效的简化了对于位集的处理。  bitset对象的...

    基于C++ bitset常用函数及运算符(详解)

    C++ bitset——高端压位卡常题必备STL ———————————————————— 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力。 bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间...

    对java的BitSet的多线程并发的探索

    NULL 博文链接:https://huangyunbin.iteye.com/blog/2194731

    java 原生包 BitSet 源码

    Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!

Global site tag (gtag.js) - Google Analytics