1.BitMapåçä¸å®ç°
2.BitMapåBitSet
3.位向量工作原理
4.使用函数计算素数个数并求和:输入两个正整数m和n(1≤m,源码n≤500),源码要求定义和调用函prime
5.BitSetç®ä»
BitMapåçä¸å®ç°
æ¯è¾ç»å ¸çé®é¢æ¯ï¼ å¨åªè½å¤ä½¿ç¨2Gçå åä¸ï¼å¦ä½å®æ以ä¸æä½ï¼â ï¼å¯¹äº¿ä¸ªä¸éå¤çæ´æ°è¿è¡æåºã
â¡ï¼æ¾åºäº¿ä¸ªæ°åä¸éå¤çæ°åã
æ 论æ¯æåºè¿æ¯æ¾éå¤çæ°åé½éè¦å°è¿äº¿ä¸ªæ°åå å ¥å°å åä¸å¨å»è¿è¡æä½ï¼å¾ææ¾ï¼é¢ç®ç»åºç2Gå åéå¶è¯´æäºå¨è¿æ ·çåºæ¯ä¸æ¯ä¸è½å¤å°æææ°é½å å ¥å°å åä¸ç
* 4/ï¼* * ï¼ = 3.G
é£ä¹è¿æ¶åå°±éè¦ç¨å° BitMapç»æäº
bitMap使ç¨ä¸ä¸ªbit为0/1ä½ä¸ºmapçvalueæ¥æ è®°ä¸ä¸ªæ°åæ¯å¦åå¨,源码èmapçkeyå¼æ£æ¯è¿ä¸ªæ°åæ¬èº«ã
ç¸æ¯äºä¸è¬çæ°æ®ç»æéè¦ç¨4个byteå»åå¨æ°å¼æ¬èº«ï¼ç¸å½äºæ¯èçäº 4*8ï¼1 = åçå å空é´
bitMapä¸ä¸å®è¦ç¨bitæ°ç»,å¯ä»¥ä½¿ç¨ int,longçççåºæ¬æ°æ®ç±»åå®ç°ï¼å ä¸ºå ¶å®è´¨é½æ¯å¨bitä½ä¸åæ°æ®ï¼ç¨åªç§ç±»ååªæ¯å³å®äºæç»å®ç°åºæ¥çBitMapçå ç½®æ°ç»ä¸å个å ç´ åæ¾æ°æ®çå¤å°
ä¾å¦ï¼javaä¸çBitSet使ç¨Longæ°ç»
BitMapçå®ç°å½ç¶å°ä¸äºä½è¿ç®ï¼å æ¥æç¡®å 个常è§ä½è¿ç®ï¼è¿æ¯å®ç°BitMapçåºç¡ï¼
set(bitIndex): æ·»å æä½
1 .ç¡®å®è¯¥æ°å¤äºæ°ç»ä¸çåªä¸ªå ç´ çä½ä¸
int wordIndex = bitIndex >> 5;
å 为æç¨çæ¯int[]å®ç°ï¼æ以è¿éå³ç§» 5 ä½ï¼2^5 = ï¼
2 .ç¡®å®ç¸å¯¹äºè¯¥å ç´ ä¸çä½ç½®å移
int bitPosition = bitIndex & ((1 << 5) - 1);
è¿éç¸å½äºæ¯ bitIndex % ï¼1<<5ï¼çå模è¿ç®ï¼å 为å½å模è¿ç®çé¤æ°æ¯2ç次å¹ï¼æ以å¯ä»¥ä½¿ç¨ä»¥ä¸çä½è¿ç®æ¥è®¡ç®ï¼æåæçï¼å¯¹æ¯HashMapç容é为ä»ä¹æ»æ¯2çå¹æ¬¡æ¹çé®é¢ï¼HashMapæ±ä¸æ æ¶ä¹æ¯ä½¿ç¨ hash&(n-1)ï¼
tips: ä½è¿ç®çä¼å 级æ¯ä½äº+,-çççï¼æ以è¦å ä¸æ¬å·,é²æ¢åçä¸å¯æè¿°çé误
3 .å°è¯¥ä½ç½®1
bits[wordIndex] |= 1 << bitPosition;
ç¸å½äºæ¯å°æå®ä½ç½®å¤çbitå¼ç½®1ï¼å ¶ä»ä½ç½®ä¿æä¸åï¼ä¹å°±æ¯å°ä»¥è¿ä¸ªbitIndex为keyçä½ç½®ä¸º1
tips: è¿éæ¯åèäºç½ä¸çåä½å¤§ä½¬çæç« ,åä½ + æä½æï¼å对æ¯äºä¸BitSetçæºç ï¼
words[wordIndex] |= (1L << bitIndex);
没æåä½æä½ï¼ç´æ¥|ï¼è¿ä¸¤ä¸ªä¸æ ·åï¼çæ¡å½ç¶æ¯ä¸æ ·ç
举个æ åï¼
1 << == 1<<
1L << ==1L<<
å³å¯¹äºintålongåæ°æ®ï¼ç´æ¥å·¦ç§»å ¶ä½æ°ç¸å½äºæ¯é带äºå¯¹å ¶çå模æä½
æ»ç»ï¼ä½¿ç¨Bit-mapçææ³ï¼æ们å¯ä»¥å°åå¨ç©ºé´è¿è¡å缩ï¼èä¸å¯ä»¥å¯¹æ°åè¿è¡å¿«éæåºãå»éåæ¥è¯¢çæä½ã
Bloom Fliteræ¯Bit-mapææ³çä¸ç§æ©å±ï¼å®å¯ä»¥å¨å 许ä½é误ççåºæ¯ä¸ï¼å¤§å¤§å°è¿è¡ç©ºé´å缩ï¼æ¯ä¸ç§æ¿é误çæ¢å空é´çæ°æ®ç»æ
å½ä¸ä¸ªå ç´ å å ¥å¸éè¿æ»¤å¨ä¸çæ¶åï¼ä¼è¿è¡åªäºæä½ï¼
å½æ们éè¦å¤æä¸ä¸ªå ç´ æ¯å¦åå¨äºå¸éè¿æ»¤å¨çæ¶åï¼ä¼è¿è¡åªäºæä½ï¼
ç¶åï¼ä¸å®ä¼åºç°è¿æ ·ä¸ç§æ åµï¼ä¸åçå符串å¯è½åå¸åºæ¥çä½ç½®ç¸åï¼å¯ä»¥éå½å¢å ä½æ°ç»å¤§å°æè è°æ´æ们çåå¸å½æ°æ¥éä½æ¦çï¼,å æ¤ï¼å¸éè¿æ»¤å¨å¯è½ä¼åå¨è¯¯å¤çæ åµ
æ»ç»æ¥è¯´å°±æ¯ï¼ å¸éè¿æ»¤å¨è¯´æ个å ç´ åå¨ï¼å°æ¦çä¼è¯¯å¤ãå¸éè¿æ»¤å¨è¯´æ个å ç´ ä¸å¨ï¼é£ä¹è¿ä¸ªå ç´ ä¸å®ä¸å¨ã
Bloom Filterçåºç¨: 常ç¨äºè§£å³ç¼åç©¿éçåºæ¯ã
BitMapåBitSet
Bit-mapçåºæ¬ææ³å°±æ¯ç¨ä¸ä¸ªbitä½æ¥æ è®°æ个å ç´ å¯¹åºçValueï¼èKeyå³æ¯è¯¥å ç´ ãç±äºéç¨äºBit为åä½æ¥åå¨æ°æ®ï¼å¯ä»¥å¾å¤§å度çèç空é´ï¼å¸¸ç¨äºå¯¹å¤§éæ´æ°åå»éåæ¥è¯¢æä½ã1byte=8bit
1kb=byte
1mb=kb
1gb=mb
javaä¸ intç±»åå ç¨4个åè=4*8=bit
ä»ä¸è¿°ç»ææ¥çï¼æä½åå¨æ¯æåèåå¨æ°åè约äºï¼7./0.-1约çäºå空é´ï¼ï¼èä¸æåèåå¨æ ¹æ®å å4Gçè¦æ±æ æ³ä¸æ¬¡æ§å¨å åä¸è¿è¡å¤çã
ä¼æå¨ç¥ï¼æ¯ä¸ä½çåå¼æ éå°±æ¯0å1ï¼ç»æ¯ä¸ä½ç¼å·ï¼é£ä¹ç¨0表示æ°ååå¨ï¼1表示æ°åä¸åå¨ã
åå¦ç°å¨æä¸ä¸ªåèä¹å°±æ¯8ä½ç空é´ï¼é£ä¹æç §BitMapï¼å¯ä»¥è¡¨ç¤º8个æ°åï¼
æç §ä¸å¾æ示ï¼è¯¥åèç8ä½è¡¨ç¤ºäºæ´æ°æ°ç»[6,5,2,0]ãé£ä¹javaä¸intç±»åå ç¨äº4个åèï¼ä¹å°±æ¯ä½ï¼é£ä¹å°±å¯ä»¥æå¤è¡¨ç¤ºä¸ªæ°åãè¶ è¿ä½æ°åå¢ï¼é£å°±ä½¿ç¨ä¸¤ä¸ªä»¥ä¸intå»è¡¨ç¤ºã
å设æ们è¦åå¨çæ°åæ大å¼ä½Nï¼åç³è¯·int temp[1+N/]çæ°ç»ç©ºé´ï¼å ¶ä¸ï¼
temp[0]å¯è¡¨ç¤º 0~
temp[1]å¯è¡¨ç¤º -
.....以æ¤ç±»æ¨
ç»å®ä»»ä¸æ´æ°Mï¼Mæ°åæå¨æ°ç»ä¸çä¸æ ä½ç½®å°±åºè¯¥æ¯M/ï¼Mæ°åæå¨çä½å°±æ¯M%
æ»å ±ä¸¤æ¥
1.æ¾å°æ´æ°æå¨æ°ç»tempçä¸æ
int index = M/
2.å°temp[index] ç第M%ä½ç½®1
temp[index]=temp[index] | (1<<(M%))
æ ¹æ®bitMapçåçå¯ç¥ï¼æ³è¦æ¸ é¤æä¸ä¸ªæ°åï¼é£å°±æ¯å°å¯¹åºçä½ç½®0
æ»å ±ä¸¤æ¥
1.æ¾å°æ´æ°æå¨æ°ç»tempçä¸æ
int index = M/
2.å°temp[index] ç第M%ä½ç½®0
temp[index]=temp[index] &ï¼~ (1<<(M%))ï¼
æ ¹æ®æ¯ä¸ä½ä»£è¡¨ä¸ä¸ªæ°åï¼1表示åå¨ï¼0表示ä¸åå¨ï¼é£ä¹åªéè¦å¤ææ´æ°å¯¹åºä½æ¯å¦ä½1å³å¯
æ»å ±ä¸¤æ¥
1.æ¾å°æ´æ°æå¨æ°ç»tempçä¸æ
int index = M/
2.å°temp[index] ç第M%ä½ç½®0
temp[index] &(1<<(M%) ï¼= 0ï¼"åå¨":"ä¸åå¨"
è¿è¡ç»æ
BitSetå°±æ¯å®ç°äºBit-Mapç®æ³ãBitSetä½äºjava.utilå ä¸ï¼ä»JDK1.0å¼å§å°±å·²ç»æäºã该类å®ç°äºä¸ä¸ªæéå¢é¿çä½åéãä½éçæ¯ä¸ä¸ªç»ä»¶é½æä¸ä¸ªbooleanç±»åçå¼ãBitSetçæ¯ä¸ä½ä»£è¡¨çä¸ä¸ªéè´æ´æ°ãå¯ä»¥æ£æ¥ã设置ãæ¸ é¤å个ä½ãä¸ä¸ªBitSetå¯ä»¥éè¿é»è¾ä¸ãé»è¾æãé»è¾å¼æå»ä¿®æ¹å¦ä¸ä¸ªBitSetãé»è®¤æ åµä¸ï¼ææä½çæ è¯é½æ¯falseã
设å¼
æ¸ é¤
æ£æ¥
BitSetæä¸ç§æé æ¹æ³ï¼æ们ç´æ¥æ¥çæ åæé å¨
å¯ä»¥çå°BitSetæ¯ä½¿ç¨longæ°ç»åå¨ãé£ä¹longç±»åå ç¨8个åèï¼å³ä½ï¼ä¸ä¸ªlongç±»åå¯è¡¨ç¤ºä¸ªæ°åãé»è®¤è®¾ç½®BitSetå¯è¡¨ç¤ºæ大çä½æ°ä¸ºä½ãä¸ä¸è¿°èªå·±å®ç°çåºæ¬ç±»ä¼¼ã
åæ¥çsetæ¹æ³
getæ¹æ³
clearæ¹æ³
å¯ä»¥çå°JDKä¸çBitSetå®ç°åçä¸ç¬¬ä¸èä¸ä¸æ ·ï¼éç¨Bit-Mapææ³ï¼BitSetå°è£ è¾å¤çAPIï¼å¯ä¾å¼åè 们éæ使ç¨ã
位向量工作原理
位向量,也叫位图,源码是源码一个我们经常可以用到的数据结构,在使用小空间来处理大量数据方面有着得天独厚的源码帝国源码设置轮播图片优势;位向量的定义就是一串由0.1组成的序列。
Java中对位向量的源码实现类时Java.util.BitSet;C++标准库中也有相应的实现,原理都是源码一样的; BitSet源码也很简单,很容易看懂 ,源码如果读者在对位向量有一定的源码了解后,可以通过读源码来了解BitSet的源码具体实现。
一个bit上有两个值,源码正好可以用来判断某些是源码非状态的场景,在针对大数据场景下判断存在性,源码BitSet是源码小说语音引擎源码相比其他数据结构比如HashMap更好的选择,在Java中,位向量是用一个叫words的long型数组实现的,一个long型变量有位,可以保存个数字;比如我们有[2,8,6,,]这5个数要保存,一般存储需要 5*4 = 字节的存储空间。但是如果我们使用Java.util.BitSet进行存储则可以节省很多的空间只需要一个long型数字就够了。BitSet只面向数字只面向数字使用,国外落地页源码对于string类型的数据,可以通过hashcode值来使用BitSet。
由于,1 << , 1<<, 1<< 这些数字的结果都为1,BitSet内部,long[]数组的大小由BitSet接收的最大数字决定,这个数组将数字分段表示[0,丧尸围城源码下载],[,],[,]...。即long[0]用来存储[0,]这个范围的数字的“存在性”,long用来存储[,],依次轮推,这样就避免了位运算导致的冲突。原理如下:
|------------|----------|----------|----------|----------| |
Java的BitSet每次申请空间,申请位,即一个long型变量所占的合约源码查看链接位数;
使用函数计算素数个数并求和:输入两个正整数m和n(1≤m,n≤),要求定义和调用函prime
import java.util.*;public class Main{
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();//m
int b=sc.nextInt();//n
ArrayList<Integer>list=new ArrayList<Integer>();//定义一个list存放素数
while(a<=b){
//如果a为素数,将其放入list中
if(prime(a,list)){
list.add(a);
}
a++;
}
//输出
if(list.size()==0){
System.out.print("none");
return;
}
System.out.print(list.size()+"");
int sum=0;
Iterator<Integer>iter=list.iterator();
while(iter.hasNext()){
sum=sum+iter.next();
}
System.out.print(sum);
}
//判断该数是否为素数
public static boolean prime(int n,ArrayList<Integer>list){
if(n==1){
return false;
}
int max=(int)Math.sqrt(n);
for(int i=0;i<list.size();i++){
if(n%list.get(i)==0){
return false;
}
if(list.get(i)>max){
return true;
}
}
return true;
}
}
扩展资料:
在高级编程语言中,如果你想使用某个类或接口,那就要用import导入这个类,如在Java中编写servlet,使用httpServlet,那就要在文件的开头(包之后)写上,
import javax.servlet.http.*;表示导入javax.servlet.http这个包中所有的文件。
import java.util.*;导入java.util包中的类接口。
Java中import的作用是导入要用到的包中的类接口。import就是在java文件开头的地方,先说明会用到那些类别。接着我们就能在代码中只用类名指定某个类,也就是只称呼名字,不称呼他的姓。
这其中包的作用就是给java类进行分拣分类,不同业务逻辑的java类放在同一个包中。比如实体包,工具包。
Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。本章介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。
例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector)、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。
参考资料:
百度百科——java.util
BitSetç®ä»
åºæ¬åçåç¨éBitSetå³ä½å¾ï¼æ¯ä¸ä¸ªå¾é¿çâ0/1âåºåï¼ä»çåè½å°±æ¯åå¨0æè 1ã
ä»çè¿ä¸ªç¹ç¹ä½¿å¾å¨javaç¯å¢ä¸åå¨ä¸ä¸ªæ°è¦æ¯ç´æ¥åä¸ä¸ªintèçå¾å¤å å空é´ï¼ä¸ä¸ªintå 4个åèä½ï¼èç¨BItSetâåæ¾âä¸ä¸ªæ°åªéè¦1个ä½ï¼ã
æ¯å¦æ们æ{ 1,3,5,7}éè¦åæ¾ï¼å åä¸å ç¨äº4个intçé¿åº¦å³*4(bit)ï¼å¦æ使ç¨BitSetï¼å°±æ¯è¿ä¸ªæ ·ç[...,1,0,1,0,1,0,1]ï¼åªéè¦å ç¨å 个bitå°±å¯ä»¥è¡¨ç¤ºã1个Gçå åæ8 * * * = 8. * ^9个bitï¼ä¹å°±æ¯å¯ä»¥åæ¾äº¿+个æ°ã
BitSetçåå§å¤§å°ä¸º1个longç大å°ï¼å³8åè个bitãå¦ææ们å建çBitSetæå®äºä½æ°ï¼ç³»ç»ä¼æ ¹æ®æ åµåæçæ´æ°å个bitï¼å³æ´æ°ä¸ªlongçä½æ°ï¼è¿æ ·åæ¯ä¸ºäºå åè¡¥é½ã
BitSetéåç¨äºæ éå¤ï¼æ´æ°ï¼å¸¸ç¨äºå¤§æ°æ®åºæ¯æè æ¥å¿ç»è®¡ã
åèæç« ï¼
Javaä¸BitSetç使ç¨å详解