您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關在java中如何實現海量數據去重排序bitmap的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在海量數據中查找出重復出現的元素或者去除重復出現的元素是面試中常考的文圖。針對此類問題,可以使用位圖法來解決。例如:已知某個文件內包含若干個電話號碼,要求統計不同的號碼的個數,甚至在O(n)時間復雜度內對這些號碼進行排序。
位圖法需要的空間很少(依賴于數據分布,但是我們也可以通過一些放啊發對數據進行處理,使得數據變得密集),在數據比較密集的時候效率非常高。例如:8位整數可以表示的最大十進制數值為99999999,如果每個數組對應于一個bit位,那么把所有的八進制整數存儲起來只需要:99Mbit = 12.375MB.
實際上,java jdk1.0已經提供了bitmap的實現BitSet類,不過其中的某些方法是jdk1.4之后才有的。
下面我先自己實現一下bitmap 的原理,然后再直接調用jdk的BitSet類分別實現bitmap, 方便比較理解:
package swordoffer; //去除重復并排序 import java.util.Arrays; import java.util.BitSet; import java.util.Random; /** * @author Gavenyeah * @date Time: * @des: */ public class BitMap { int ARRNUM = 800; int LEN_INT = 32; int mmax = 9999; int mmin = 1000; int N = mmax - mmin + 1; public static void main(String args[]) { new BitMap().findDuplicate(); new BitMap().findDup_jdk(); } public void findDup_jdk() { System.out.println("*******調用JDK中的庫方法--開始********"); BitSet bitArray = new BitSet(N); int[] array = getArray(ARRNUM); for (int i = 0; i < ARRNUM; i++) { bitArray.set(array[i] - mmin); } int count = 0; for (int j = 0; j < bitArray.length(); j++) { if (bitArray.get(j)) { System.out.print(j + mmin + " "); count++; } } System.out.println(); System.out.println("排序后的數組大小為:" + count ); System.out.println("*******調用JDK中的庫方法--結束********"); } public void findDuplicate() { int[] array = getArray(ARRNUM); int[] bitArray = setBit(array); printBitArray(bitArray); } public void printBitArray(int[] bitArray) { int count = 0; for (int i = 0; i < N; i++) { if (getBit(bitArray, i) != 0) { count++; System.out.print(i + mmin + "\t"); } } System.out.println(); System.out.println("去重排序后的數組大小為:" + count); } public int getBit(int[] bitArray, int k) {// 1右移 k % 32位 與上 數組下標為 k/32 位置的值 return bitArray[k / LEN_INT] & (1 << (k % LEN_INT)); } public int[] setBit(int[] array) {// 首先取得數組位置下標 i/32, 然后 或上 // 在該位置int類型數值的bit位:i % 32 int m = array.length; int bit_arr_len = N / LEN_INT + 1; int[] bitArray = new int[bit_arr_len]; for (int i = 0; i < m; i++) { int num = array[i] - mmin; bitArray[num / LEN_INT] |= (1 << (num % LEN_INT)); } return bitArray; } public int[] getArray(int ARRNUM) { @SuppressWarnings("unused") int array1[] = { 1000, 1002, 1032, 1033, 6543, 9999, 1033, 1000 }; int array[] = new int[ARRNUM]; System.out.println("數組大小:" + ARRNUM); Random r = new Random(); for (int i = 0; i < ARRNUM; i++) { array[i] = r.nextInt(N) + mmin; } System.out.println(Arrays.toString(array)); return array; } }
感謝各位的閱讀!關于“在java中如何實現海量數據去重排序bitmap”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。