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.util.BitSet
publicclassBitSetextends
——按需增长的位向量。默认情况下,set中所有位的初始值都是false。每个
bitset都包含若干设置位(值为true的位)。
构造函数
普通方法
——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)
——获取指定位|指定区间内的位集
intnextSetBit|previousSetBit(intfromIndex)
——从指定位开始查找下一个|前一个true的位索引,没有返回-1
intnextClearBit|previousClearBit(intfromIndex)
——从指定位开始查找下一个|前一个false的位索引,没有返回-1
——5.位集操作《改变的是当前BitSet,而不是参数BitSet》
voidand(
voidor(
voidxor(
voidandNot(
——清除此BitSet中所有的位,其相应的位在指定的BitSet中已设置。
——6.设置位操作
intcardinality()
——位集中设置位的个数
booleanisEmpty()
——如果位集中没有设置位,则返回true
booleanintersects(
——如果两个位集中存在同一个位置均为设置位则返回true
——7.大小操作
intsize()//实际分配空间
intlength()//逻辑大小,最高设置位的索引加1
——8.打印操作
——格式:{设置为true的位索引列表,用,分隔}
相关文章推荐
- JAVA多线程实现和应用总结
- Java正则表达式应用总结
- Java之集合类应用总结
- 给你们说说JAVA多线程实现和应用总结
- Java面向对象——IO流 总结应用(打印流)
- 黑马程序员 Java面向对象——IO流 总结应用(打印流)
- 使用java语言通过appium工具测试ios应用一些问题总结
- java webservice应用总结
- 黑马程序员 Java基础知识总结-IO流(应用总结)
- Realm Java的学习、应用、总结
- Java的WEB应用性能问题定位方法总结
- Java多线程应用总结
- Java Web 回顾总结(二) - Tomcat 实际应用
- Java之集合类应用总结
- Java数据结构应用——无序列表学习总结(二)
- Java正则表达式应用总结
- 黑马程序员_java面向对象(对第五课面向对象..封装..构造..this应用总结)
- JAVA多线程实现和应用总结
- Java正则表达式应用总结
- 为什么Android应用用Java开发,为什么Android大型游戏要用数据包?这里根据我的知识做一个总结