最近學習了hashtable的一點知識,發現能夠用來解決大數據的一些問題。咱們這裏講的大數據分析事實上並非分佈式和數據挖掘這些高深的概念,而是針對從從一個大文件或者一堆數據(內存放不下)中找出具備某種特色的數,這也是近年來各大公司常常考的問題。面試
面試題1:給一個超過100G大小的log file, log中存着IP地址, 設計算法找到出現次數最多的IP地址?算法
解析:100G的文件給咱們的感受是太大,咱們的電腦內存通常都爲4G左右因此不可能一次性把這麼多的信息都加載到內存,因此就要進行切分紅100份。IP地址是字符串太長,咱們能夠把它轉化爲整型%100,這樣取模後的值都落在0-99的區間裏,所取模後值相同的IP地址都被分配到同一個文件,這時咱們就能夠採用哈希表統計出每一個文件中最多的那個IP地址,最後比較獲得100個IP中最大的那個IP就能夠了 。數組
面試題2:與上題條件相同,如何找到top K的IP?微信
解析:看到求TOP K個IP就要立馬反應到使用堆排序,這裏的堆排序應該注意的是要建一個小堆,想一下咱們建大堆的話只能保證堆頂元素爲最大的,這樣只能獲得最大的那個IP。分佈式
面試題3:給定100億個整數,設計算法找到只出現一次的整數函數
解析:整數分爲有符號和無符號兩種,有符號數的取值爲-2147483648~2147483648 是從-21億到+21億, 無符號數的範圍爲0~4294967296是從0到42億,然而給了咱們100億個整數,要找出只出現一次的整數,因此咱們仍是要用到哈希表的思想,但咱們最好不要定義一個整型數組,由於 42億*4B 約爲16G,這麼大的數組咱們再進行切分的話就太麻煩了,這裏咱們可使用BitMap,用一個位來表示一個數存不存在,不存在表示爲0,出現一次表示爲1,出現一次以上用另外一個位表示。這樣就能夠將數組的大小減爲原來的16分之一。還遇到一個問題,就是到底怎麼定義這個數組,正數好定義,負數的話咱們能夠用32位全1(-1)和它取異或取到和正數相同的位置,咱們此時定義一個二維數組,一半表示正數一半表示負數,都位於同一行。此時咱們使用1G的空間就能夠解決這個問題了。學習
拓展:要是面試官問我這裏只有500M或者更少的空間的話怎麼作?大數據
解析:一樣採用切分的思想,不過我以爲這裏咱們直接能夠按數的範圍直接切分。要是有500M 內存的話,咱們就切一次就能夠了,此時若是咱們有50%的概率一次就找到這個只出現一次的數,效率可能更高。spa
面試題4:給兩個文件,分別有100億個整數,咱們只有1G內存,如何找到兩個文件交集?設計
解析:這道題思路和上面的同樣。
面試題5:1個文件有100億個int,1G內存,設計算法找到出現次數不超過2次的全部整數
解析:這個問題和以上惟一 不一樣這道題是找不超過兩次的整數,方法同樣。
面試題6:給兩個文件,分別有100億個query,咱們只有1G內存,如何找到兩個文件交集分別給出精確算法和近似算法!
解析:求兩個文件的交集,這種算法咱們確定要用到比較,若是咱們把兩個文件都均分爲100份,拿一個文件裏的一份分別與另外一個文件裏的100份分別比較一次的話效率 就過低了,咱們能夠借用第1道面試題的思惟對它們進行取模,這樣咱們只要比較取模的爲同一值的兩個文件比較就能夠了,若是相同則標記。
面試題7:如何擴展BloomFilter使得它支持刪除元素的操做?
解析:BloomFilter並不支持刪除元素的操做,由於極可能產生哈希衝突(就是由不一樣的哈希函數算出的位置指向同一個位),這樣改變一個位極可能會影響到其餘元素的判斷。這裏咱們能夠按照和智能指針sharedptr的思想即「引用計數」來解決,咱們添加一個count計數器,每當咱們在這個位上表示一個元素時就讓它count++,每刪除一個涉及到這個位表示的元素時就讓它count--,這樣只當count爲0時咱們再對這一位置0,這樣就完成了刪除的操做。
面試題8:如何擴展BloomFilter使得它支持計數操做?
解析:這道題思想和上一道題同樣。
面試題9:給上千個文件,每一個文件大小爲1K—100M。給n個詞,設計算法對每一個詞找到全部包含它的文件,你只有100K內存
解析:咱們可使用布隆過濾器來判斷一個文件是否包含這n個單詞生成n個布隆過濾器放到外存,咱們事先定義好一個包含這n個單詞信息的文件info,每當咱們在一個文件找到一個對應的單詞就將這個文件的信息寫入info對應單詞的位置。咱們只有100K內存,這100K內存咱們一部分用來存放布隆過濾器一部分能夠存放文件,由於文件最小都爲100K,因此咱們能夠嘗試把它切分爲50K的小文件,每一個文件標誌好所屬的大文件,這樣咱們每次讀入一個布隆過濾器和一個小文件,若是這個文件有對應的單詞則在info中標記所屬大文件的信息,若是沒有則讀入下一個布隆過濾器,把全部布隆過濾器都使用後,再讀下一個文件重複上述步驟直至把全部文件都遍歷完。
面試題10:有一個詞典,包含N個英文單詞,如今任意給一個字符串,設計算法找出包含這個字符串的全部英文單詞
解析:首先判斷一個單詞是否包含一個字符串咱們能夠用strstr這個函數,對於這個問題,我以爲若是該字符串的前綴和要找的單詞同樣的話能夠採用字典樹來查找,可是N個英文單詞咱們能夠假設它很大,咱們把它放到一個文件裏,每次只讀出固定個數個單詞進行判斷。