您的位置:首页 > 编程语言 > Java开发

JAVA Bitset应用总结

2012-11-26 11:11 417 查看
/**
*演示java.util.BitSet类的使用
*BitSet类表示自动增长位集合
*@authorSking
*/
packagebitset;
importjava.util.BitSet;
publicclassBitSetAPITest{
publicstaticvoidmain(String[]args){
//BitSet的构造函数
BitSetb1=newBitSet();
BitSetb2=newBitSet(20);

//set方法演示
for(inti=3;i<20;i+=3)
b1.set(i);
System.out.println(b1.toString());//{3,6,9,12,15,18}
for(inti=2;i<15;i+=2)
b1.set(i,false);
System.out.println(b1.toString());//{3,9,15,18}
b2.set(5,10);
System.out.println(b2.toString());//{5,6,7,8,9}
b2.set(8,14,false);
System.out.println(b2.toString());//{5,6,7}

//flip方法演示
b2.flip(10,15);
System.out.println(b2.toString());//{5,6,7,10,11,12,13,14}
b1.flip(15);
System.out.println(b1.toString());//{3,9,18}

//clear方法演示
b2.clear(10);
System.out.println(b2.toString());//{5,6,7,11,12,13,14}
b2.clear(6,9);
System.out.println(b2.toString());//{5,11,12,13,14}
b2.clear();
System.out.println(b2.toString());//{}

//get方法演示
booleanget9=b1.get(9);
System.out.println(get9);//true
BitSetb3=b1.get(3,10);
System.out.println(b3.toString());//{0,6}

b1.set(7,13);
b2.set(9,16);
System.out.println(b1.toString());//{3,7,8,9,10,11,12,18}
System.out.println(b2.toString());//{9,10,11,12,13,14,15}
//位集操作
b1.and(b2);
System.out.println(b1.toString());//{9,10,11,12}
b2.xor(b1);
System.out.println(b2.toString());//{13,14,15}
b1.or(b2);
System.out.println(b1.toString());//{9,10,11,12,13,14,15}
b3.set(13,15);
b2.andNot(b3);
System.out.println(b2.toString());//{15}

//设置位操作
System.out.println(b1.cardinality());//7
System.out.println(b2.isEmpty());//false
b2.clear();
System.out.println(b2.isEmpty());//true

System.out.println(b1.intersects(b3));//true

//大小操作
System.out.println(b1.size());//64
System.out.println(b1.length());//16=15+1

//查找
System.out.println(b1.nextSetBit(9));//9
System.out.println(b1.nextClearBit(9));//16

System.out.println(b1.previousSetBit(20));//15
System.out.println(b1.previousClearBit(15));//8

//类型转化操作
//byte[]b=b1.toByteArray();
//long[]l=b1.toLongArray();
}
}
	/**
*借助BitSet使用筛选法查找指定范围内的素数
*@paramlimit最大正数
*/
publicstaticvoidsearchPrime(intlimit){
BitSetbs=newBitSet(limit+1);
//约定:不是素数的在BitSet中将相应的位设置为true
intsize=bs.size();
bs.set(1);
for(inti=4;i<size;i+=2)
bs.set(i);//偶数均不是素数
intfinalBit=(int)Math.sqrt(size);
for(inti=2;i<finalBit;i++)
for(intj=2*i;j<size;j+=i)
bs.set(j);
intcout=0;
for(inti=1;i<size;i++){
if(!bs.get(i)){
System.out.printf("%5d",i);
if(++cout==0)
System.out.println();
}
}
System.out.println();
}

/**
*判断一个字符串使用了哪些字符,输出格式为[字符序列]
*@params指定的字符串
*@return字符串使用的字符序列
*/
publicstaticStringwhichChars(Strings){
BitSetbs=newBitSet();
//字符被使用,则将索引等于字符ASCII值的位置设置为true
for(inti=0;i<s.length();i++)
bs.set(s.charAt(i));
StringBuffersb=newStringBuffer();
//输出格式化
sb.append('[');
intlen=bs.length();
for(inti=0;i<len;i++)
if(bs.get(i))
sb.append((char)i);
sb.append(']');
returnsb.toString();
}


/**
*多哈希函数映射的快速查找算法,使用BitSet实现
*应用在一些需要快速判断某个元素是否属于集合,
*但是并不严格要求100%正确的场合,实现大数据处理。
*应用场景包括:爬虫中url的存储。
*
BloomFilter实现原理:
1.创建BitSet,所有位初始为false,选择k个哈希函数
2.将插入值运用k个哈希函数映射到k个二进制位,将其设为true
3.如果k个二进制为中有一个有false,则表示原纪录未被加入过;
如果k个二进制位都有true,则”认为“原纪录已被纪录过,
但是实际上不能100%确定(falsepositive)。
*@authorSking
*/
packagebitset;

importjava.util.BitSet;

publicclassBloomFilter{
/*BitSet初始分配2^24个bit*/
privatestaticfinalintDEFAULT_SIZE=1<<25;
/*不同哈希函数的种子,一般应取质数*/
privatestaticfinalint[]seeds=newint[]{5,7,11,13,31,37,61};
privateBitSetbits=newBitSet(DEFAULT_SIZE);
/*哈希函数对象*/
privateSimpleHash[]func=newSimpleHash[seeds.length];

publicBloomFilter(){
for(inti=0;i<seeds.length;i++){
func[i]=newSimpleHash(DEFAULT_SIZE,seeds[i]);
}
}

//将字符串标记到bits中
publicvoidadd(Stringvalue){
for(SimpleHashf:func){
bits.set(f.hash(value),true);
}
}

//判断字符串是否已经被bits标记
publicbooleancontains(Stringvalue){
if(value==null){
returnfalse;
}
booleanret=true;
for(SimpleHashf:func){
//如果出现一次的bits.get(f.hash(value))为false,则原纪录未被加入过
ret=ret&&bits.get(f.hash(value));
}
returnret;
}

/*哈希函数类,可修改哈希函数,实现更好的优化*/
publicstaticclassSimpleHash{
privateintcap;//容量
privateintseed;//种子

publicSimpleHash(intcap,intseed){
this.cap=cap;
this.seed=seed;
}
//hash函数,采用简单的加权和hash
publicinthash(Stringvalue){
intresult=0;
intlen=value.length();
for(inti=0;i<len;i++){
result=seed*result+value.charAt(i);
}
return(cap-1)&result;//截取加权的低log2(cap)位
}
}
}


java.lang.Object

java.util.BitSet

publicclassBitSetextendsObjectimplementsCloneable,Serializable

——按需增长的位向量。默认情况下,set中所有位的初始值都是false。每个

bitset都包含若干设置位(值为true的位)。

构造函数

BitSet()

BitSet(intnbits)

普通方法

——1.清除位

voidclear()

voidclear(intbitIndex)

voidclear(intfromIndex,inttoIndex)

——分别将全部位|指定区间内的位(不包括toIndex)|指定位设置为false

——2.翻转位

voidflip(intbitIndex)

voidflip(intfromIndex,inttoIndex)

——将指定位|指定区间内的位翻转

——3.设置位

voidset(intbitIndex)

voidset(intbitIndex,booleanvalue)

voidset(intfromIndex,inttoIndex)

voidset(intfromIndex,inttoIndex,booleanvalue)

——将指定位|指定区间内的位设置为指定boolean值,没有指定则为true

——4.获取位

booleanget(intbitIndex)

BitSetget(intfromIndex,inttoIndex)

——获取指定位|指定区间内的位集

intnextSetBit|previousSetBit(intfromIndex)

——从指定位开始查找下一个|前一个true的位索引,没有返回-1

intnextClearBit|previousClearBit(intfromIndex)

——从指定位开始查找下一个|前一个false的位索引,没有返回-1

——5.位集操作《改变的是当前BitSet,而不是参数BitSet》

voidand(BitSetset)//与

voidor(BitSetset)//或

voidxor(BitSetset)//异或

voidandNot(BitSetset)//不是与非操作

——清除此BitSet中所有的位,其相应的位在指定的BitSet中已设置。

——6.设置位操作

intcardinality()

——位集中设置位的个数

booleanisEmpty()

——如果位集中没有设置位,则返回true

booleanintersects(BitSetset)

——如果两个位集中存在同一个位置均为设置位则返回true

——7.大小操作

intsize()//实际分配空间

intlength()//逻辑大小,最高设置位的索引加1

——8.打印操作

StringtoString()

——格式:{设置为true的位索引列表,用,分隔}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: