利剑无意之如何判断一个数在40亿个整数中
如何判斷一個數在40億個整數中
首先思路:用一個set存儲就好了,整數32位,一個整數4個字節,40億個整數,應該是160億個字節,大概16GB。
此刻問題又來了,我的機器只有2GB內存,但是需要盡可能快的得出答案,怎么辦?【注:可以增加機器】
1)如果說我們沒有增加機器,分8次進行加載數據,從磁盤加載數據是磁盤io操作,是非常慢的,每次都要加載這么大的數據,還要8次,估計你找一個數的時間可以達到分鐘甚至小時級了。
【磁盤IO操作非常慢,比內存中的操作要慢百倍】
2)優化方案【秒級】:使用8臺機器分別計算,最后匯總結果,一次性讀入數據,查找很快。
3)再次優化【毫秒級】:判斷一個數存在不存在,其實只有兩個狀態,可以用一個位來表示。
32位int的范圍,總共就是2的32次方,大概42億多點。所以可以申請2的32次方個位。把整個整數范圍都覆蓋了,。這樣一來,就可以做了,1代表第一個位,2代表第二個位,2的32次方代表最后一個位。40億個數中,存在的數就在相應的位置1,其他位就是0。這樣2的32次方個位,相當于2的29次方個字節,只占500MB內存。
【因為原來的32位整數,轉化為了1位的布爾,所以數據空間就是原來的32/1。】
這是一種非常有名的大數據算法,叫位圖法,英文名叫bitmap。顧名思義,就是用位來表示狀態,從而節省空間。
3)首先,32位int的范圍是42億,40億整數中肯定有一些是連續的,我們可以先對數據進行一個外部排序,然后用一個初始的數和一個長度構成一個數據結構,來表示一段連續的數,舉個例子。如果數據是1 2 3 4 6 7……這種的,那么可以用(1,4)和(6,2)來表示,這樣一來,連續的數都變成了2個數表示。來了一個新數之后,就用二分法進行查找了。
這樣一來,最差情況就是2億多的斷點,也就是2億多的結構體,每個結構體8個字節,大概16億字節,1.6GB,在內存中可以放下。
?
總結
以上是生活随笔為你收集整理的利剑无意之如何判断一个数在40亿个整数中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大剑无锋之二分搜索、二分搜索时间复杂度、
- 下一篇: 无法打开虚拟机,获取该虚拟机的所有权失败