給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。
1、在檔案中至少存在這樣乙個數?
2、如果有足夠的記憶體,如何處理?
3、如果記憶體不足,僅可以用檔案來進行處理,如何處理?
答案:1、32位整數,包括-2146473648~~2146473647,約42億個整數,而檔案中只有40億個,必然有整數少了。
2、如果採用位數思想來存放,則32位整數最多需要占用43億個位。約512mb的記憶體空間。
3、記憶體不足,可以採用如下思想:
1、按最高位分為兩段,沒有出現的那個數,肯定在比較小的段裡面。
如果比較少的段最高位為1,那麼缺少的那個數的最高位也為1.
如果比較少的段最高位為0,那麼少的那個數的最高位也是0.
依次按以上方法去處理每個位。
測每個整數的每個bit是0還是1,讀取n=40億個整數,第1個bit為0或為1的放到不同的檔案中(每個至多為n/2億),少於n/2個數的那組 必定缺少某個數,接著探測第2個bit是0還是1,輸入至多n/2億,輸出至多n/4億,少於n/4個數的那組 必定缺少某個數,以此類推,總的執行時間和n成正比。通過對某組排序掃瞄可以得到缺失的數,這樣執行時間變為o(logn)。
q2:給定乙個包含4300000000個32位整數的順序檔案,請問如何找到乙個至少出現兩次的整數?
解答:二分查詢
。由於4.3g>32位的整數空間,根據鴿籠原理,肯定會有重複的整數
。搜尋範圍從所有的32位正整數開始(全部當成unsigned int,簡化問題),即[0, 2^32),中間值即為2^31。然後遍歷檔案,如果小於2^31的整數個數大於n/2=2^31,則調整搜尋範圍為[0, 2^31],反之亦然;然後再對整個檔案再遍歷一遍,直到得到最後的結果。t(n) = t(n/2) + n,總體的複雜度為o(logn)。
例子:陣列[4,2,5,1,3,6,3,7,0,7],假定從3位的整數空間內搜尋。第一次的範圍為[0,8),遍歷過後發現[0,4)範圍內的整數個數為5,於是調整為搜尋[0,4)範圍內的整數。第二次發現[2, 4)範圍內的證書為3,大於2,於是調整為[2, 4)。再經過第三次的遍歷,找出3為重複出現的整數。
二分查詢另類 程式設計珠璣第四章
這是 程式設計珠璣 第四章的問題 如果最初的二分查詢對你來說太簡單了 大家肯定都是這麼感覺的.那麼請你試一下其變型 在p中返回t在陣列x中第一次出現時的位置 即如果乙個陣列多次出現的話,原先的演算法所返回的是眾多位置的中的任意乙個 你的 應該對陣列元素進行對數次比較,可能要進行log2n此這樣的比較...
程式設計珠璣第2章 習題解答
a 給定乙個最多包含40億個隨機排列的32為整數的順序檔案,找出乙個不存在檔案中的32位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如何有幾個外部的 臨時 檔案可用,但是僅有幾百位元組的記憶體,又該如何解決問題?1.在檔案中至少缺失乙個這樣的數?為什麼呢?這...
關於程式設計珠璣第2章的整理
給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。1 在檔案中至少存在這樣乙個數?2 如果有足夠的記憶體,如何處理?3 如果記憶體不足,僅可以用檔案來進行處理,如何處理?答案 1 如果採用位圖思想來存放,則32位整數最多需要占用43億個位。約512mb的記憶體空...