算法導論:第4章

4-2找出所缺的整數html

1. 遍歷整數0到n的第一位,分紅兩個數組:P1[1] 和P0[1],分別表明第一位是一、0的數,並記錄第一位是1的個數CountN,代價爲O(n)。數組

2. 遍歷數組A[0...n]的第一位, 分紅兩個組:Q1[1]和Q0[1],分別表明第一位是一、0的數,並記錄1的個數CountA,代價爲O(n)。測試

3. 比較CountN和CountA的值,結果可能有兩種狀況CountN = CountA,或者CountN = CountA + 1, 前者代表所缺數的第一位爲0, 後者爲1,代價爲O(1)。spa

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]。.net

5, 不斷重複Ceiling(lg(n))次.htm

有T(n) = T(n/2) + O(2n),得T(n) = O(4n)blog

 

4-6 VLSI芯片測試原理

a)    在全部的策略中,時間複雜度最高但最有效的方法是:對每一個芯片,讓其它全部芯片對它進行報告,因爲好芯片數目小於n/2,對於任意芯片,壞芯片均可以讓判斷結果如出一轍(好比判斷結果好壞各佔一半),此時,就沒法判斷出好壞。得證。遍歷

b)分狀況考慮
(1)n爲偶數
    隨機的兩兩配對,則共有n/2對,分別測試。考慮其中一對的測試結果:若是一好一壞,或者兩壞,那麼把這對丟棄。這樣丟棄不難發現丟棄的好芯片數必定不大於丟棄的壞的芯片數;若是兩好(實際狀況是兩個都是真的好或者兩個都是真的壞),那麼隨意丟棄其中一個,留下一個。
    這樣操做後,留下的好的芯片數必定仍是大於壞的芯片數的。分析:由於n爲偶數,設好的芯片數爲a,壞的芯片數爲b, 則a-b>=2,由鴿巢原理,必然有一對好的相遇。再往下分析,若是有k對壞的相遇,那麼至少再有k對好的相遇,因此兩個好相遇的對數必定大於兩個壞的相遇的對數。
這樣原問題的規模下降一半。

(2)n爲奇數

    這個稍微複雜一點。仍是隨機兩兩分對,結果必然留下一個沒有配對的。一樣,結果爲一壞一好或者兩壞的,直接把這對扔掉,不影響後續判斷,如今剩下的對都是兩好的,這樣對數設爲m(若是m=0,則沒有配對的那個必然是好的,結束,因此如今假設m不爲0),真正兩個好的對數設爲a,真正兩個壞的對數設爲b,則a+b=m。
    i) 若是m爲奇數
            不可貴到a>b,咱們能夠把那個沒有配對的那個扔掉,而直接考慮從這m對中每對任選一個,剩    下的都丟棄。這樣須要考慮的有m個芯片,並且其中好的必定多於壞的。
    ii)若是m爲偶數
             咱們也從m對中,每對中任選一個,這樣有m個芯片,再加上剛纔沒有配對的那個,咱們考慮這    m+1個芯片便可。須要證實的是,這m+1個芯片中好的必定多於壞的:若是沒有配對的那個是好的,    能夠獲得a>=b,結論沒問題;若是沒有配對的那個是壞的,而且m是偶數,因此a>=b+2,咱們把這個    壞的就算留下也沒有關係,好的仍是多於壞的(必需要留下,由於咱們不知道沒有配對的那個是好的    仍是壞的,咱們只是證實把最後沒有配對的這個留下是沒有問題的)。
這樣咱們就證完了。

c) 按照b中的方法 T(n)<=T(n/2)+n/2 根據主定理推出T(n)=O(n)方法

原文:http://blog.csdn.net/a81895898/article/details/7025254以及http://www.cnblogs.com/longdouhzt/archive/2011/07/15/2107751.html

相關文章
相關標籤/搜索