日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

海量数据处理(二) :常见海量数据处理方法

發(fā)布時(shí)間:2024/4/11 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海量数据处理(二) :常见海量数据处理方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于常見的海量數(shù)據(jù)處理方法,通常為以下幾種,下面的題解也會(huì)圍繞這幾種解法展開

  • 位圖 / 布隆過(guò)濾器
  • 字典樹 / 倒排索引
  • 外部排序
  • 分治 / 哈希切割 + 堆 / 排序

1. 給40億個(gè)不重復(fù)的無(wú)符號(hào)整數(shù),沒(méi)排過(guò)序。給一個(gè)無(wú)符號(hào)整數(shù),如何快速判斷一個(gè)數(shù)是否在這40億個(gè)數(shù)中。

當(dāng)我們看到這樣一個(gè)題目時(shí),腦海中可能第一時(shí)間想到的就是排序 + 二分,但是要知道40億個(gè)無(wú)符號(hào)整數(shù)所占據(jù)的內(nèi)存空間達(dá)到了16G,這樣的數(shù)據(jù)是無(wú)法放進(jìn)內(nèi)存中進(jìn)行計(jì)算的,所以上面的方法無(wú)法實(shí)現(xiàn)。

我們需要用位圖來(lái)完成這道題,我們用一個(gè)位來(lái)表示一個(gè)整數(shù),所以40億個(gè)數(shù)據(jù)也僅僅只占用了500M,然后將所有的數(shù)據(jù)用直接定址法放入位圖中,并將放入的對(duì)應(yīng)位置1。當(dāng)進(jìn)行查詢時(shí),只要位圖的對(duì)應(yīng)位置為1,則說(shuō)明該數(shù)據(jù)在這40億個(gè)數(shù)據(jù)中。


2. 給定100億個(gè)整數(shù),設(shè)計(jì)算法找到只出現(xiàn)一次的整數(shù)?
這道題還是使用位圖來(lái)解決,但是由于我們需要找到只出現(xiàn)一次的整數(shù),此時(shí)對(duì)于每一個(gè)整數(shù)就存在著3種狀態(tài)(出現(xiàn)0次, 出現(xiàn)1次,出現(xiàn)多次),由于一個(gè)位只能表示兩種,所以我們需要對(duì)位圖進(jìn)行改造,此時(shí)變成用兩個(gè)位來(lái)映射一個(gè)數(shù)據(jù)。并且00代表出現(xiàn)0次,01代表出現(xiàn)1次,11代表出現(xiàn)多次。此時(shí)占據(jù)的空間是 1G

但是使用兩個(gè)位的位圖映射稍微有一點(diǎn)麻煩,所以可以考慮使用雙位圖來(lái)進(jìn)行解決,一個(gè)位圖就代表著一個(gè)位,組合起來(lái)就是我們需要的結(jié)果。做法如下
當(dāng)數(shù)據(jù)第一次出現(xiàn)時(shí)位圖1對(duì)應(yīng)位置置1,如果位圖1為1后再次出現(xiàn),則將位圖2對(duì)應(yīng)位置也置1,此時(shí)達(dá)到最終狀態(tài),對(duì)于后面的出現(xiàn)直接忽略。


3.給兩個(gè)文件,分別有100億個(gè)整數(shù),我們只有1G內(nèi)存,如何找到兩個(gè)文件交集?
100億個(gè)整數(shù)需要40G的內(nèi)存,所以我們這里還是使用位圖來(lái)解決。

方法1:將文件1的整數(shù)全部映射到位圖中,接著從文件2中讀取數(shù)據(jù),并在位圖中查詢?cè)摂?shù)據(jù),如果數(shù)據(jù)存在,則說(shuō)明該數(shù)據(jù)是交集之一。內(nèi)存消耗500M

方法2:將文件1和文件2中的整數(shù)分別映射到位圖1,位圖2中。接著遍歷兩個(gè)位圖,對(duì)每個(gè)位置按位與,如果為1則說(shuō)明該整數(shù)是交集之一,內(nèi)存消耗1G


4.位圖應(yīng)用變形:1個(gè)文件有100億個(gè)int,1G內(nèi)存,設(shè)計(jì)算法找到出現(xiàn)次數(shù)不超過(guò)2次的所有整數(shù)
此時(shí)的狀態(tài)有四種,出現(xiàn)次數(shù)為0,出現(xiàn)次數(shù)為1,出現(xiàn)次數(shù)為2,出現(xiàn)次數(shù)超過(guò)2。需要用到兩個(gè)位表示,所以還是使用第二題的雙位圖來(lái)進(jìn)行解決,00代表1次,01代表2次,10代表2次,11代表多次。消耗內(nèi)存1G


5.給兩個(gè)文件,分別有100億個(gè)query,我們只有1G內(nèi)存,如何找到兩個(gè)文件交集?分別給出精確算法和近似算法
query一般為URL中的查詢字符串或者SQL中的查詢語(yǔ)句,假設(shè)每個(gè)query30個(gè)字節(jié),那么100億個(gè)query也得300G的內(nèi)存才能裝下,而我們只有1G,所以直接放棄裝入內(nèi)存直接比對(duì)的做法。

近似算法:對(duì)于字符串,也可以采用位圖的思路進(jìn)行對(duì)某個(gè)字符串進(jìn)行標(biāo)記,也就是使用布隆過(guò)濾器來(lái)進(jìn)行處理。但是由于數(shù)據(jù)過(guò)多且空間不足,可能會(huì)因?yàn)橛成鋾r(shí)映射到了其他數(shù)據(jù)的比特位上,導(dǎo)致造成誤判。所以當(dāng)一個(gè)數(shù)據(jù)不存在于布隆過(guò)濾器中,則它必定不存在,但是如果一個(gè)數(shù)據(jù)存在于布隆過(guò)濾器中,它也不一定存在,所以布隆過(guò)濾器是近似算法

精確算法:如果要精確的進(jìn)行查找,那就必須得將數(shù)據(jù)放入內(nèi)存中,但是由于數(shù)據(jù)過(guò)大無(wú)法一次性放入,所以我們可以考慮對(duì)數(shù)據(jù)進(jìn)行切分。切割的方式有兩種,哈希切割和平均切割

平均切割: 平均切割不是一個(gè)很好的方法,但是它確實(shí)是我們很容易就能思考到的方法,我們將兩個(gè)文件中的數(shù)據(jù)平均切分為M份(能放入內(nèi)存),分別存儲(chǔ)到一個(gè)set中,然后以此將數(shù)據(jù)進(jìn)行比較。這種方法就需要以此對(duì)所有的數(shù)據(jù)進(jìn)行比對(duì),效率會(huì)比較低

哈希切割: 這時(shí)就可以采取哈希切割的思路,使用字符串哈希算法進(jìn)行哈希映射,映射位置為i,則放入編號(hào)為i的文件中,對(duì)兩個(gè)文件都采用這樣的做法進(jìn)行切分,分別為Ai和Bi。
之后,由于我們使用的是同一種字符串哈希算法,所以相同的字符串必定會(huì)被映射到同一個(gè)編號(hào)下的文件中,所以我們只需要依次進(jìn)入編號(hào)相同的Ai和Bi文件中尋找交集即可。


6.給一個(gè)超過(guò)100G大小的log file, log中存著IP地址, 設(shè)計(jì)算法找到出現(xiàn)次數(shù)最多的IP地址? 與上題條件相同,如何找到top K的IP?如何直接用Linux系統(tǒng)命令實(shí)現(xiàn)?
統(tǒng)計(jì)次數(shù)我們首先想到的方法就是使用鍵值對(duì)的方式,將每一個(gè)string的ip地址與出現(xiàn)次數(shù)相關(guān)聯(lián),pair<string, int>,然后使用KV模型的Map進(jìn)行存儲(chǔ)。但是由于數(shù)據(jù)超過(guò)100個(gè)G,內(nèi)存中無(wú)法直接存下,所以我們需要對(duì)數(shù)據(jù)進(jìn)行切割。
我們可以使用哈希切割的方式來(lái)解決文件分片的問(wèn)題。相同的IP地址必定會(huì)被映射到同一個(gè)文件中,所以我們依次讀取文件,使用Map進(jìn)行次數(shù)統(tǒng)計(jì)即可。

之后再進(jìn)行排序即可

Linux的命令如下

sort log_file | uniq -c | sort -nr | head -k

首先使用sort log_file來(lái)將數(shù)據(jù)進(jìn)行一個(gè)排序,使得相同的IP地址全部靠在一起。接著使用uniq - c進(jìn)行去重,并將重復(fù)的次數(shù)顯示在每列的旁邊,通過(guò)這個(gè)次數(shù)來(lái)使用sort -nr進(jìn)行降序排序,使得出現(xiàn)次數(shù)最的IP地址在前面,然后使用head -k 獲取前k個(gè)IP地址即可。


7.100w個(gè)數(shù)中找出最大的100個(gè)數(shù)
由于100w個(gè)數(shù)據(jù)并不算多,可以存放進(jìn)內(nèi)存中,所以可以考慮以下解法
方法1采用快排中的partition劃分思想,即單趟劃分后,樞軸s前面的數(shù)據(jù)都比他大,后面的數(shù)據(jù)都比他小,此時(shí)我們選取其中較大的那一部分,繼續(xù)劃分。當(dāng)劃分后前端的數(shù)據(jù)剛好等于100后劃分結(jié)束,對(duì)前端數(shù)據(jù)進(jìn)行排序即可得到結(jié)果。如果前端數(shù)據(jù)不足100,則從后端數(shù)據(jù)進(jìn)行排序后取出不足的那部分補(bǔ)上,再進(jìn)行排序即可。O(100w*100)
方法2局部淘汰法,使用一個(gè)大小為100的小堆來(lái)完成,維護(hù)一個(gè)小堆,當(dāng)數(shù)據(jù)比堆頂也就是最小值大的時(shí)候,用新數(shù)據(jù)替換掉堆頂,然后調(diào)整堆的結(jié)構(gòu)。遍歷完所有數(shù)據(jù)后就可以得到前100的數(shù)據(jù)。O(100w*lg100)
方法3局部淘汰法,使用插入排序來(lái)完成,首先取出前100個(gè)數(shù)據(jù)進(jìn)行排序,然后依次遍歷后面的數(shù)據(jù),如果數(shù)據(jù)大于最小值,則將最小值刪除,然后按照插入排序的思路將數(shù)據(jù)插入進(jìn)去。
O(100w*100)


8.海量數(shù)據(jù)分布在100臺(tái)電腦中,想個(gè)辦法高效統(tǒng)計(jì)出這批數(shù)據(jù)的TOP10。
解法與上一題類似,可以使用堆來(lái)完成
對(duì)于每一個(gè)電腦,都構(gòu)建一個(gè)大小為10的堆(選大的構(gòu)建小堆,選小的構(gòu)建大堆),選出當(dāng)前電腦的TOP10。接著將所有電腦的數(shù)據(jù)匯總起來(lái),共1000個(gè)數(shù)據(jù),繼續(xù)用堆從其中選出TOP10


9.給上千個(gè)文件,每個(gè)文件大小為 1K—100M。給 n 個(gè)詞,設(shè)計(jì)算法對(duì)每個(gè)詞找到所有包含它的文件,你只有 100K 內(nèi)存
這題可以使用倒排索引來(lái)解決,即建立起單詞——文件的映射。
很簡(jiǎn)單,只需要遍歷所有文章,如果文章中出現(xiàn)過(guò)查詢?cè)~,則將文件號(hào)追加在對(duì)應(yīng)詞的倒排拉鏈中即可。如果100M的文件放不下內(nèi)存中,就對(duì)數(shù)據(jù)進(jìn)行切割后處理即可。

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的海量数据处理(二) :常见海量数据处理方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。