中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在java中如何實現海量數據去重排序bitmap

發布時間:2021-08-06 11:41:20 來源:億速云 閱讀:216 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關在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”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芒康县| 墨竹工卡县| 蒙城县| 佛坪县| 建瓯市| 太康县| 桐城市| 阿鲁科尔沁旗| 甘谷县| 芒康县| 建始县| 玛沁县| 涞水县| 古蔺县| 德钦县| 上饶县| 内乡县| 宝兴县| 安塞县| 罗城| 察隅县| 皋兰县| 北川| 兴文县| 五莲县| 富裕县| 中超| 太康县| 额济纳旗| 绥德县| 顺昌县| 明星| 菏泽市| 平昌县| 宁武县| 合山市| 余干县| 华容县| 于田县| 准格尔旗| 东安县|