用Hash相關演算法解決海量資料處理問題

2021-10-08 02:22:21 字數 3994 閱讀 3616

3 雜湊切割

4 位圖應用

對於乙個資料量為m的資料,呼叫n次contains問題。

(1)遍歷

時間複雜度:o(m)*n == o(m*n)

(2)先排序,後二分查詢

時間複雜度:o(m*log(m))(排序) + o(log(m))*n(查詢) == o((m+n)*log(m))

(3)先儲存hashset,再查詢:

時間複雜度:o(m) +o(1)*n == o(m+n)

空間複雜度:o(m)

1 點陣圖來處理大資料問題:

位圖思想引入:

int

array =

;int

count =

newint[10

];for(

int i=

0;i)>>>count=

所謂位圖,就是用每一位來存放某種狀態:

我們需要儲存的的是0或1,而上面的乙個無符號的數要占用32位。所以我們可以使用乙個二進位制位元位來代表資料是否存在的資訊,如果二進位制位元位為1代表存在,為0代表不存在。如果有8w資料那麼所需空間為32bit*8w,如果我們用1個bit來儲存,那麼所需的空間為1bit*8w

那麼該如何用位圖的方式儲存記錄m個數字呢?

(1)確定陣列大小

int

array =

newint

[向上取整(m/32)

]

(2)將資料m中的某個數字n對應的bit位置1

index = 向下取整(n/32)

;bit = n%32;

array[index]

= array[index]|(

1<

;

(3)將資料m中的某個數字n對應的bit位置0

array[index]

= array[index]&(

~(1<

);

(4)判斷某個數對應的bit是1還是0(即判斷某個數是否存在)

array[index]&(

1<

? 不存在 : 存在

舉例:將12對應的bit位置1.

點陣圖的應用快速查詢某個資料是否在乙個集合中

排序求兩個集合的交集、並集等

作業系統中磁碟塊標記

注意:

2 布隆過濾器

當推薦系統推薦新聞時會從每個使用者的歷史記錄裡進行篩選,過濾掉那些已經存在的記錄。如何快速查詢呢?

用雜湊表直接儲存使用者記錄,缺點:浪費空間

用位圖儲存使用者記錄,缺點:容易產生雜湊衝突

將雜湊與點陣圖結合,即布隆過濾器

(1)布隆過濾器的插入查詢

布隆過濾器是由布隆(burton howard bloom)在2023年提出的一種緊湊型的、比較巧妙的概率型資料結構,特點是高效地插入和查詢,可以用來告訴你「某樣東西一定不存在或者可能存在」,它是用多個雜湊函式,將乙個資料對映到位圖結構中。此種方式不僅可以提公升查詢效率,也可以節省大量的記憶體空間。

布隆過濾器的思想是將乙個元素用多個雜湊函式對映到乙個點陣圖中,因此被對映到的位置的位元位一定為1。所以可以按照以下方式進行查詢:分別計算每個雜湊值對應的位元位置儲存的是否為零,只要有乙個為零,代表該元素一定不在雜湊表中,否則可能在雜湊表中。

注意:

布隆過濾器如果說某個元素不存在時,該元素一定不存在,如果該元素存在時,該元素可能存在,因為有些雜湊函式存在一定的誤判。

(2)布隆過濾器刪除

布隆過濾器不能直接支援刪除工作,因為在刪除乙個元素時,可能會影響其他元素。

比如:如果直接將該元素所對應的二進位制位元位置0,那麼如果有乙個元素在多個雜湊函式計算出的位元位上和該元素剛好有重疊,那麼相當於也將該元素刪除了。

刪除的方法:將布隆過濾器中的每個位元位擴充套件成乙個小的計數器,插入元素時給k個計數器(k個雜湊函式計算出的雜湊位址)加一,刪除元素時,給k個計數器減一,通過多占用幾倍儲存空間的代價來增加刪除操作。

缺陷:無法確認元素是否真正在布隆過濾器中

存在計數迴繞

(3)布隆過濾器優點

1)增加和查詢元素的時間複雜度為:o(k), (k為雜湊函式的個數,一般比較小),與資料量大小無關;

2)雜湊函式相互之間沒有關係,方便硬體並行運算;

3)布隆過濾器不需要儲存元素本身,在某些對保密要求比較嚴格的場合有很大優勢;

4)在能夠承受一定的誤判時,布隆過濾器比其他資料結構有這很大的空間優勢;

5)資料量很大時,布隆過濾器可以表示全集,其他資料結構不能;

6)使用同一組雜湊函式的布隆過濾器可以進行交、並、差運算;

(4)布隆過濾器缺陷

1)有誤判率,即存在假陽性(false position),即不能準確判斷元素是否在集合中(補救方法:再建立乙個白名單,儲存可能會誤判的資料);

2)不能獲取元素本身;

3) 一般情況下不能從布隆過濾器中刪除元素;

4)如果採用計數方式刪除,可能會存在計數迴繞問題;

注意:

3 雜湊切割

(1)給乙個超過100g大小的log file, log中存著ip位址, 設計演算法找到出現次數最多的ip位址?

如果資料量不大可以採用hashmap計數法來解決。

為了處理海量資料,可以先對資料進行分割,將大資料分割成乙個個小資料塊。

切割時要保證相同的ip分到同乙個小資料塊中(通過雜湊函式進行分割)。

(2)如何找到top k的ip?

首先通過雜湊分割,將資料分配到每個桶中,用hash統計每個桶中的ip數,之後用小頂堆求出每個桶**現頻率最高的前k個數,最後在所有的桶中求全域性topk。

4 位圖應用

(1)給定100億個整數,設計演算法找到只出現一次的整數?

分情況:沒有出現、出現一次、出現一次以上

這是乙個三元資訊,而乙個bit能儲存二元資訊,兩個bit能儲存四元資訊。

我們可以用00表示沒有出現; 01表示出現一次;11表示出現一次以上。

將兩個bit位進行異或,得到1時,即為出現了一次。

(2)1個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數。

這是乙個四元資訊:沒有出現:00;出現一次:01;出現兩次:10;出現兩次以上:11

海量資料相關題目

1.100億條資料,讓找出出現次數最多的前k條記錄?直接遍歷統計比較 排序 將大檔案分割 2.有40億個不重複的整數,快速檢測乙個資料是否在該集合中 直接遍歷 排序 切割 雜湊切割 位圖 用乙個位元位的狀態表示資料存在與否的狀態資訊 0,1 2 32 bit 2 32 8 byte 2 29 byt...

海量資料處理專題(三) Hash

什麼是hash hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來...

海量資料處理專題(三) Hash

什麼是hash hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來...