首页 > 代码库 > 算法导论习题4-5:芯片检测

算法导论习题4-5:芯片检测

习题4-5 3rd edition (4-6 2nd edition)

 

解法1:

将芯片两两配对,对于后三种情况(至少其中一个是坏的),可以直接将该对芯片丢弃,这样丢弃的好的一定不会超过坏的。

剩下的都是第一种情况,以及可能剩下的单个未配对的。

如果数量为偶数,即没有未配对的,那么“好好”对数一定超过“坏坏”对数,所以每对里面丢弃一个即可。

如果数量为奇数,则保留那个未配对的,并且每对丢掉一个。

 

解法2:

优点是只需单向检测即可。其实解法1稍作修改也可只用到单向检测。

本方法是基于如下事实:用所有芯片去检测某一个固定芯片,如果报告好的次数 >= 坏的次数,则被测芯片是好的。

方法如下:分别用第2,3,4...个芯片去检测第一个,一旦坏的次数 > 好的次数,则将所有用过的芯片丢弃。

分两种情况讨论:(1)被测芯片是好的 (2)被测芯片是坏的。这两种情况都可以保证丢弃的好芯片一定不多于坏芯片。

def findGood(a):
    good, bad = 0, 0
    for i in range(1,len(a)):
        if a[i].test(a[0]) = "good":
            good += 1
        else:
            bad += 1
        if bad == good + 1:
            return find(a[i+1:])
    return a[0]

 

另外对于第一问的回答参考这里:

http://www.cnblogs.com/longdouhzt/archive/2011/07/15/2107751.html