日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

海量数据处理:BitMap

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海量数据处理:BitMap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用Java里的BitSet位集合實現:

有四十億個扣扣號,拿來一個扣扣號,最快速查找?

一、問題描述:

??1.在42億個qq號碼中,如何使用O(1)時間復雜度去查找一個QQ號是否存在。

??2.qq號的位數小于13位,存儲著42億QQ號的內存不得超過600MB.

二、位圖排序思想

??由于待排序的數據記錄較多,我們單純地使用常見的排序方法時間效率較低,運行時間會很長。而且內存空間有限(限制為1MB左右),所以我們不能同時把所有整數讀入內存(如果每個整數使用7個字節來存儲,那么1MB內存空間只能存大約143000個數字)。當然我們可以多次讀取輸入文件,多次排序,但是更好的方案是使用位圖排序,可以使用有限的1MB內存空間并只進行一趟排序。

??????1.根據待排序集合中最大的數,開辟一個位數組,用來表示待排序集合中的整數;//這里可能被問大數據TOPK

??????2.待排序集合中的數字在位數組中的對應位置置1,其他的置0;

??????例如,待排序集合{1,2,3,5,8,13}可以表示為:0-1-1-1-0-1-0-0-1-0-0-0-0-1

??????這樣排序過程自然可以分為三步:

??????第一步:將所有的位都置為0;

??????第二步:通過讀入文件中的每個整數,將每個對應的位都置為1;

??????第三步:檢驗每一位,如果該位為1,輸出對應的整數。

??????注意:位圖排序是使用一個二進制位而不是一個整數來表示0或1,這樣可以大大地減少所需要的內存空間。使用位圖排序的前提是要知道待排序序列中的最大數。位圖排序的缺點是有些數沒有出現過,仍要為其保留一個位。故位圖排序比較適合關鍵字密集的序列,例如一個QQ號碼。

/*Phase 1: initialize set to empty*/
?
? for
i = [0, n)
?
? ? bit[i] = 0
?
/*Phase 2: insert present elements into the set*/
?
? for
each i in the input file
?
? ? bit[i] = 1
?
/*Phase 3: write sorted output*/
?
? for
i = [0, n)
?
? ? if
bit[i] == 1
?
? ? ? write i on the output file
三、使用位圖排序的方法

??????位圖排序時,我們需要考慮:給出一個數,如何找到其對應位圖的位置,方法就是首先找到該數對應的字節,然后在找到該數對應的位。例如一個QQ號是:983262245,則將bit的98326625位進行標記。bitset是C++提供的一種位集合的數據結構,它讓我們可以像使用數組一樣使用位,可以訪問指定下標的bit位。因此將通過bitset容器進行存儲42個qq號碼。由于一個字節可以存放8個QQ號碼,則4200000000/8/1014/1024 = 500.679Mb,內存合適,通過bit位下表來判斷QQ號碼是否存在。

#include<iostream>
#include<bitset>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const unsigned int MAX = 4200000010;
typedef unsigned int UT;
bitset<MAX> bit;
int main(){
?? ?//開始存儲QQ
?? ?for(UT i=1;i<10;i++){
?? ??? ?UT qq;
?? ??? ?printf("請輸入第%d個QQ號:",i);
?? ??? ?scanf("%d",&qq);?
?? ??? ?bit.set(qq);
?? ?}?
?? ?UT qq;
?? ?printf("請輸入:");
?? ?while(scanf("%d",&qq)!=0){
?? ??? ??? ?
?? ??? ?if(bit.test(qq)){
?? ??? ??? ?printf("Yes\n");
?? ??? ?}
?? ??? ?printf("請輸入:");
?? ?}
?? ?return 0;
}?
存儲:空間占用大約500Mb

查找:時間復雜度為O(1)

通過位排序的方法,在實現內存內,實現在O(1)時間復雜度內進行一個QQ號碼的查找。
?


package bitmap;import java.math.BigInteger; import java.util.BitSet; import java.util.Scanner;public class BitMap {private static final int MAX = 420000010;public static void main(String[] args) {BitSet bitSet = new BitSet(MAX);int[] qq = {111111111,222222222,333333333,444444444,555555555};for(int i = 0;i<qq.length;i++){bitSet.set(qq[i]);}Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){int num = scanner.nextInt();if(bitSet.get(num)){System.out.println("在");}else{System.out.println("不在");}}}}

總結

以上是生活随笔為你收集整理的海量数据处理:BitMap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。