一篇文章存成乙個巨大的檔案,總共大約有一億個單詞,要找出裡面重複次數最多的。怎麼做?
hadoop是一把威力巨大的榔頭,在使用過hadoop之後,看著任何東西都想把它給map reduce了。有乙個關於jeff dean的小笑話,說在睡不著覺的時候,一般人是數羊,jeff dean是map reduce他的羊群。所以,我的辦法是,把這個檔案拆分成若干個小檔案,在map過程用hash演算法保證相同的單詞落入乙個檔案(這點很重要),計算單詞出現次數,在reduce過程取得重複次數最多的單詞來。
這只是乙個用榔頭來敲釘子的乙個小例子而已,在我剛學演算法的時候,那時候剛接觸外排序,這樣的問題我或許會第一反應使用外排序來做,在那個時候,這把榔頭就是外排序。但實際上呢,外排序的效率比上面提到的方法都低得多,只有在記憶體實在不夠用的時候才適合考慮(即便在記憶體不夠用的情況下,我們依然可以利用hash,把大檔案劃分成若干個小到記憶體可以容納為止的檔案,分別計算以後在來歸併求最大數,目的就是要盡量避免外排序帶來的大量磁碟讀寫)。
如果再把思路放寬一點,真的需要統計所有的單詞嗎?其實對於一篇文章來說,其中的內容都是有文字意義的,換言之,只有很少的單詞可能成為「重複最多」的,這個數量應該是非常非常有限的。比如在遇到乙個「is」的時候,我們知道要把它列入統計範疇,但是遇到「distribution」這樣的詞呢,大可跳過。
還可以找得到很多這樣的榔頭,比如概率公式,c(m,n)和a(m,n),即組合數和排列數,對於某些概率、混合、排列的問題就用它來套;再比如常見的榔頭——動態規劃,學了以後看到求最優解問題就很想用dp來解;還有在資料量很大的情況下利用hash、區域劃分等等「分而治之」的化簡思想……但是,這些都是常規思路,就如同top k問題用堆排序來求解,尋找「不出現」的單詞就使用bit map,「不重複出現」的單詞就使用2-bit map等等這樣的問題一樣,終歸是簡單粗暴那一類的。即便解決了問題,也沒有給人眼前一亮的「巧妙」的感覺。
跳出演算法,在很多任務程問題上也有類似的體會。記得以前在做乙個專案的單元測試,easy mock + easy mock extension + power mock,這樣一套庫,mock的能力實在強大,幾乎沒有測試不了的**了,於是就拿了這把榔頭到處砸,卻忘了單元測試的最終目的是什麼,那一些**是值得做單元測試的。後來利用ant給測試環境中,不關心邏輯的那一層,使用自己寫的樁**mock掉,並且去掉了好多價值不大的測試**(在**更新的時候測試**需要同步維護,這個成本不划算,所以我們把一些價值有但不大的單元測試用例合併或者刪除了),層次反而更清楚,測試**反而更易懂了。
前些日子和我們組的數學達人討論問題的時候他說,我們最常見的最通用的榔頭,主要還是在「解空間的搜尋」和「解的構造」這兩方面。如果能構造,複雜程度往往就要低於搜尋,這是乙個遞進;而另一方面,任何乙個實際問題都是有額外資訊的,通用的榔頭卻是不考慮這些實際資訊的,就像這個求重複次數最多的單詞問題一樣,檔案有多大、檔案內存放的是一篇實際有意義的文章,等等(再比如如果這個檔案裡面不是一億個單詞,而是一億個整數呢),這些都是額外的資訊,這是另乙個遞進。利用這些,簡化了問題,就可以殺雞不用牛刀了吧。
老闆,請給我換一把好一點的椅子
序言 你是it人麼?你的椅子坐著舒服麼?給你的老闆看看這封具有普遍性的信吧!老闆 來到公司這麼久,第一次向您提出我的乙個小小的要求 如果可能的話,請給我換一把好一點的椅子,好嗎?首先允許我簡單的計算一下 作為乙個普通的員工,從早晨九點到晚上六點 很多時候還要加班 我要在公司起碼有9個小時,至少有八個...
一把一把撈大資料 釋放無限價值
電商平台對於傳統經濟是個怎樣的存在?是阻礙還是發展,全看你如何選擇。面對新環境還依然按照傳統模式發展必然會受到阻礙,經濟就是要在新的環境下適應新的發展,只故步自封不會有大發展。一把一把撈讓電子商務與大資料技術進一步融合,釋放無限價值。電商平台對於傳統經濟是個怎樣的存在?是阻礙還是發展,全看你如何選擇...
一把鼻涕一把淚 搭建公網ftp伺服器
至於為什麼要搭建公網ftp伺服器,就當我心血來潮吧。ftp開源工具很多,咱用的是filezilla伺服器。後來為了方便搭建web伺服器,就改成了整合工具xampp。客戶端工具也是filezilla client,用瀏覽器也行。首先內網使用者想搭建公網ftp伺服器第乙個要解決的問題是如何得到公網ip。...