演算法導論 晶元檢測問題之個人看法

2021-06-21 07:03:46 字數 1671 閱讀 6191

寫在問題之前第一次是在演算法導論裡看到這個問題,當時毫無頭緒,只能在網上尋找思路。檢視了幾個技術部落格,給出了結論,但是在第二個問題的關鍵問題上沒有給出證明,可能大家都覺得這個顯而易見,但是我覺得很難理解。後來我更是花了兩個小時的時間去理解這個結論,現整理給那些同樣困惑的初學者(第乙個和第三個問題網上都有答案,也比較容易弄懂,在我這篇文章只講解第二個問題)

問題:diogenes 教授有n個被認為是完全相同的vlsi晶元,原則上它們是可以互相測試的.教授的測試裝置一次可測試二片,當該裝置中放有兩片晶元時,每一片就對另一片作 測試並報告其好壞.乙個好的晶元總能夠正確的報告另一片的好壞,但乙個壞的晶元的結果就是不可靠的.這樣,每次的測試的四種可能結果如下: 

a)證明若少於 n/2 的晶元是壞的,在這種成對測試方式下,使用任何策略都不能確定哪個晶元是好的.

b)假設有多於 n/2 的晶元是好的,考慮從 n 片中找出一片好晶元的問題.證明 n/2 對測試就足以使問題的規模降至近原來的一半.

c)假設有多於 n/2 的晶元是好的,證明好的晶元可用 o(n) 對測試找出。

解決方法:

b)

由於要將晶元分為兩部分很容易想到要分類討論:

1.當n為偶數時,將整個晶元分為n/2對,將檢查結果為全好的組合隨機挑乙個晶元留下,其他結果全部捨棄。

證明:設在這n個晶元中好的晶元個數為good,壞的個數為bad,其中配對的是一好一壞的對數為m,整個配對結果無非是(好,好),(好,壞),(壞,壞)這三種情況,而(壞,壞)有m對,因此(好,好)對數為1/2*(good-m),(壞,壞)對數為1/2*(bad-m)。顯然,無論good和bad怎麼取值,一定滿足在最後選取的晶元中好晶元個數多餘壞晶元。

2.當n為奇數時,先挑出乙個晶元,剩下的晶元為偶數,按照偶數的方法處理,設最後晶元的個數為r,若r為奇數則捨棄多餘的晶元,若r為偶數,則將多餘的晶元加入進來。(n為奇數,good和bad一定是一奇一偶,good-bad一定為奇數)

證明:在證明之前我們必須弄懂乙個問題,那就是在按照偶數方法處理最後晶元個數r的奇偶性只與1/2*(good-bad)有關,當這個值為偶數則r也為偶數,反之亦然。舉個例子,假設good=5,bad=4,拿走乙個好晶元,現在good=4,bad=4,最後的r的值可以是8,6,4,2,0,這個主要由於(好,壞)組合消耗的好的和壞的晶元個數是一樣,這樣的組合對於最後r的奇偶性是毫無貢獻。

當good-bad=1時,並且拿走的是壞晶元,1/2*(good-(bad-1))=1,r為奇數,捨棄多餘的壞晶元,最終也滿足壞晶元個數小於好晶元個數,此時得證此時滿足當r為奇數時捨棄多餘的晶元。

當good-bad=1時,並且拿走的是好晶元,1/2*(good-1-bad)=0,r為偶數,如果不把多餘的晶元加進去,壞晶元個數等於好晶元的,因此,此時要將這個晶元加進去,此時也滿足r為偶數要將多餘的晶元加進去。

當good-bad>=3時,不管拿走的是好晶元還是壞晶元都可以捨棄,既不管保留還是捨棄多餘的晶元剩下的晶元好的個數一定大於壞的個數,因此我們還是可以統一為當r為偶數的時候保留,奇數時捨棄。

綜上可證明結論。

第一次寫博文,可能有很多考慮不周的地方,希望大家不吝賜教,謝謝。

分治演算法 晶元檢測問題

有n片晶元,其中好晶元比壞晶元至少多1片,現需要通過測試從中找出1片好晶元。測試方法是 將2片晶元放到測試台上,2片晶元互相測試並報告測試結果 好 或者 壞 假設好晶元的報告是正確的,壞晶元的報告是不可靠的 即對於被測試的晶元顯示的報告可能是壞或者好 請設計乙個演算法,使用最少的測試次數來找出1片好...

演算法導論 動態規劃之「鋼管切割」問題

動態規劃,其實跟分治法有些相似,基本思想都是將複雜的問題分成數個簡單的子問題,然後再去解決。它們的區別在於,分治法關注的子問題不相互 重疊 而動態規劃關注的子問題,多是相互 重疊 的。比如在快速排序中,我們將資料分成兩部分,這兩部分再分別快速排序的遞迴思想,也就是將整個問題的排序劃分為子問題子陣列的...

51微控制器定時器設定問題之個人看法

教程 先貼 include typedef unsigned char u8 typedef unsigned int u16 sbit led p1 0 u8 timer void main void void timer0 service void interrupt 1 橙黃色的while迴圈...