Java之大資料位元圖法(無重複排序,重複排序,去重複排序,資料壓縮)

來源:互聯網
上載者:User

標籤:最佳化   維護   rom   cas   內容   空間   mergesort   標記   邏輯   

大資料位元圖法(無重複排序,重複排序,去重複排序,資料壓縮)之Java實現

 

位元影像法介紹

    位元影像的基本概念是用一個位(bit)來標記某個資料的存放狀態,由於採用了位為單位來存放資料,所以節省了大量的空間。舉個具體的例子,在Java中一般一個int數字要佔用32位,如果能用一位就表示這個數,就可以縮減大量的儲存空間。一般把這種方法稱為位元影像法,即Bitmap。

    位元影像法比較適合於判斷是否存在這樣的問題,元素的狀態比較少,元素的個數比較多的情況之下。那麼具體咋麼做呢,這樣,非常簡單明了就是,2.5億個整數裡面,我維護一個長度等於最大整數值得字串,每個整數是否存在我就在該整數對應的位置置為1,比如,有{2, 4, 5, 6, 67, 5}這麼幾個整數,我維護一個 00…0000 67位的字串。但是,如果你不知道整數的最大值,你至少需要一個長度2^32的字串,因為整數的最大值就是2^32,(int佔4個位元組,因此是32位),那這就最少是512M記憶體,從char的長度算記憶體會算吧,直接、最大整數/8*2^20 就是M的單位。那這麼說來就可以理解位元影像法了。

BitSet

    正因為位元影像運算在空間方面的優越性,很多語言都有直接對它的支援。如在C++的STL庫中就有一個bitset容器。而在Java中,在java.util包下也有一個BitSet類用來實現位元影像運算。此類實現了一個按需增長的位向量。BitSet的每一位都由一個boolean值來表示。用非負的整數將BitSet的位編入索引,可以對每個編入索引的位進行測試、設定或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個BitSet修改另一個BitSet的內容。

    需要注意的是BitSet底層實現是通過一個long數組來儲存資料的,也就是說它增長的最小單位是一個long所佔的邏輯位,即64位。但如果不是對儲存區空間有極致的要求,而且對自己的基本功非常有信心,不建議自己去實現一個跟BitSet類似的類來實現相關的功能。因為jdk中的類都是極精簡併做過合理最佳化的,BitSet類比較長。

無重複排序

java JDK裡面容器類的排序演算法使用的主要是插入排序和歸併排序,可能不同版本的實現有所不同,關鍵代碼如下:

 1 /** 2      * Performs a sort on the section of the array between the given indices 3      * using a mergesort with exponential search algorithm (in which the merge 4      * is performed by exponential search). n*log(n) performance is guaranteed 5      * and in the average case it will be faster then any mergesort in which the 6      * merge is performed by linear search. 7      *  8      * @param in - 9      *            the array for sorting.10      * @param out -11      *            the result, sorted array.12      * @param start13      *            the start index14      * @param end15      *            the end index + 116      */17     @SuppressWarnings("unchecked")18     private static void mergeSort(Object[] in, Object[] out, int start,19             int end) {20         int len = end - start;21         // use insertion sort for small arrays22         if (len <= SIMPLE_LENGTH) {23             for (int i = start + 1; i < end; i++) {24                 Comparable<Object> current = (Comparable<Object>) out[i];25                 Object prev = out[i - 1];26                 if (current.compareTo(prev) < 0) {27                     int j = i;28                     do {29                         out[j--] = prev;30                     } while (j > start31                             && current.compareTo(prev = out[j - 1]) < 0);32                     out[j] = current;33                 }34             }35             return;36         }37         int med = (end + start) >>> 1;38         mergeSort(out, in, start, med);39         mergeSort(out, in, med, end);40 41         // merging42 43         // if arrays are already sorted - no merge44         if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {45             System.arraycopy(in, start, out, start, len);46             return;47         }48         int r = med, i = start;49 50         // use merging with exponential search51         do {52             Comparable<Object> fromVal = (Comparable<Object>) in[start];53             Comparable<Object> rVal = (Comparable<Object>) in[r];54             if (fromVal.compareTo(rVal) <= 0) {55                 int l_1 = find(in, rVal, -1, start + 1, med - 1);56                 int toCopy = l_1 - start + 1;57                 System.arraycopy(in, start, out, i, toCopy);58                 i += toCopy;59                 out[i++] = rVal;60                 r++;61                 start = l_1 + 1;62             } else {63                 int r_1 = find(in, fromVal, 0, r + 1, end - 1);64                 int toCopy = r_1 - r + 1;65                 System.arraycopy(in, r, out, i, toCopy);66                 i += toCopy;67                 out[i++] = fromVal;68                 start++;69                 r = r_1 + 1;70             }71         } while ((end - r) > 0 && (med - start) > 0);72 73         // copy rest of array74         if ((end - r) <= 0) {75             System.arraycopy(in, start, out, i, med - start);76         } else {77             System.arraycopy(in, r, out, i, end - r);78         }79     }

 

下面我們說下位元影像法排序的思路:其實思路開篇已經交代,為了讓大家更容易理解,我將通過舉例的方式進一步闡明,假設我們有一個不重複的整型序

 

Java之大資料位元圖法(無重複排序,重複排序,去重複排序,資料壓縮)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.