多層劃分
方法介紹
多層劃分法,本質上還是分而治之的思想,因爲元素範圍很大,不能利用直接尋址表,所以通過多次劃分,逐步確定範圍,然後在一個可以接受的範圍內進行查找。
問題實例
1. 尋找不重複的數
2.5 億個整數中找出不重複的整數的個數,內存空間不足以容納這 2.5 億個整數
分析:類似於鴿巢原理,因爲整數個數爲 2
32,所以,我們可以將這 2
32個數,劃分爲 28個區域(比如
用單個文件代表一個區域),然後將數據分離到不同的區域,最後不同的區域再利用 bitmap 就可以直接解
決了。也就是說只要有足夠的磁盤空間,就可以很方便的解決。
2. 尋找中位數
5 億個 int 找它們的中位數。
分析:首先將 int 劃分爲 2^16個區域,然後讀取數據統計落到各個區域裏的數的個數,之後根據統計結
果就可以判斷中位數落到哪個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃描我們
只統計落在這個區域中的那些數就可以了。
實際上,如果不是 int 是 int64,我們可以經過 3 次這樣的劃分即可降低到能夠接受的程度。即可以先
將 int64 分成 2^24個區域,確定區域的第幾大數,然後再將該區域分成 2^20個子區域,確定是子區域的第幾
大數,最後當子區域裏的數的個數只有 2^20個時,就可以直接利用直接尋址表 direct addr table 進行統計了。