分治法:芯片测试

芯片测试

问题描述

Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的

6a (1)_6

教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏。一个好的芯片总是能够报告另一片的好坏,但一个坏的芯片的结果是不可靠的。这样,每次测试的四种可能结果如下:

A报告 B报告 结论
B是好的 A是好的 AB都好或者AB都坏
B是好的 A是坏的 至少一片是坏的
B是坏的 A是好的 至少一片是坏的
B是坏的 A是坏的 至少一片是坏的

暴力方法

取一块芯片,一一与其他所有芯片互相检测,假如至少有一半次数报告都是好的,则该芯片是好的。时间复杂度为 O ( n 2 ) O(n^2) O(n2)

分治法

伪代码

  1. k ← n
  2. while k > 3 do
  3. ​ 将芯片分为k/2(下取整)组
  4. ​ 对每一组
  5. ​ if 两片好,任取一片留下
  6. ​ else 两片同时丢掉
  7. ​ k ← 剩下的芯片数
  8. if k == 3
  9. then 任取2片测试
  10. ​ if 至少1坏,取没测的芯片
  11. ​ else 任取1片被测芯片
  12. 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主页上的原文链接

你可能感兴趣的:(算法)