4-6 VLSI芯片测试
Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的。教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏。一个好的芯片总是能够报告另一片的好坏,但一个坏的芯片的结果是不可靠的。这样,每次测试的四种可能结果如下:
A芯片报告 B芯片报告 结论
B是好的 A是好的 都是好的,或都是坏的
B是好的 A是坏的 至少一片是坏的
B是坏的 A是好的 至少一片是坏的
B是坏的 A是坏的 至少一片是坏的
a)证明若多于n/2的芯片是坏的,在这种成对测试方法下,使用任何策略都不能确定哪个芯片是好的。假设坏的芯片可以联合起来欺骗教授。
b)假设有多于n/2的芯片是好的,考虑从n片中找出一片好芯片的问题。证明[n/2]对(下界)测试就足以使问题的规模降至近原来的一半。
c)假设多于n/2片芯片是好的,证明好的芯片可用Θ(n)对测试找出。给出并解答表达式测试次数的递归式。
算法分析:
(a) 可以采用时间复杂性最高但最准确的方法进行穷举:对每一个芯片,都让其他所有芯片和其配对检测,由于坏芯片的数量大于n/2,所以没有办法从检测结果判断芯片的好坏,所以~。
(b) 根据问题叙述的四种情况,可以想到用分治法来二分的解决问题,首先说下思路:
总:通过每次的划分子问题,并且保持满足好芯片多于坏芯片这一条件的循环不变式,我们就可以通过不断减小问题规模最终得到好芯片。
(1) 首先将原来的n个芯片随机的两两配对,这样就得到了[n/2](下界)个检测对,可以假设,在n中有x个好芯片,y个坏芯片,检测对中有g对检测结果两个都为好的检测对,其中有a对为两个都为好芯片,b对两个都为坏芯片:
(2) 根据n的奇偶性不同分别进行分析:
1. 如果n为偶数,在剩下的([n/2] - g)对中坏芯片的数量大于等于好芯片,又x > y(这说明x - y >= 2),则在g对中a > b;
2. 如果n为奇数,就有一个芯片剩下没有配对,那么在x - y = 1的情况下,根据剩下那个芯片的好坏不同就有可能出现不同的情况:
如果g为奇数,即使g对以外的检测中坏芯片好芯片各占一半的,也能保证在g对中a - b >= 2,这样舍弃剩下未检测的芯片也能使新取出来的检 测序列中好芯片多于坏芯片;
如果g为偶数:
如果这个剩下的芯片是好的话,就有a >= b,留下这个芯片没有问题;
如果这个芯片是坏的话,就有a - b >= 2(因为g为偶数,要大只能大2个),留下这个坏芯片也没有问题。
(3) 这样在就得到一个规模为[n/2]的新检测序列,并且这个新序列也满足好芯片多于怀芯片的条件,这时就可以重复1, 2步进行递归或迭代,直到规模为1是,一定可以得到好芯片。
(c) 根据(b)的叙述,显然可以得到:T(n) = T(n/2) + n/2。