芯片测试的分析(蛮力+分治)
测试过程
测试结果分析
说明:
第一行:
假设 A 是好的,那么 B 是好的,则 A,B 都是好的。
假设 A 是坏的,那么 B 的报告结果不正确,那么 B 就也是坏的,则 A,B 都是坏的。
第二行:
假设 A 是好的,那么 B 的报告结果不正确,那么 B 就也是坏的,此时一好一坏。
假设 A 是坏的,B 的结果显示 A 是坏的,但是不确定 B 是否坏,有可能坏,有可能好,也就是一好一坏或者两个都坏。
综上所述:至少一片是坏的。
第三行分析过程同第二行。
第四行:
假设 A 是好的,那么 B 一定是坏的,B 的报告结果就无分析意义,此时一好一坏。
假设 A 是坏的,那么 B 不确定好坏。
综上所述:至少一片是坏的。
问题描述
分析
说明:
n = 7时,
(注意:好芯片至少有4个)
假设 A 是好的,那么剩余的 6 个芯片中好芯片至少有 3 个,也就是 6 个报告至少 3 个报 “好”。
假设 A 是坏的,那么剩余的 6 个芯片中好芯片至少有 4 个,也就是 6 个报告至少 4 个报 “坏”。
说明:
n = 8时,
(注意:好芯片至少有5个)
假设 A 是好的,那么剩余的 7 个芯片中好芯片至少有 4 个,也就是 7 个报告至少 4 个报 “好”。
假设 A 是坏的,那么剩余的 7 个芯片中好芯片至少有 5 个,也就是 7 个报告至少 5 个报 “坏”。
蛮力算法
分治算法
说明:
1.淘汰规则分析:
由上面测试结果分析,除了 “好,好 ”的情况是好坏占概率二分之一,其他情况都是坏的概率比较大,所以当一组两个芯片显示 “好,好”,就选择留一个芯片,扔一个芯片。其他情况将两个芯片都扔掉。
2.递归截止条件分析:
当 n <= 3 时,到递归结束的条件,
3 片芯片,1 次测试就可以得到好芯片:
在下面可证明分治算法是正确的,也就满足子问题的性质和原问题的性质相同,即子问题中好芯片至少比坏芯片多一个。
3个芯片,那么至少有两个好芯片。
假设测试一次显示结果为 “好,好”,那么两个都是好的,可以任取一片,结束。
假设测试一次显示结果为其他,那么扔掉这两个,选择剩余那一个,剩余那一个肯定是好的,结束。
1 或 2 个芯片,那么不需要测试,因为好芯片至少比坏芯片多一个,那么这 1 个或者 2 个芯片都是好的,直接选择就可以了。
证明分治算法的正确性
说明:
证明过程依照淘汰规则:都好的留 1 扔 1,其他情况都扔掉。
分治前情况:
2i + 2j +2k = n;
好芯片:2i + j;
坏芯片:2k+ j;
所以:2i + j > 2k+ j;
一次分治后的情况:
留下:i+k;(只有都好都坏才会显示都好,才会背留下来)
好芯片:i ;
坏芯片:k ;
所以:i > k;
即证明完毕。
说明:
当 n 为奇数时,不能直接按照淘汰原则淘汰,这样会使得子问题与原问题性质不一样。
特殊处理就是在淘汰之前加一组蛮力的测试,测试结果为好,则直接结束;
测试结果为坏,则扔掉,数量就变为了偶数,就可以按照分治算法来做。