欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

海量數(shù)據(jù)去重排序bitmap(位圖法)在java中實現(xiàn)的兩種方法

 更新時間:2019年02月18日 09:18:43   作者:gavenyeah  
今天小編就為大家分享一篇關于海量數(shù)據(jù)去重排序bitmap(位圖法)在java中實現(xiàn)的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

在海量數(shù)據(jù)中查找出重復出現(xiàn)的元素或者去除重復出現(xiàn)的元素是面試中??嫉奈膱D。針對此類問題,可以使用位圖法來解決。例如:已知某個文件內(nèi)包含若干個電話號碼,要求統(tǒng)計不同的號碼的個數(shù),甚至在O(n)時間復雜度內(nèi)對這些號碼進行排序。

位圖法需要的空間很少(依賴于數(shù)據(jù)分布,但是我們也可以通過一些放啊發(fā)對數(shù)據(jù)進行處理,使得數(shù)據(jù)變得密集),在數(shù)據(jù)比較密集的時候效率非常高。例如:8位整數(shù)可以表示的最大十進制數(shù)值為99999999,如果每個數(shù)組對應于一個bit位,那么把所有的八進制整數(shù)存儲起來只需要:99Mbit = 12.375MB.

實際上,java jdk1.0已經(jīng)提供了bitmap的實現(xiàn)BitSet類,不過其中的某些方法是jdk1.4之后才有的。

下面我先自己實現(xiàn)一下bitmap 的原理,然后再直接調(diào)用jdk的BitSet類分別實現(xiàn)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("*******調(diào)用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("排序后的數(shù)組大小為:" + count );
    System.out.println("*******調(diào)用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("去重排序后的數(shù)組大小為:" + count);
  }
  public int getBit(int[] bitArray, int k) {// 1右移 k % 32位 與上 數(shù)組下標為 k/32 位置的值
    return bitArray[k / LEN_INT] & (1 << (k % LEN_INT));
  }
  public int[] setBit(int[] array) {// 首先取得數(shù)組位置下標 i/32, 然后 或上
                    // 在該位置int類型數(shù)值的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("數(shù)組大小:" + 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;
  }
}

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

相關文章

  • 深入學習Java中的SPI機制

    深入學習Java中的SPI機制

    這篇文章主要介紹了深入學習Java中的SPI機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • springboot集成mybatis-maven插件自動生成pojo的詳細教程

    springboot集成mybatis-maven插件自動生成pojo的詳細教程

    這篇文章主要介紹了springboot集成mybatis-maven插件自動生成pojo的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java使用IO流實現(xiàn)音頻的剪切和拼接

    Java使用IO流實現(xiàn)音頻的剪切和拼接

    這篇文章主要為大家詳細介紹了Java使用IO流實現(xiàn)音頻的剪切和拼接,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java中Integer.parseInt和Integer.valueOf區(qū)別小結

    Java中Integer.parseInt和Integer.valueOf區(qū)別小結

    在Java中,Integer.parseInt()和Integer.valueOf()都可以將字符串轉(zhuǎn)換為整數(shù)類型,那么他們有哪些區(qū)別呢,本文就來詳細的介紹一下
    2023-09-09
  • Springboot 使用maven release插件執(zhí)行版本管理及打包操作

    Springboot 使用maven release插件執(zhí)行版本管理及打包操作

    maven-release-plugin 可用于構建release版本項目,實現(xiàn)自動打tag、遞增版本號、分發(fā)release版本jar包至倉庫,接下來通過本文給大家介紹Springboot 使用maven release插件執(zhí)行版本管理及打包操作,需要的朋友可以參考下
    2022-03-03
  • Spring?Boot?Yaml配置高級用法

    Spring?Boot?Yaml配置高級用法

    這篇文章主要介紹了Spring?Boot?Yaml配置高級用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java設計模式中的觀察者模式

    Java設計模式中的觀察者模式

    觀察者模式定義對象之間的一種一對多的依賴關系,使得每當一個對象的狀態(tài)發(fā)生變化時,其相關的依賴對象都可以得到通知并被自動更新。主要用于多個不同的對象對一個對象的某個方法會做出不同的反應
    2023-02-02
  • 關于Java Guava ImmutableMap不可變集合源碼分析

    關于Java Guava ImmutableMap不可變集合源碼分析

    這篇文章主要介紹Java Guava不可變集合ImmutableMap的源碼分析的相關資料,需要的朋友可以參考下面具體的文章內(nèi)容
    2021-09-09
  • 基于springboot+vue實現(xiàn)垃圾分類管理系統(tǒng)

    基于springboot+vue實現(xiàn)垃圾分類管理系統(tǒng)

    這篇文章主要為大家詳細介紹了基于springboot+vue實現(xiàn)垃圾分類管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Mybatis各種查詢接口使用詳解

    Mybatis各種查詢接口使用詳解

    這篇文章主要介紹了Mybatis各種查詢接口使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11

最新評論