算法面試題:給40億個不重複的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中?

問題描述:給40億個不重複的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中?

問題分析:40億 不重複 ,沒有排序。

40億個unsigned int的整數,放到內存中的話,大約是16G,

(1)最直觀的的解決辦法,把所有的數據遍歷一遍,找出那個數.

注意:這個方法是不可取的,因爲把所有數據遍歷一遍,要把所有的數據加載到內存中,16G的數據可能內存存儲不下。

(2)基於第一種方法,內存加載不了16G的數據,就可以考慮到 外部排序:歸併排序的方法,先將一部分數據加載到內存中,然後查找。

(3)可以考慮使用位圖bitmap,1個bit存儲一個數字,那麼40億數據需要40億bit 大約就是500M內存。

用一個bit位來表示這個數據是否存在,1表示存在,0表示不存在。

時間複雜度爲O(n) + 查找時間O(1)。

(4)這個問題在《編程珠璣》裏有很好的描述,大家可以參考下面的思路,探討一下:
又因爲2^32爲40億多,所以給定一個數可能在,也可能不在其中;
這裏我們把40億個數中的每一個用32位的二進制來表示
假設這40億個數開始放在一個文件中。
然後將這40億個數分成兩類:
1.最高位爲0
2.最高位爲1
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=20億,而另一個>=20億(這相當於折半了);
與要查找的數的最高位比較並接着進入相應的文件再查找
再然後把這個文件爲又分成兩類:
1.次最高位爲0
2.次最高位爲1
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=10億,而另一個>=10億(這相當於折半了);
與要查找的數的次最高位比較並接着進入相應的文件再查找。
以此類推,就可以找到了,而且時間複雜度爲O(logn)


原文鏈接:https://blog.csdn.net/wenqiang1208/article/details/69669084

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章