万变不离其宗之海量数据下的算法问题处理思路
本文介紹 萬變不離其宗之海量數(shù)據(jù)下的算法問題處理思路
萬變不離其宗之海量數(shù)據(jù)下的算法問題處理思路
本文由在當(dāng)?shù)剌^為英俊的男子金天大神原創(chuàng),版權(quán)所有,歡迎轉(zhuǎn)載,但請保留這段版權(quán)信息,多謝合作,有任何疑問歡迎通過微信聯(lián)系我交流:jintianiloveu
海量數(shù)據(jù)下的算法問題
本文開篇就引入了一個(gè)很重要的問題,海量數(shù)據(jù)處理下的算法問題。這個(gè)不管是在求職還是在以后的工作中都是必須會碰到的問題。因此,我在這里單獨(dú)開文一篇為大家講解這一系列問題的緣起緣消。讓大家不至于在海量數(shù)據(jù)中迷失自我。
既然是萬變不離其宗,那么肯定所有的問題都可以追本溯源,返璞歸真為幾類具有共同特性的問題。這里,我們先列舉出來,所有的海量數(shù)據(jù)算法問題,其實(shí)都可以被歸納成為這么幾類:?top K問題,?重復(fù)問題?,?排序問題。這三大問題,來頭可不一般,你能遇到的所有大數(shù)據(jù)海量數(shù)據(jù)問題,不外呼這三類。
先祭大殺器
在正式記錄這三大問題之前,我必須得有必要祭出幾個(gè)大殺器,這些方法在處理大數(shù)據(jù)問題上是通用的,也就是說這些方法都是最基本的套路,但是我盡量不研究的非常復(fù)雜。
位圖法
咋一看,這個(gè)名字很簡單,但是實(shí)際上可不是這樣的,這個(gè)方法的思想非常牛逼。我們從這么一個(gè)問題來看,假如有2.5億個(gè)int的整數(shù),給你一個(gè)整數(shù),讓你來判斷一下,這個(gè)整數(shù)是否在這2.5億個(gè)整數(shù)之中。要求速度盡可能的快,你會怎么辦呢?
很多人會說,我會非常機(jī)智的遍歷一遍這些整數(shù),如果沒有一樣的就不存在如果有就存在。沒錯(cuò),這沒有錯(cuò),但是假如又來了一個(gè)整數(shù),又讓你判斷有沒有在里面,這個(gè)時(shí)候你又得遍歷一遍。這是非常不科學(xué)的做法。這個(gè)時(shí)候我們的位圖法就牛逼的出現(xiàn)了。
位圖法比較適合于判斷是否存在這樣的問題,元素的狀態(tài)比較少,元素的個(gè)數(shù)比較多的情況之下。那么具體咋么做呢,這樣,非常簡單明了就是,2.5億個(gè)整數(shù)里面,我維護(hù)一個(gè)長度等于最大整數(shù)值得字符串,每個(gè)整數(shù)是否存在我就在該整數(shù)對應(yīng)的位置置為1,比如,有{2, 4, 5, 6, 67, 5}這么幾個(gè)整數(shù),我維護(hù)一個(gè) 00…0000 67位的字符串。但是,如果你不知道整數(shù)的最大值,你至少需要一個(gè)長度2^32的字符串,因?yàn)檎麛?shù)的最大值就是2^32,(int占4個(gè)字節(jié),因此是32位),那這就最少是512M內(nèi)存,從char的長度算內(nèi)存會算吧,直接*8/2^20 就是M的單位。那這么說來就可以理解位圖法了。
top K問題
首先讓我們來研究一下top k問題。殺器已經(jīng)寄出,接下來我記錄幾個(gè)經(jīng)典的大數(shù)據(jù)問題:
這些問題怎么解答,我們一起來慢慢思考吧,先放在這里。
重復(fù)問題
重復(fù)問題包括去重,尋找共同的重復(fù)元素,等都是這個(gè)問題。同樣的,這里也先把問題歸并出來:
在這些問題里面,最簡單最重要的就是去重問題,我吃完飯之后繼續(xù)寫。比如給你一個(gè)wifi密碼字典,里面重復(fù)的密碼會大大增加無用功,你得去掉,但是一個(gè)字典少則上萬多則上千億,非常大的數(shù)據(jù),你怎么去重?
終于吃完飯了,我們繼續(xù)。
剛才看到了一個(gè)看上去十分可行的方法:
| 如果數(shù)據(jù)無法一次性讀入內(nèi)存,那么可以,首先設(shè)定一個(gè)hash函數(shù),把每一行的字符串映射成為一個(gè)0-n(什么函數(shù)這么牛逼請告訴我),然后把文件分拆成為比如500個(gè)小文件,那么重復(fù)的字符串一定在相同的小包中,這個(gè)時(shí)候就可以對每個(gè)小包進(jìn)行去重,方法很簡單,一行命令sort foo1.txt|unique ,對所有的小包去重之后再合并起來就可以得到一個(gè)大文件啦。(話說把所有小文件合并到大文件有簡單的可行方案否?) |
總的來說,解決海量數(shù)據(jù)中的重復(fù)問題無外乎兩大法寶:
那最后看來,比較可行的還是分而治之比較靠譜一些。
排序問題
最后是海量數(shù)據(jù)的排序問題。這個(gè)我就不一一說了。。。
下一個(gè)博客,我將會實(shí)際的實(shí)戰(zhàn)一下,用這些方法處理實(shí)際的大數(shù)據(jù)問題。
總結(jié)
以上是生活随笔為你收集整理的万变不离其宗之海量数据下的算法问题处理思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PaddlePaddle, Tensor
- 下一篇: GAN——UNIT简单梳理