C++(面試題):給40億個不重複的無符號整數,沒排過序,如何快速判斷一個數是否在這40億個數中

給40億個不重複的無符號整數,沒排過序,給你一個無符號整數,如何快速判斷這個數是否在這40億個數中?

首先看到這個題第一個想到的就是遍歷一遍,看這個數在不在。但是這樣的時間複雜度太高了O(N),數據量太大,因此該方法不行。

其次我們想到排序,利用二分查找,時間複雜度是O(logN),但是排序本身就有很大的消耗,並且40億個數據內存一次也存不下。

那麼就採用位圖!位圖就是用來判斷一個數據在不在的最好方法了!

分析

  1. 位圖是一種直接定址法的哈希,因此效率很高,用O(1)就可以探測到對應位是0還是1,效率非常高,因此可以快速判斷。
  2. 40億個數據,我們可以大概計算一下,一個數據4字節,那麼40億數據就是160億字節。我們都知道4G大概是42億九千萬字節,那麼1G大概也就是10億字節,所以160億字節大約就是16G,因此要把40億個數據存放到內存中需要16G的內存空間。數據量還是非常大的,如果我們採用位圖的話,一個數據就佔一個比特位,42億九千萬個字節需要512M就可以存下,因此用位圖存的話也節省了空間。【但是這裏我們開空間的話需要注意要開42億九千萬字節,有人可能會有疑問?爲什麼不是40億,題目不就是40億個數據嗎?但是我們要注意,位圖開的是一個範圍,因爲難免這40億個數據中會有大於40億的數據出現,萬一出現一個大小爲41億的數據呢,那我們把這個數據映射到哪裏呢,所以開的範圍是就是42億九千萬字節,一個位置對應一個數】
  3. 使用位圖,先將這些數遍歷一般進行set(把每個出現的數據的對應位圖的位置爲1),然後要查找某個數在不在時,直接test這個數即可,返回真就是存在,返回假就是不存在。

具體代碼的實現可以戳博主的上一篇文章~數據結構:位圖

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