演算法導論-4-2 找出所缺的整數

來源:互聯網
上載者:User

【轉】

  問題:  
某數組A[1..n]含有所有從0..n的所有整數,但其中有一個整數不在數組中,通過利用一個輔助數組B[0..n]來記錄A中出現的整數,很容易在
O(n)時間內找出所缺的整數。但在這個問題中,我們卻不能由一個單一操作來訪問A中的一個完整整數,因為A中元素是以二進位表示的。我們所能用的唯一操
作就是“取A[i]的第j位”這個操作所花時間為常數。      

證明:如果訪問數組A中資訊的唯一方式是這種單一位操作,仍能在O(n)時間內找出所缺的整數。A之外的任一完整整數仍然可以由一個單一操作來訪問。【算
法導論 中文版  P50  4-2】
       昨天晚上看演算法導論看到了這一題,沒有想多久,沒想通。當時想的是把A中的每一個資訊都逐個擷取,但是複雜度是O(lgn),今天在網上看別人的部落格,學會了這個方法。利用了二進位的特點。(後面的東西是修改了Jianxing的blog裡的。地址http://gonewiththedream.spaces.live.com/blog/cns!4327B97AC534D77E!235.entry)

基本方法就是用二分法:1, 遍曆整數0到n的第一位,分成兩個數組:P1[1] 和P0[1],分別代表第一位是1,0的數,並記錄第一位是1的個數CountN,代價為O(n)
2, 遍曆數組A[1...n]的第一位, 分成兩個組:Q1[1]和Q0[1],分別代表第一位是1,0的數,並記錄1的個數CountA,代價為O(n)
3, 比較CountN和CountA的值,結果可能有兩種情況CountN = CountA,或者CountN = CountA + 1, 前者表明所缺數的第一位為0, 後者為1,代價為O(1)
4,
通過3的結果,隨後我們可以在P1[1]和Q1[1](CountN>CountA,即缺少第一位為1的數)  或者
P0[1]和Q0[1](CountN=CountA,即缺少第一位為0的數)中的第2位中重複步驟1,2中的操作,記錄數組P1[2]、P0[2]和
CountN'及Q1[2]、Q0[2]和CountA'。代價為O(n/2)和O(n/2),
經過比較後可得到所缺數第二位是0還是1,決定接下來比較P1[2]和Q1[2]  或者 P0[2]和Q0[2],代價O(1)
5, 不斷重複Ceiling(lg(n))次,最後即可找到所缺數總代價為2* (O(n) + O(n/2) + ... +O(n/pow(2, k))) + ... + O(1)) = 2* O(2n) = 4*O(n) = O(n)

當然這裡忽略了一個問題,如果A中缺了一個,這應該是n-1個數,則多出來的那個數是什麼呢,如果和其他數有重複,上面的方法就無效了,情況變得相當複雜。因此上面的只適用於多出的一個數為0,或者乾脆就只有n-1個數。

【另】

比較弱的方法:1到n所有數字加起來的和 減去 A[1]到A[n]的和

比較犀利的方法:湊m,m=4k-1,並且是4k-1>=n的最大整數(比如n=7,則m=7;n=16,則m=19;n=21,m=23以此類推)
那麼只需要A[1]^A[2]^……^A[n-1]^A[n]^{A[m-2]^A[m-1]^A[m]},即可

原因:從4的整數倍開始,連續4個數字異或,結果為(例如4^5^6^7的結果是0;204^205^206 = 207;8^10^11=9)
所以0^1^2^……^m的結果為0,卻哪個數字,則A[1]^A[2]^……^A[n-1]^A[n]^{A[m-2]^A[m-1]^A[m]}的結果就是所缺的數字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.