40億個非負整數中找到出現兩次的數和中位數

2021-10-07 17:41:32 字數 523 閱讀 5838

問題

現有40億個32位的無符號整數(0~4294967295),可以最多使用1gb,找出出現兩次的數

補充問題:最多用10mb,找到中位數

思路

問題一:可以申請乙個長度為 4294967295 * 2 的bitmap,用兩個位置表示乙個詞頻,首次遇到數num,則bitarr[num2 + 1]和bitarr[num2] 置為01,第二次出現置為10,第三次出現置為11,之後再出現則不予理睬

再次遍歷bitarr,若bitarr[i2 + 1]和bitarr[i2]為10,那麼就對該數進行記錄

問題二:需要分割槽處理,長度為2mb的無符號整型陣列占用8mb,所以需要2148個區間,new arr[2148]

對每個區間的數進行統計,完成後便可知道第20億個數字於那個區間

接下來申請乙個2mb的無符號整型陣列countarr[0~2m-1](8mb),然後遍歷40億個數,只關心處於該區間的數,進行詞頻統計

最後計算就可找到中位數

40億個非負整數中找到沒出現的數

要求這裡的非負整數是32位也就是0 2 32 1。最多用1gb的記憶體。如果只能用10mb的空間呢,只需要找到乙個沒有出現的數即可。首先先分析一下,40億個4b約為16gb這裡只用1gb,這裡要求注意是找出沒出現,這就和網頁過濾系統類似,出現與不出現兩個狀態 0和1 那麼我們就可以用bit陣列來確定...

40億個非負整數中找到未出現的數

32位無符號整數的範圍是0 4 294 967 295,現在有乙個正好包含40億個無符號整數的檔案,所以在整個範圍中必然有未出現過的數。怎麼找到所有未出現過的數?要求 可以使用最多1gb的記憶體。高階 記憶體限制10mb,但是只用找到乙個沒出現過的數即可。常規方法 假設用雜湊表來儲存出現過的數,那麼...

40億個非負整數中找到出現2次的數和所有數的中位數

題目一 32位無符號整數的範圍是0 4294967295,現在有40億個無符號整數,可以使用最多1gb的記憶體,找出所有出現了兩次的數。題目二 記憶體限制在10mb,如何找到這40億個整數的中位數。解法思路 依然bit 陣列的思路,不過這次是雙倍長度了,因為我們除了要記錄這個數字,同時還有記錄他出現...