java获取10位随机数_Java基础:JAVA中BitSet使用详解
適用場景:整數,無重復;
Bitset 基礎
Bitset,也就是位圖,由于可以用非常緊湊的格式來表示給定范圍的連續數據而經常出現在各種算法設計中。上面的圖來自c++庫中bitset的一張圖。
基本原理是,用1位來表示一個數據是否出現過,0為沒有出現過,1表示出現過。使用用的時候既可根據某一個是否為0表示此數是否出現過。
一個1G的空間,有 8102410241024=8.5810^9bit,也就是可以表示85億個不同的數。
常見的應用是那些需要對海量數據進行一些統計工作的時候,比如日志分析等。
面試題中也常出現,比如:統計40億個數據中沒有出現的數據,將40億個不同數據進行排序等。
又如:現在有1千萬個隨機數,隨機數的范圍在1到1億之間。現在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來(百度)。
programming pearls上也有一個關于使用bitset來查找電話號碼的題目。
Bitmap的常見擴展,是用2位或者更多為來表示此數字的更多信息,比如出現了多少次等。
Java中Bitset的實現
Bitset這種結構雖然簡單,實現的時候也有一些細節需要主要。其中的關鍵是一些位操作,比如如何將指定位進行反轉、設置、查詢指定位的狀態(0或者1)等。 本文,分析一下java中bitset的實現,拋磚引玉,希望給那些需要自己設計位圖結構的需要的程序員有所啟發。
Bitmap的基本操作有:
- 初始化一個bitset,指定大小。
- 清空bitset。
- 反轉某一指定位。
- 設置某一指定位。
- 獲取某一位的狀態。
- 當前bitset的bit總位數。
使用場景
常見的應用是那些需要對海量數據進行一些統計工作的時候,比如日志分析、用戶數統計等等
如統計40億個數據中沒有出現的數據,將40億個不同數據進行排序等。
現在有1千萬個隨機數,隨機數的范圍在1到1億之間。現在要求寫出一種算法,將1到1億之間沒有在隨機數中的數求出來
代碼示例
package util; import java.util.Arrays;import java.util.BitSet; public class BitSetDemo { /** * 求一個字符串包含的char * */public static void containChars(String str) {BitSet used = new BitSet();for (int i = 0; i < str.length(); i++)used.set(str.charAt(i)); // set bit for char StringBuilder sb = new StringBuilder();sb.append("[");int size = used.size();System.out.println(size);for (int i = 0; i < size; i++) {if (used.get(i)) {sb.append((char) i);}}sb.append("]");System.out.println(sb.toString());} /** * 求素數 有無限個。一個大于1的自然數,如果除了1和它本身外,不能被其他自然數整除(除0以外)的數稱之為素數(質數) 否則稱為合數 */public static void computePrime() {BitSet sieve = new BitSet(1024);int size = sieve.size();for (int i = 2; i < size; i++)sieve.set(i);int finalBit = (int) Math.sqrt(sieve.size()); for (int i = 2; i < finalBit; i++)if (sieve.get(i))for (int j = 2 * i; j < size; j += i)sieve.clear(j); int counter = 0;for (int i = 1; i < size; i++) {if (sieve.get(i)) {System.out.printf("%5d總結
以上是生活随笔為你收集整理的java获取10位随机数_Java基础:JAVA中BitSet使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql中数据定义和数据控制语言_My
- 下一篇: java byte 转 c_C 和 Ja