大資料之資料結構例析(二)

2021-07-24 11:45:40 字數 1191 閱讀 7065

1.給兩個檔案,分別有100億個query,我們只有1g記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法

精確的演算法:對於這兩個檔案,分別進行切分;將檔案一切分為100份(每個檔案大概380多mb),用合適的雜湊函式將資料進行處理,讓經過雜湊函式後結構相同的數進入同乙個檔案,並且對檔案進行編號;檔案二使用和檔案一一樣的雜湊函式並進行同樣的操作;

(1)分別將檔案一和檔案二切分的編號相同的檔案載入進入記憶體,對比兩個檔案,找出相同的資料;

(2)將每個組中找出的相同的資料進行合併,便可以找到這兩個檔案中的交集。

近似演算法:由於布隆過濾器的的「存在是不確定的,不存在是確定」特性,所以可以近似判斷資料是否存在;

將乙個檔案對映到乙個布隆過濾器中,用另乙個檔案去在第乙個檔案對映的布隆過濾器中去查詢,將所有找到的資料整理,便是這兩個檔案的交集。

2.如何擴充套件bloomfilter使得它支援刪除元素的操作?

對於每一位加乙個計數器,實現引用計數,便可以是的其支援刪除元素的操作;

每 set乙個元素,計數器加一;

當刪除時:沒刪除一次,對計數器減一;

(1)當計數器減為0時,將這一位刪除;

(2)當計數器不等於0時,不要動;

3.給上千個檔案,每個檔案大小為1k—100m。給n個詞,設計演算法對每個詞找到所有包含它的檔案,你只有100k記憶體.

思路:用乙個檔案info 準備用來儲存n個詞和包含其的檔案資訊。

1. 首先把n個詞分成x份。對每乙份用生成乙個布隆過濾器(因為對n個詞只生成乙個布隆過濾器,記憶體可能不夠用)。把生成的所有布隆過濾器存入外存的乙個檔案filter中。

2.將記憶體分為兩塊緩衝區,一塊用於每次讀入乙個布隆過濾器,乙個用於讀檔案(讀檔案這個緩衝區使用相當於有界生產者消費者問題模型來實現同步),大檔案可以分為更小的檔案,但需要儲存大檔案的標示資訊(如這個小檔案是哪個大檔案的)。

3.對讀入的每乙個單詞用記憶體中的布隆過濾器來判斷是否包含這個值,如果不包含,從filter檔案中讀取下乙個布隆過濾器到記憶體,直到包含或遍歷完所有布隆過濾器。如果包含,更新info 檔案。直到處理完所有資料。刪除filter檔案。

4.乙個詞典,包含n個英文單詞,現在任意給乙個字串,設計演算法找出包含這個字串的所有英文單詞.

思路:根據這個詞典可以建立乙個字典樹,然後在這個字典樹中去找所對應的字串,如果找到了,就記錄這個單詞;按深度優先遍歷整個字典樹,就可以找到所有的包含這個字串的單詞。

大資料之資料結構例析(一)

1.給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址?思路 首先,對於乙個超過100g大小的log file,現在來說肯定是進入不了記憶體的,要想找出在這個檔案中出現次數最多的ip,必須對於這個檔案進行切分 1 先將這超過100g大小的log fi...

資料結構之排序(二)

本次所介紹的排序分別是堆排序 歸併排序 快速排序。void swap int a,int i,int j 交換下標為i和j的兩個元素的值 void printa int a,int len 列印陣列 堆排序 堆排序是指利用堆這種資料結構所設計的一種排序演算法,它是選擇排序的一種。在從小到大排序中,需...

資料結構 大數階乘

問題描述 大數運算 計算n的階乘 n 20 基本要求 1 資料的表示和儲存 1.1 累積運算的中間結果和最終的計算結果的資料型別要求是整型 這是問題本身的要求 1.2 試設計合適的儲存結構,要求每個元素或結點最多儲存資料的3位數值。2 資料的操作及其實現 基於設計的儲存結構實現乘法操作,要求從鍵盤上...