騰訊二面:20億個QQ號碼如何去重?


背景

之前找工作在騰訊面試遇到了一個很有意思的面試題,當時我記得現場還沒有答出來,后來回家想了一下其實也沒有那么難,而且還挺有意思的,今天做個整理分享給大家,希望對你有用

題目如下

文件中有20億個QQ號碼,請設計算法對QQ號碼去重,相同的QQ號碼僅保留一個,內存限制1G. 這個題目的意思應該很清楚了,不過為了方便大家理解,我畫了一個比較有年代感的動畫,希望大家喜歡 去重gif圖

方法一

排序去重

其實說到去重,最簡單的方法就是先排序,排序之后重復的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不是很熟悉,可以看看我的這兩篇文章

redis中bitmap(位操作)的實際應用

12306搶票算法居然被曝光了!!!居然這么簡單

對bitmap有了大概的了解之后,我們直接把存在的qq號碼對應的位置標記為1即可,下次查詢只要對應的位為1,則為重復的qq號碼,因為bitmap是一種非常省空間的數據結構,所以能夠滿足內存在1G之內的要求

好了,咱們今天先分享到這里,歡迎關注我的公眾號,程序員小飯,我們下次見了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM