亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

找到一個不是40億個給定值的整數

找到一個不是40億個給定值的整數

躍然一笑 2019-09-06 16:48:48
這是一個面試問題:給定一個包含40億個整數的輸入文件,提供一個算法來生成一個未包含在文件中的整數。假設您有1 GB內存。如果您只有10 MB內存,請跟進您的操作。我的分析:文件大小為4×10 9 ×4字節= 16 GB。我們可以進行外部排序,因此我們可以了解整數的范圍。我的問題是在排序的大整數集中檢測缺失整數的最佳方法是什么?我的理解(閱讀完所有答案后):假設我們正在討論32位整數。有2 ^ 32 = 4 * 10 9個不同的整數。情況1:我們有1 GB = 1 * 10 9 * 8位= 80億位內存。解決方案:如果我們使用一個代表一個不同整數的位,那就足夠了。我們不需要排序。執行:int radix = 8;byte[] bitfield = new byte[0xffffffff/radix];void F() throws FileNotFoundException{    Scanner in = new Scanner(new FileReader("a.txt"));    while(in.hasNextInt()){        int n = in.nextInt();        bitfield[n/radix] |= (1 << (n%radix));    }    for(int i = 0; i< bitfield.lenght; i++){        for(int j =0; j<radix; j++){            if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);        }    }}情況2:10 MB內存= 10 * 10 6 * 8位= 8000萬位解決方案:對于所有可能的16位前綴,有2 ^ 16個整數= 65536,我們需要2 ^ 16 * 4 * 8 = 2百萬位。我們需要構建65536個桶。對于每個桶,我們需要4個字節來保存所有可能性,因為最壞的情況是所有40億個整數屬于同一個桶。通過第一次通過文件構建每個桶的計數器。掃描存儲桶,找到第一個命中率低于65536的存儲桶。構建新的存儲桶,我們在第二步中通過文件的第二次傳遞找到了高16位前綴掃描步驟3中構建的存儲桶,找到第一個沒有命中的存儲桶。代碼與上面的代碼非常相似。結論:我們通過增加文件傳遞來減少內存。對那些遲到的人的澄清:問題,并不是說文件中沒有包含一個完整的整數 - 至少不是大多數人解釋它的方式。但是,評論主題中的許多評論都是關于任務的變化。不幸的是,將其引入評論主題的評論后來被其作者刪除了,所以現在看起來孤立的回復只是誤解了一切。這很令人困惑。抱歉。
查看完整描述

3 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

假設“整數”表示32位:具有10 MB的空間足以讓您計算輸入文件中具有任何給定的16位前綴的數量,對于所有可能的16位前綴,一次通過輸入文件。至少有一個桶的擊中次數不會超過2 ^ 16次。執行第二遍以查找已使用該存儲桶中的哪些可能數字。

如果它意味著超過32位,但仍然是有限大小:如上所述,忽略恰好落在(有符號或無符號;您選擇的)32位范圍之外的所有輸入數字。

如果“整數”表示數學整數:讀取輸入一次并跟蹤您所見過的最長數字的最大數字長度。完成后,輸出最大加一個隨機數,該數字還有一個數字。(文件中的一個數字可能是一個超過10 MB的bignum來準確表示,但如果輸入是一個文件,那么你至少可以表示適合它的任何東西的長度)。


查看完整回答
反對 回復 2019-09-06
  • 3 回答
  • 0 關注
  • 765 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號