芯片测试
问题描述
Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的
教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏。一个好的芯片总是能够报告另一片的好坏,但一个坏的芯片的结果是不可靠的。这样,每次测试的四种可能结果如下:
A报告 | B报告 | 结论 |
---|---|---|
B是好的 | A是好的 | AB都好或者AB都坏 |
B是好的 | A是坏的 | 至少一片是坏的 |
B是坏的 | A是好的 | 至少一片是坏的 |
B是坏的 | A是坏的 | 至少一片是坏的 |
暴力方法
取一块芯片,一一与其他所有芯片互相检测,假如至少有一半次数报告都是好的,则该芯片是好的。时间复杂度为 O ( n 2 ) O(n^2) O(n2)
分治法
伪代码
- k ← n
- while k > 3 do
- 将芯片分为k/2(下取整)组
- 对每一组
- if 两片好,任取一片留下
- else 两片同时丢掉
- k ← 剩下的芯片数
- if k == 3
- then 任取2片测试
- if 至少1坏,取没测的芯片
- else 任取1片被测芯片
- if k = 2 or 1 then 任取1片
说明
上述算法只是一个概要说明,对于 n为奇数的情况需要进一步处理 , 处理时间为 O(n).(剩下的那片用挑出的芯片检测)
复杂度
T ( n ) = T ( n / 2 ) + O ( n ) , W ( 1 ) = 0 T(n) = T(n/2)+O(n),W(1)=0 T(n)=T(n/2)+O(n),W(1)=0
由主定理,
W
(
n
)
=
O
(
n
)
W(n) = O(n)
W(n)=O(n)
GitHub主页上的原文链接