40个亿非负整数中找到未出现的数
題目:
32位無符號的范圍是0-42 9496 7295,現在有一個正好包含40億個無符號整數的文件,所以在整個范圍中必然有未出現的數。
初階:可以使用最多1GB的內存,怎么找到所有未出現過的數
進階:內存限制為10MB,但是只用到一個沒出現過的數即可
思路:
首先明確兩個公式:1B = 8bit? ? 32b = 4B
一個數占4B
40億個數大約16GB空間
簡單的辦法(初階) 就是申請一個42 9496 7295的bit array 數組,遍歷40億個數,如在某個數對應位置,則該數組相應位置標記為1,遍歷40億文件之后,再遍歷數組,發現哪個位置為0,表示該位置的數未出現過。
此辦法所需要空間:42 9496 7295b =?42 9496 7295/8 B 大約500M空間
還有一個辦法(進階)就是根據內存限制10MB=10 000 KB = 10 000 000 B = 80 000 000 b?
根據內存限制一下子只能處理大約80000個數,原始42 9496 7295 個數 / 80 000 000 大約等于50多個空間
所以反過來思考總結一下:
1、首先申請一個大于50多個空間的空間(假設申請64個)
2、 一共64個空間,共有42 9496 7295個數,每個空間大概67000000左右個數
遍歷42 9496 7295個數 如果數的范圍在那個空間,則該空間加1,此步驟所需內存為64*4B?
3、選擇區間位置沒有滿的空間,針對該空間遍歷42 9496 7295個數只選擇落在該空間的數,申請一個67000000左右的數組,如果那個數在對應位置,則該位置變為1,最終遍歷該空間找出為0的位置,對應的數即可找到,此步驟所需空間大小為67 000 000b 大約8M
?
?
總結
以上是生活随笔為你收集整理的40个亿非负整数中找到未出现的数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 认识哈希函数(散列函数)
- 下一篇: 找到100亿个URL中重复的URL及搜索