<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          40億個QQ號碼如何去重?

          共 2435字,需瀏覽 5分鐘

           ·

          2021-12-10 06:21


          今天,我們來聊一道常見的考題,也出現(xiàn)在騰訊面試的三面環(huán)節(jié),非常有意思。具體的題目如下:

          文件中有40億個QQ號碼,請設(shè)計算法對QQ號碼去重,相同的QQ號碼僅保留一個,內(nèi)存限制1G.?

          這個題目的意思應(yīng)該很清楚了,比較直白。為了便于大家理解,我來畫個動圖玩玩,希望大家喜歡。


          能否做對這道題目,很大程度上就決定了能否拿下騰訊的offer,有一定的技巧性,一起來看下吧。

          在原題中,實際有40億個QQ號碼,為了方便起見,在圖解和敘述時,僅以4個QQ為例來說明。


          方法一:排序

          很自然地,最簡單的方式是對所有的QQ號碼進行排序,重復(fù)的QQ號碼必然相鄰,保留第一個,去掉后面重復(fù)的就行。

          原始的QQ號為:


          排序后的QQ號為:


          去重就簡單了:


          可是,面試官要問你,去重一定要排序嗎?顯然,排序的時間復(fù)雜度太高了,無法通過騰訊面試


          方法二:hashmap

          既然直接排序的時間復(fù)雜度太高,那就用hashmap吧,具體思路是把QQ號碼記錄到hashmap中:

          mapFlag[123] = truemapFlag[567] = truemapFlag[123] = truemapFlag[890] = true
          由于hashmap的去重性質(zhì),可知實際自動變成了:
          mapFlag[123] = truemapFlag[567]?=?truemapFlag[890] = true
          很顯然,只有123,567,890存在,所以這也就是去重后的結(jié)果。

          可是,面試官又要問你了:實際要存40億QQ號碼,1G的內(nèi)存夠分配這么多空間嗎?顯然不行,無法通過騰訊面試。


          方法三:文件切割

          顯然,這是海量數(shù)據(jù)問題??催^很多面經(jīng)的求職者,自然想到文件切割的方式,避免內(nèi)存過大。

          可是,絞盡腦汁思考,要么使用文件間的歸并排序,要么使用桶排序,反正最終是能排序的。

          既然排序好了,那就能實現(xiàn)去重了,貌似就萬事大吉了。我只能坦白地說,高興得有點早哦。

          接著,面試官又要問你:這么多的文件操作,效率自然不高啊。顯然,無法通過騰訊面試


          方法四:bitmap

          來看絕招!我們可以對hashmap進行優(yōu)化,采用bitmap這種數(shù)據(jù)結(jié)構(gòu),可以順利地同時解決時間問題和空間問題。

          在很多實際項目中,bitmap經(jīng)常用到。我看了不少組件的源碼,發(fā)現(xiàn)很多地方都有bitmap實現(xiàn),bitmap圖解如下:


          這是一個unsigned char類型,可以看到,共有8位,取值范圍是[0, 255],如上這個unsigned char的值是255,它能標(biāo)識0~7這些數(shù)字都存在。

          同理,如下這個unsigned char類型的值是254,它對應(yīng)的含義是:1~7這些數(shù)字存在,而數(shù)字0不存在:


          由此可見,一個unsigned char類型的數(shù)據(jù),可以標(biāo)識0~7這8個整數(shù)的存在與否。以此類推:

          • 一個unsigned int類型數(shù)據(jù)可以標(biāo)識0~31這32個整數(shù)的存在與否。

          • 兩個unsigned int類型數(shù)據(jù)可以標(biāo)識0~63這64個整數(shù)的存在與否。


          顯然,可以推導(dǎo)出來:512MB大小足夠標(biāo)識所有QQ號碼的存在與否,請注意:QQ號碼的理論最大值為2^32 - 1,大概是43億左右。

          接下來的問題就很簡單了:用512MB的unsigned int數(shù)組來記錄文件中QQ號碼的存在與否,形成一個bitmap,比如:

          bitmapFlag[123] = 1bitmapFlag[567] = 1bitmapFlag[123] = 1bitmapFlag[890] = 1
          實際上就是:
          bitmapFlag[123] = 1bitmapFlag[567]?=?1bitmapFlag[890] = 1
          然后從小到大遍歷所有正整數(shù)(4字節(jié)),當(dāng)bitmapFlag值為1時,就表明該數(shù)是存在的。
          而且,從上面的過程可以看到,自動實現(xiàn)了去重。顯然,這種方式可以通過騰訊的面試。



          擴展練習(xí)一

          文件中有40億個互不相同的QQ號碼,請設(shè)計算法對QQ號碼進行排序,內(nèi)存限制1G.?

          很顯然,直接用bitmap, 標(biāo)記這40億個QQ號碼的存在性,然后從小到大遍歷正整數(shù),當(dāng)bitmapFlag的值為1時,就輸出該值,輸出后的正整數(shù)序列就是排序后的結(jié)果。

          請注意,這里必須限制40億個QQ號碼互不相同。通過bitmap記錄,客觀上就自動完成了排序功能。


          擴展練習(xí)二

          文件中有40億個互不相同的QQ號碼,求這些QQ號碼的中位數(shù),內(nèi)存限制1G.?

          我知道,一些刷題經(jīng)驗豐富的人,最開始想到的肯定是用堆或者文件切割,這明顯是犯了本本主義錯誤。直接用bitmap排序,當(dāng)場搞定中位數(shù)。


          擴展練習(xí)三

          文件中有40億個互不相同的QQ號碼,求這些QQ號碼的top-K,內(nèi)存限制1G.?

          我知道,很多人背誦過top-K問題,信心滿滿,想到用小頂堆或者文件切割,這明顯又是犯了本本主義錯誤。直接用bitmap排序,當(dāng)場搞定top-K問題。


          擴展練習(xí)四

          文件中有80億個QQ號碼,試判斷其中是否存在相同的QQ號碼,內(nèi)存限制1G.?

          我知道,一些吸取了經(jīng)驗教訓(xùn)的人肯定說,直接bitmap啊。然而,又一次錯了。根據(jù)容斥原理可知:

          因為QQ號碼的個數(shù)是43億左右(理論值2^32 - 1),所以80億個QQ號碼必然存在相同的QQ號碼。



          海量數(shù)據(jù)的問題,要具體問題具體分析,不要眉毛胡子一把抓。有些人完全不刷題,肯定不行。有些人刷題后不加思考,不會變通,也是不行的。好了,先說這么多。我們也會一步一個腳印,爭取每篇文章講清講透一件事,也希望大家閱讀后有所收獲,心情愉快。


          推薦閱讀:

          圖解文章匯總
          計算機基礎(chǔ)學(xué)習(xí)路線
          為了拿捏 Redis 數(shù)據(jù)結(jié)構(gòu),我畫了 40 張圖(完整版)
          小林的圖解系統(tǒng),大曝光!
          不鴿了,小林的「圖解網(wǎng)絡(luò) 3.0 」發(fā)布!
          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人影音久久 | 青青草色成人网站视频 | 日韩精品一区二区三区四区五区六区 | 久久国产色 | 婷婷色五月天丁香色 |