背景
之前找工作在騰訊面試遇到了一個很有意思的面試題,當時我記得現場還沒有答出來,后來回家想了一下其實也沒有那么難,而且還挺有意思的,今天做個整理分享給大家,希望對你有用
題目如下
文件中有20億
個QQ號碼,請設計算法對QQ號碼去重,相同的QQ號碼僅保留一個,內存限制1G
. 這個題目的意思應該很清楚了,不過為了方便大家理解,我畫了一個比較有年代感的動畫,希望大家喜歡
方法一
排序去重
其實說到去重,最簡單的方法就是先排序,排序之后重復的QQ號碼必然在一起,保留第一個,把其余重復的去掉就行,
整個過程如下面動畫 雖然這樣可以解決問題,排序往往復雜度都很高,所以必定不是最優解
方法二
hashmap
如果排序的復雜對太高,那么直接用hashmap吧,hashmap的復雜度為O(1),思路其實很簡單,就是直接把qq號記錄到hashmap中,要是php的話直接記錄在數組中就可以
hashMap[123] = true
hashMap[456] = true
hashMap[123] = true
hashMap[789] = true
由於hashmap的自動去重性質,所以自動變成了:
hashMap[123] = true
hashMap[456] = true
hashMap[789] = true
很顯然,只有123,456,789存在,所以這也就是去重后的結果。
可是,面試官又要問你了:實際要存20億QQ號碼,1G的內存夠分配這么多空間嗎?顯然不行,這樣回答你還是無法通過騰訊面試
。
方法三
bitmap
來看絕招!我們可以對hashmap進行優化,采用bitmap這種數據結構,可以順利地同時解決時間問題和空間問題。 如果對bitmap不是很熟悉,可以看看我的這兩篇文章
對bitmap有了大概的了解之后,我們直接把存在的qq號碼對應的位置標記為1即可,下次查詢只要對應的位為1,則為重復的qq號碼,因為bitmap是一種非常省空間的數據結構,所以能夠滿足內存在1G之內的要求
好了,咱們今天先分享到這里,歡迎關注我的公眾號,程序員小飯,我們下次見了