1. 问题描述
- 输入:n片芯片,其中好芯片至少比坏芯片多1片
- 问题:设计一种测试方法,通过测试从n片芯片中挑出1片好芯片
- 要求:使用最少的测试次数
2. 解题思路
1. 判定芯片A的好坏
- 问题:给定芯片A,判定A的好坏
- 方法:用其余n-1片芯片对A测试
2. 蛮力算法
- 算法思想:任取1片测试,如果是好芯片,则测试结束;如果是坏芯片,则抛弃,再从剩下芯片中任取1片测试,直到得到1片好芯片
- 时间估计:O(
n
2
n^2
n2)
- 若第1片为坏芯片,则最多测试n-2次
- 若第2片为坏芯片,则最多测试n-3次;
- …
3. 分治算法
- 算法思想:假设n为偶数,将n片芯片两两一组做测试淘汰,剩下芯片构成子问题,进入下一轮分组淘汰
- 淘汰规则
- “好,好”——任留1片,进入下轮
- 其他情况——全部抛弃
- 递归出口:n
≤
\le
≤ 3
- 若为3片芯片(2好1坏),则1次测试可得到好芯片
- 若为1或2片芯片(必为好),不再需要测试
- 命题:当n是偶数时,在上述淘汰规则下,经过一轮淘汰,剩下的好芯片比坏芯片至少多1片
- 算法思想:若n为奇数时,按上述处理可能会出问题
- 解决办法:当n为奇数时,增加一轮对轮空芯片的单独测试。
- 若该芯片为好芯片,则算法结束
- 若该芯片为坏芯片,则淘汰该芯片
- 伪码描述
3. 时间复杂度分析
- 设输入规模为n,每轮淘汰后,芯片数至少减半,测试次数(含轮空处理):O(n)
- 时间复杂度: W(n) = W(n/2) + O(n) , W(3)=1, W(2)=W(1)=0, 可得,W(n)=O(n)
|