在 2.5 億個整數中找出不重複的整數。注意:記憶體不足以容納這 2.5 億個整數。
方法一:分治法
與前面的題目方法類似,先將 2.5 億個數劃分到多個小檔案,用 hashset/hashmap 找出每個小檔案中不重複的整數,再合併每個子結果,即為最終結果。
方法二:位圖法
位圖,就是用乙個或多個 bit 來標記某個元素對應的值,而鍵就是該元素。採用位作為單位來儲存資料,可以大大節省儲存空間。
位圖通過使用位陣列來表示某些元素是否存在。它可以用於快速查詢,判重,排序等。不是很清楚?我先舉個小例子。
假設我們要對[0,7]
中的 5 個元素 (6, 4, 2, 1, 5) 進行排序,可以採用位圖法。0~7 範圍總共有 8 個數,只需要 8bit,即 1 個位元組。首先將每個位都置 0:
0 0 0 0 0 0 0 0
然後遍歷 5 個元素,首先遇到 6,那麼將下標為 6 的位的 0 置為 1;接著遇到 4,把下標為 4 的位 的 0 置為 1:
0 0 0 0 1 0 1 0
依次遍歷,結束後,位陣列是這樣的:
0 1 1 0 1 1 1 0
每個為 1 的位,它的下標都表示了乙個數:
for i in range(8):
if bits[i] == 1:
print(i)
這樣我們其實就已經實現了排序。
對於整數相關的演算法的求解,位圖法是一種非常實用的演算法。假設 int 整數占用 4b,即 32bit,那麼我們可以表示的整數的個數為 232。
那麼對於這道題,我們用 2 個 bit 來表示各個數字的狀態:
那麼這 232 個整數,總共所需記憶體為 232*2b=1gb。因此,當可用記憶體超過 1gb 時,可以採用位圖法。假設記憶體滿足位圖法需求,進行下面的操作:
遍歷 2.5 億個整數,檢視點陣圖中對應的位,如果是 00,則變為 01,如果是 01 則變為 10,如果是 10 則保持不變。遍歷結束後,檢視位圖,把對應位是 01 的整數輸出即可。
判斷數字是否重複的問題,位圖法是一種非常高效的方法。
如何在大量的資料中找出不重複的整數?
在 2.5 億個整數中找出不重複的整數。注意 記憶體不足以容納這 2.5 億個整數。方法一 分治法 與前面的題目方法類似,先將 2.5 億個數劃分到多個小檔案,用 hashset hashmap 找出每個小檔案中不重複的整數,再合併每個子結果,即為最終結果。方法二 位圖法 位圖,就是用乙個或多個 b...
如何在大量的資料中找出不重複的整數
在 2.5 億個整數中找出不重複的整數。注意 記憶體不足以容納這 2.5 億個整數。由於這道題目與前面的題目類似,也是無法一次性把所有資料載入到記憶體中,因此也可以採用類似的方法求解。方法一 分治法 採用 hash 函式的方法,把這 2.5 億個整數劃分到更小的檔案中,從而保證每個檔案的大小不超過可...
php 找出資料中的不重複值
直接 展示 找出陣列中的不重複值 param array arr 一維陣列 param boolean falg 是否嚴格驗證 return array 返回不重複的值 function find arr unrepeat arr,falg false return data 找出特定值在陣列中的出...