雙層桶劃分學習筆記

weixin_33890499發表於2018-03-06

關於我的 Leetcode 題目解答,程式碼前往 Github:https://github.com/chenxiangcyr/leetcode-answers


適用範圍:求第 k 大,中位數,不重複或重複的數字,且元素範圍很大,不能一次載入記憶體。

基本原理:通過多次劃分,逐步確定範圍,然後最後在一個可以接受的範圍內進行。

問題1:在2.5億個整數中找出不重複的整數的個數。假設記憶體不足以同時容納2.5億個整數。

  • 方案1:
    整數個數為 2^32,也就是,我們可以將這 2^32 個數,劃分為 2^8 個區域(比如2^8 個檔案),然後將資料分離到不同的區域,然後不同的區域在利用 bitmap 就可以直接解決了。
  • 方案2:
    採用 2-bitmap,每個數分別 2 個bit,00 表示出現 0 次,01 表示出現 1 次,11 表示出現多次。
    需要記憶體 2.5 億 * 2 = 5億 bit = 0.5G bit = 0.07G byte = 70M
    依次掃描2.5億個整數:
    • 00 變 01
    • 01 變 11
    • 10 不變

問題2:在5億個整數中找出中位數。

  • 方案1:將這些數字劃分到 2^16 個區域,依次統計每個區域內元素的個數,根據統計結果,判斷出中位數位於哪個區域。隨後在重新掃描該區域。

相關文章