之前在網上看過乙個很有意思的問題?
在單機且記憶體不能放下全部足量的資料的情況下,如何在1t的檔案中,找到重複的兩行?
看完這個問題,不妨我們來思考一下如何實現...
首先實現這個問題我們的第一想到的最笨的解決方案就是對每一行都與檔案中後面所有的行進行比較,這種方式的時間複雜度很高為o(n^2)...
那麼有沒有更好的解決方案呢...
這個時候我們還有一種思路就是將資料放到hashset中,運用hash表不能加入重複的key的特徵來實現需求,可是我們題目的條件是記憶體不能放下全部足量的資料..因此這個方案不可行。
但是我們可以借鑑雜湊表的思想,雜湊表是將資料根據hashcode經過演算法算出對應的hash值,然後根據hash值找到陣列下標,然後將資料存放到對應下標的位置,然後如果有雜湊衝突,一般採用拉鍊法來解決..看到這裡我們是否也能運用雜湊表的原理來實現上述需求呢?下面我們來推演一下..
首先我們可以讀取檔案的每一行,然後根據每一行來模仿雜湊表算出它的hashcode。拿到了hashcode,我們應該幹啥呢?
雜湊表中的陣列,它主要是用來儲存相同hashcode值的地方,那我們可以類似的將相同hashcode的行儲存到相同的乙個檔案中,於是我們可以根據hashcode對1000取模,也就是將檔案根據hashcode值分為1000份,那麼每份的大小大約就是1gb的大小,這下記憶體可以放的下了吧,然後我們就可以利用我們之前想到的hashset,來判斷是不是重複行了。
上述的這種思想其實就是一種分治的思想,將檔案根據某個規則切分成多分,對每乙份進行處理,最終完成需求。
1.這個過程的實現複雜度是多少呢?
首先對每一行進行遍歷,時間複雜度為o(n),然後根據每個拆分後的小檔案,運用hashset來判斷重複行,1000個小檔案,每個小檔案處理的最壞情況,複雜度為o(n),所有總的時間複雜度為o(n+1000*n)=o(n),這種方式比上述的最笨的方式o(n^2)來說,是不是快的多呢...
2.磁碟io會耗費多少時間
然後我們可以算一下這個過程會磁碟io會耗費多少時間,首先i/o操作從檔案中讀取1tb的資料按照1分鐘1gb的傳輸速度,差不多要100分鐘,然後對每個小檔案進行查重,最壞情況下差不多要100分鐘。因此這個過程對應於單價來說,耗時3個小時20分鐘。
如何在給定的整數陣列中找到重複的數字
最先湧現的想法是遍歷一遍陣列,用hash表記錄每乙個數字出現的次數 用空間換時間 劍指offer解法 重新排序陣列每個數字,當掃瞄到數字m的時候判斷下標為i的數字是否等於m 如果是,就尋找下乙個 如果不是,就判斷下標為m的對應的數字是否等於m,如果它與第m個數字相等,就等於找到了乙個重複的數字,如果...
如何在學習中找到樂趣?怎樣才能找到學習的樂趣
我們可以把學習比作談戀愛。把她當成你的戀人,這樣你就對她產生了興趣,然後你就會千方百計的想去了解她,在這追求之中會有很多的樂趣。學習也是一樣,只有不斷深入的學習,你就會發現很多有趣的東西。無論做什麼事情,上乘的境界是樂在其中。只有樂在其中,做事才能又快又好。很多作家,伏案耕耘,通宵不眠,渾然不知疲倦...
如何在一次遍歷中找到單個鍊錶的中值
我的想法記錄 如果這個鍊錶本身是有序的就好辦了,直接取到 len 2 就得到中值 不對單鏈表不能隨機訪問,要想求表長,得從第乙個結點開始順序依次訪問表中每乙個結點,然後計數,直到訪問到空結點為止 可是題目中沒有說這個單鏈表是有序的誒 遍歷一次,可以找到max 或者 min 怎麼一次就找到中值呢?還有...