一、一次测试过程:
测试方法:将2片芯片(A和B)置于测试台上,互相进行测试,测试报告是“好”或“坏”,只取其一。 就是这份报告是针对对方而言的,也就是说A芯片说B芯片是好的,B芯片说A是坏的
假设:好芯片的报告一定是正确的,坏芯片的报告是不确定的(可能会出错)
如果A芯片本来就是好的,那么它说的话就是可靠可信的,而且它一定说真话,如果它说B芯片是好的,那B芯片就一定是好的,因为A不会说假话的;如果B芯片说A是坏的,那么它的话是不可靠的
二、测试结果分析
A报告 | B报告 | 结论 |
---|
B是好的 | A是好的 | A,B都好或A,B都坏 | B是好的 | A是坏的 | 至少一片是坏的 | B是坏的 | A是好的 | 至少一片是坏的 | B是坏的 | A是坏的 | 至少一片是坏的 |
三、芯片测试问题
1、输入:
n片芯片,其中好芯片至少比坏芯片多1片
2、问题:
设计一种测试方法,通过测试从n片芯片中挑出1片好芯片
3、要求:
使用最少的测试次数
判定芯片A的好坏 问题:给定芯片A,判定A的好坏 方法:用其他n-1片芯片对A测试
1、n是奇数:好芯片数≥(n+1)/2 A好,至少有(n-1)/2个报“好” A坏,至少有(n+1)/2个报“坏”
结论: 至少一半报“好”,A是好芯片 超过一半报“坏”,A是坏芯片
n=7:好芯片≥4 A好,6个报告中至少3个报“好” A坏,6个报告中至少4个报“坏”
2、n是偶数:好芯片数≥n/2+1 A好,至少有n-/2个报“好” A坏,至少有n/2个报“坏” 结论: 至少一半报“好”,A是好芯片 超过一半报“坏”,A是坏芯片
n=8:好芯片数≥5 A好,7个报告中至少4个报“好” A坏,7个报告中至少5个报“坏”
四、蛮力算法
测试方法:任取1片测试,如果是好芯片,测试结束;如果是坏芯片,抛弃,再从剩下芯片中任取1片测试,直到得到1片好芯片
时间估计: 第1片坏芯片,最多测试n-2次 第2片坏芯片,最多测试n-3次 …… 总计O(n2)
五、分治算法
1、分治算法设计思想
(1)、假设n为偶数,将n片芯片两两一组做测试淘汰,剩下芯片构成子问题,进入下一轮分组淘汰
(2)、淘汰规则:
“好,好”→任留1片,进入下轮 其他情况→全部抛弃
(3)、递归截止条件:n≤3
3片芯片,1次测试可得到好芯片 1或2片芯片,不在需要测试
2、分支算法的正确性
命题1 当n时偶数时,在上述淘汰规则下,经过一轮淘汰,剩下的好芯片比坏芯片至少多1片
证 设A,B都好的芯片i组,A与B一好一坏j组,A与B都坏的k组。淘汰后好芯片至少i片,坏芯片至多k片。
2i+2j+2k=n 初始芯片总数 2i+j>2k+j 初始 好芯片多于坏芯片 →i >k
代码描述:
k<-n
while k>3 do
将芯片分成└k/2┘组
for i=1 to └k/2┘ do
if 2片好 then 则任取1片留下
else 2片同时丢掉
k←剩下的芯片数
if k=3 then
任取2片芯片测试
if 1好1坏 then 取没测的芯片
else 任取1片被测芯片
if k=2 or 1 then 任取1片
|