《算法导论》之 Problem 4-6(VLSI芯片测试)
问题叙述:
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)对测试找出。给出并解答表达式测试次数的递归式。
注:VLSI——Very Large Scale Integrated.
算法分析:
a)若多于n/2的芯片是坏的,那么我们可以先讨论是否能找出一片芯片,且可以肯定这片芯片是好的。怎样证明这片芯片是好的呢?穷举所有情况:
不管该芯片是好的还是坏的,我们将它与所有其他芯片进行互相测试。由于坏芯片比好芯片多,故而,有超过一半的芯片可能说谎!不管该芯片是好是坏,都无法判定!
b)若多于n/2的芯片时好的,将某芯片A与所有其他芯片进行互相测试:
由于好芯片数多于坏芯片数,故而,有超过一半的芯片在说实话。即,若有一半以上说A是好的,则它必为好的;若有一半以上说A是坏的,则它必为坏的。可知,通过n对测试,可判定A是好是坏。但用这种方法去寻找一片好芯片的时间复杂度为O( n * n )!
通过一片芯片和其他所有芯片都比较一次的方法固然可以确定一个芯片的好坏,但是有很多冗余比较!
二分排除思想:
① 将所有芯片编号1,2,3,...,n;
② 1和2,3和4,...,2k-1和2k,...进行比较(若n为奇数,最后一片直接晋级);
③ 单次比较结果(如1和2比较),若都测试对方为好芯片,则晋级,否则都淘汰;
根据问题描述中给出的测试报告,可知:
好 —— 好 —— 都是好的,或都是坏的 —— 两芯片同好同坏
其他 —— 至少一片是坏的 —— 至少淘汰了一片坏的(保证淘汰后,剩下的芯片中好的多于坏的)
④ 重复②、③步骤,直到所有测试结果都为好;
⑤ 从④中剩下的芯片中,利用a)中方法找出一片好芯片。
该方法类似于快速排序,对初始数据比较依赖,可利用随机方法进行改进。找出一片好芯片(理想随机模型下)复杂度为O( 2 * n ),每轮测试可淘汰近一半芯片。
c) 测试次数递归式为:
F( n ) = F( n/2 ) + n/2;