面試 大量資料的解決辦法

2021-08-29 16:14:09 字數 1915 閱讀 3565

此篇先介紹了幾個概念,後面的面試題為對大數量的各種處理及解決辦法:

搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組?

有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞?

給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

hashing

適用範圍:快速查詢,刪除的基本資料結構,通常需要總資料量可以放入記憶體 

基本原理及要點: hash函式選擇,針對字串,整數,排列,具體相應的hash方法。 

碰撞處理,一種是open hashing,也稱為拉鍊法;

另一種就是closed hashing,也稱開位址法,opened addressing。

陣列的特點是:定址容易,插入和刪除困難;而鍊錶的特點是:定址困難,插入和刪除容易。

那麼我們能不能綜合兩者的特性,做出一種定址容易,插入刪除也容易的資料結構?答案是肯定的,這就是我們要提起的雜湊表,雜湊表有多種不同的實現方法,最常用的一種方法——拉鍊法,我們可以理解為「鍊錶的陣列」

bit-map

適用範圍:可進行資料的快速查詢,判重,刪除,一般來說資料範圍是int的10倍以下 

基本原理及要點:使用bit陣列來表示某些元素是否存在,比如8位**號碼 

擴充套件:bloom filter可以看做是對bit-map的擴充套件

雙層桶劃分

事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。

適用範圍:第k大,中位數,不重複或重複的數字 

基本原理及要點:因為元素範圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定範圍,然後最後在乙個可以接受的範圍內進行, 分治才是其根本。 

問題例項:

堆適用範圍:海量資料前n大,並且n比較小,堆可以放入記憶體 (適合大資料量,求前n小,n的大小比較小的情況,這樣可以掃瞄一遍即可得到所有的前n元素,效率很高)

擴充套件:雙堆,乙個最大堆與乙個最小堆結合,可以用來維護中位數。 

問題例項: 100w個數中找最大的前100個數。 

倒排索引(inverted index)

適用範圍:搜尋引擎,關鍵字查詢 

基本原理及要點:為何叫倒排索引?一種索引方法,被用來儲存在全文搜尋下某個單詞在乙個文件或者一組文件中的儲存位置的對映。 

以英文為例,下面是要被索引的文字: 

t0 = "it is what it is" 

t1 = "what is it" 

t2 = "it is a banana" 

我們就能得到下面的反向檔案索引: 

"a":        

"banana":  

"is":      

"it":      

"what":    

檢索的條件"what", "is" 和 "it" 將對應集合的交集。 

正向索引開發出來用來儲存每個文件的單詞的列表。正向索引的查詢往往滿足每個文件有序頻繁的全文查詢和每個單詞在校驗文件中的驗證這樣的查詢。在正向索引中,文件佔據了中心的位置,每個文件指向了乙個它所包含的索引項的序列。也就是說文件指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文件,很容易看到這個反向的關係。  

問題例項:文件檢索系統,查詢那些檔案包含了某單詞,比如常見的學術**的關鍵字搜尋。

1. 分而治之/hash對映 + hash統計 + 堆/快速/歸併排序;

2. 雙層桶劃分

3. bloom filter/bitmap;

4. trie樹/資料庫/倒排索引;

5. 外排序;

6. 分布式處理之hadoop/mapreduce。

**:

大量的TIME WAIT解決辦法

windows平台 netstat an netstat an find 1433 192.168.12.13 3306 192.168.12.12 30443 time wait 192.168.12.13 3306 192.168.12.12 30444 time wait 192.168.12...

mysql 大量time wait 解決辦法

伺服器 windows 發現很卡,於是重啟了下伺服器,進入系統後,沒過一會問題依舊,檢視了下系統程序,發現mysql佔用率達到99 可以肯定的是mysql連線出現問題 netstat an 192.168.12.13 3306 192.168.12.12 30443 time wait 192.16...

linux 大量的TIME WAIT解決辦法

發現存在大量time wait狀態的連線 tcp 0 0 127.0.0.1 3306 127.0.0.1 41378 time wait tcp 0 0 127.0.0.1 3306 127.0.0.1 41379 time wait tcp 0 0 127.0.0.1 3306 127.0.0....