要求這裡的非負整數是32位也就是0~2^32-1。最多用1gb的記憶體。如果只能用10mb的空間呢,只需要找到乙個沒有出現的數即可。
首先先分析一下,40億個4b約為16gb這裡只用1gb,這裡要求注意是找出沒出現,這就和網頁過濾系統類似,出現與不出現兩個狀態(0和1),那麼我們就可以用bit陣列來確定。我們用乙個長度為2^32的bit陣列,記憶體大小為2^29b為512mb不到乙個gb。bit陣列下標對應非負整數。陣列值表示是否出現。遍歷2遍。第一遍根據40億個數填充bit陣列,第二遍根據陣列為0的找出沒有出現的數。
對於第二個要求的話,只有10mb的空間,那麼我們只將512mb的陣列
分到只剩不到10mb,那麼將0~2^32-1的範圍分成64份,則bit陣列將只用8mb。再用乙個長度為64的int型別陣列來記錄每乙份的數字個數,這64個數中肯定有小於2^26的,找到這個數字段,在建立乙個長度為2^26bit陣列,遍歷40億的數,只關心在備選範圍裡資料,填充陣列,遍歷陣列,發現乙個未出現的數。
40億個非負整數中找到未出現的數
32位無符號整數的範圍是0 4 294 967 295,現在有乙個正好包含40億個無符號整數的檔案,所以在整個範圍中必然有未出現過的數。怎麼找到所有未出現過的數?要求 可以使用最多1gb的記憶體。高階 記憶體限制10mb,但是只用找到乙個沒出現過的數即可。常規方法 假設用雜湊表來儲存出現過的數,那麼...
40億個非負整數中找到出現2次的數和所有數的中位數
題目一 32位無符號整數的範圍是0 4294967295,現在有40億個無符號整數,可以使用最多1gb的記憶體,找出所有出現了兩次的數。題目二 記憶體限制在10mb,如何找到這40億個整數的中位數。解法思路 依然bit 陣列的思路,不過這次是雙倍長度了,因為我們除了要記錄這個數字,同時還有記錄他出現...
40億個非負整數中找到出現兩次的數和中位數
問題 現有40億個32位的無符號整數 0 4294967295 可以最多使用1gb,找出出現兩次的數 補充問題 最多用10mb,找到中位數 思路 問題一 可以申請乙個長度為 4294967295 2 的bitmap,用兩個位置表示乙個詞頻,首次遇到數num,則bitarr num2 1 和bitar...