位图算法,使用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
分享到:
相关推荐
bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法
使用C++编写的遗传算法,代码量200行左右,供大家学习研究,互相交流。
C语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC...
在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset<64> bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...
acm相关资料vector、bitset、大数乘法等等
文档模仿STL库的BITSET写的一个bitset,但是和STL不同的是这个类是一个可以动态扩展的,使用方法和STL的类似,可以参考STL使用
bitset - Go包实现 bitsets
基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
自己实现的bitset数据结构,在vs2005下编译通过。有测试成素。
Cython中咆哮的位图 咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,...
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset<4> bitset1; //无参构造,...
bitset源码 Study 少有人走的路 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) 红黑树 B,B+,B*树 LSM 树 BitSet 常用算法 计数排序 桶排序 基数排序 二分...
bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。 我们提供 64 位和 32 位类似 RLE 的压缩方案。 它可用于实现位图索引。 它所依赖的 EWAH 格式用于运行 GitHub 的 git 实现。 字对齐压缩的目标不是实现最佳...
主要实现思路,通过fopen()函数进行读取音频文件,得到一个数据范围在0~65535的数组,使用bitset()函数,能够将每个数据转换成二进制,并在最低位插入你想要插入的水印数据。水印数据用audioread来进行读取有一个...
C++下的bitset,强大而简单的位运算功能,象使用数组一样对位进行操作
认识标准库bitset类型 位是用来保存一组项或者条件的yes/no(1或者0)信息的一种简洁方法,那么位集是二进制位的有序集。C++中标准库提供的bitset类在我们程序中很有效的简化了对于位集的处理。 bitset对象的...
C++ bitset——高端压位卡常题必备STL ———————————————————— 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力。 bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间...
NULL 博文链接:https://huangyunbin.iteye.com/blog/2194731
Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!