经典的大数据例题
前言:
1、說(shuō)明:一般解決大數(shù)據(jù)問(wèn)題有兩個(gè)思路:
1)先將與這道題相關(guān)的所有的數(shù)據(jù)結(jié)構(gòu)進(jìn)行使用一遍,如果有合適的就直接進(jìn)行使用
2)如果不能直接使用,一般就要進(jìn)行哈希切分,然后再使用合適的數(shù)據(jù)結(jié)構(gòu)進(jìn)行問(wèn)題的解決
2、在這里我先來(lái)介紹一種常用于大數(shù)據(jù)問(wèn)題的方法:哈希切分
1)先估算出要切分的大小
2)然后使用哈希的除留余數(shù)法進(jìn)行各個(gè)數(shù)據(jù)的映射
經(jīng)典題:
1、給一個(gè)超過(guò)100G大小的log file,log中存在著IP地址,設(shè)計(jì)算法找到出現(xiàn)此數(shù)最多的IP地址?
思路分析:
1)要進(jìn)行哈希切分編號(hào),log file可以看做是字符串,利用哈希字符串轉(zhuǎn)換算法進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成整型后,利用哈希函數(shù)進(jìn)行映射,同一IP地址肯定映射到同一編號(hào)中,
2)這里我們使用效率很快的哈希表,進(jìn)行此數(shù)的統(tǒng)計(jì),就可以找出出現(xiàn)此數(shù)最多的IP地址
2、與上題條件相同,如何找到topK的IP地址
思路分析:
1)要找到topK的IP地址,我們?nèi)绻苯舆M(jìn)行排序的話,那么有兩個(gè)問(wèn)題,第一就是內(nèi)存放不下,第二就是效率太慢
2)所以這我們可以建一個(gè)K大小的堆,那么建什么堆呢,這里建小堆比較好,因?yàn)閬?lái)一個(gè)數(shù)和進(jìn)行堆頂?shù)脑剡M(jìn)行比較,然后進(jìn)行向下調(diào)整,大的就下去了,因此最終統(tǒng)計(jì)的就是topK
3、給定100億個(gè)整數(shù),設(shè)計(jì)算法找到只出現(xiàn)一次的整數(shù)
思路分析:
1)100億個(gè)數(shù),無(wú)符號(hào)整型最多才42億多,因此我們首先要明白,這里有很多重復(fù)的數(shù),所以我們?cè)谶M(jìn)行空間的建立時(shí),只用分析42億多的就可以了,那么就是16G,這道題沒(méi)有規(guī)定要使用多大的內(nèi)存,但是如果我們直接建16G的,那也不可能,所以我們就利用位圖來(lái)進(jìn)行解決,那么整型是需要32位的,就需要大約500M的內(nèi)存就可以了
2)然后我們就可以進(jìn)行遍歷只出現(xiàn)一次的整數(shù)
4、給兩個(gè)文件,分別有100億個(gè)整數(shù),我們只有1G內(nèi)存,如何找到兩個(gè)文件的交集
思路分析:
1)文件進(jìn)行比較,用位圖顯然不能解決
2)肯定要進(jìn)行哈希切分,我們將兩個(gè)文件分別切分為1000個(gè)文件,先對(duì)文件A分的1000個(gè)文件里的整數(shù)進(jìn)行哈希分配,即取出來(lái)整數(shù)模除1000,使相同的整出進(jìn)入相同的文件,文件B切分的1000個(gè)文件進(jìn)行同樣的處理,然后分別拿A哈希切分好的第一個(gè)文件和B哈希切分好的第一個(gè)文件對(duì)比,找出交集存到一個(gè)新文件中,依次類推,直到2000個(gè)文件互相比較完。
5、1個(gè)文件有100億個(gè)int,1G內(nèi)存,設(shè)計(jì)算法找到出現(xiàn)次數(shù)不超過(guò)2次的整數(shù)
思路分析:
1)這里類似于第三題
2)但是要找出現(xiàn)次數(shù)不超過(guò)2次的整數(shù),我們可以將狀態(tài)位圖的位用兩位,因?yàn)槲覀兙捅硎救N狀態(tài),在,不在,重復(fù)。
6、給兩個(gè)文件,分別有100億個(gè)query,我們只有1G內(nèi)存,如何找到兩個(gè)文件的交集?分別給出精確算法和近似算法
@精確算法:
思路分析:
1)我們首先來(lái)看,100億個(gè)query(一般query就當(dāng)做字符串),如果我們假定這里的一個(gè)字符串大小是50,那么我們就需要500G大的內(nèi)存,顯然放不下,所以我們就要進(jìn)行哈希切分
2)這里我將它切分成1000份,那么每份的大小就是500M,
3)然后我們使用什么方法來(lái)進(jìn)行這道題的具體解決呢,我來(lái)用圖示說(shuō)明下:
@近似算法:
利用布隆過(guò)濾器:
經(jīng)過(guò)哈希切分后,將其中一個(gè)放到哈希表中然后讓B來(lái)進(jìn)行比對(duì)
7、如何擴(kuò)展BloomFilter使得它支持刪除元素的操作
思路分析:
1)首先我們知道
? ? ? *布隆過(guò)濾對(duì)于不存在的數(shù)是能進(jìn)行準(zhǔn)確判斷的,但是對(duì)于存在的數(shù)是不一定,因?yàn)闀?huì)出現(xiàn)誤判的情況
? ? ? *由于布隆的特點(diǎn),因此它在實(shí)現(xiàn)的時(shí)候,是有多個(gè)置位的,因此不同的數(shù)(或者是其它的類型)會(huì)出現(xiàn)置位的沖突,所以如果直接進(jìn)行刪除的話,就會(huì)影響其它的數(shù)
2)因此,這里我們可以想到一種解決辦法就是利用引用計(jì)數(shù)
8、如何擴(kuò)展BlooFilter使得它支持計(jì)數(shù)操作?
思路分析:
1)上題中我們知道引用計(jì)數(shù)可以使得布隆過(guò)濾器實(shí)現(xiàn)刪除操作,但是有問(wèn)題,如果我們使用引用計(jì)數(shù)的話,至少得4個(gè)字節(jié),而我們知道布隆過(guò)濾器的優(yōu)點(diǎn)有節(jié)省空間,這樣的話,就有點(diǎn)違背了,所以我們就放棄位圖,所以這里我們呢就要考慮使用樣的什么數(shù)據(jù)結(jié)構(gòu)
2)(以字符串來(lái)為例)這里我們依然用vector來(lái)存儲(chǔ)引用計(jì)數(shù),然后進(jìn)行哈希字符串轉(zhuǎn)換算法進(jìn)行轉(zhuǎn)換,讓轉(zhuǎn)換后對(duì)應(yīng)的整型數(shù)作為下標(biāo)自增,這里很明顯就不用位圖了,利用引用計(jì)數(shù)已經(jīng)完成了它的功能。
3)所以我們進(jìn)行刪除的時(shí)候,就將計(jì)數(shù)中大于等于1的進(jìn)行減減復(fù)位
9、給上千個(gè)文件,每個(gè)文件大小為1K-100M。給n個(gè)詞,設(shè)計(jì)算法對(duì)每個(gè)詞找到所有包含它的文件,你只有100K內(nèi)存
思路分析:
1)注:文件不能進(jìn)行切分
2)//給定的內(nèi)存很小,我們將比如說(shuō)90K大小的直接利用哈希表進(jìn)行做,
? ?*?用一個(gè)文件info 準(zhǔn)備用來(lái)保存n個(gè)詞和包含其的文件信息。
? ?* 首先把n個(gè)詞分成x份。對(duì)每一份用生成一個(gè)布隆過(guò)濾器(因?yàn)閷?duì)n個(gè)詞只生成一個(gè)布隆過(guò)濾器,內(nèi)存可能不夠用)。把生成的所有布隆過(guò)濾器存入外存的一個(gè)文件Filter中。
? ?*將內(nèi)存分為兩塊緩沖區(qū),一塊用于每次讀入一個(gè)布隆過(guò)濾器,一個(gè)用于讀文件(讀文件這個(gè)緩沖區(qū)使用相當(dāng)于有界生產(chǎn)者消費(fèi)者問(wèn)題模型來(lái)實(shí)現(xiàn)同步),大文件可以分為更小的文件,但需要存儲(chǔ)大文件的標(biāo)示信息(如這個(gè)小文件是哪個(gè)大文件的)。
? ?*對(duì)讀入的每一個(gè)單詞用內(nèi)存中的布隆過(guò)濾器來(lái)判斷是否包含這個(gè)值,如果不包含,從Filter文件中讀取下一個(gè)布隆過(guò)濾器到內(nèi)存,直到包含或遍歷完所有布隆過(guò)濾器。如果包含,更新info 文件。直到處理完所有數(shù)據(jù)。刪除Filter文件。
備注:
1:關(guān)于布隆過(guò)濾器:其實(shí)就是一張用來(lái)存儲(chǔ)字符串hash值的BitMap.
2:可能還有一些細(xì)節(jié)問(wèn)題,如重復(fù)的字符串導(dǎo)致的重復(fù)計(jì)算等要考慮一下。
10、有一個(gè)字典,包含N個(gè)英文單詞,現(xiàn)在任意給一個(gè)字符串,設(shè)計(jì)算法找到包含這個(gè)字符串的所有英文單詞。
思路分析:
1)這里可以用kmp算法或者字典樹(shù)
總結(jié)
- 上一篇: select poll 与epoll模
- 下一篇: TCP端口扫描方式