1 题目
VLSI测试
Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上他们是可以互相测试的。教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏。一个好的芯片总能够报告另一片的好坏,但一个坏的芯片的结果是不可靠的。这样,每次测试的四种可能结果如下:
A芯片报告 | B芯片报告 | 结论 |
---|---|---|
B是好的 | A是好的 | 都是好的,或都是坏的 |
B是好的 | A是坏的 | 至少一片是坏的 |
B是坏的 | A是好的 | 至少一片是坏的 |
B是坏的 | A是坏的 | 至少一片是坏的 |
- 证明若多于n/2的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯 片是好的。假设坏的芯片可以联合起来欺骗教授。
- 假设有多于n/2的芯片是好的,可虑从n片中找出一片好芯片的问题。证明⌊ n/2 ⌋对测试就足以使问题的规模降至近原来的一半。
- 假设多于n/2的芯片是好的,证明好的芯片可用Θ(n)对测试找出。给出并解答表达 测试次数的递归式。
2 分析与解答
- 坏芯片可以任意输出被测试芯片的好坏结果,当坏芯片多余n/2且有“智能”时,所有芯 片的检测结果可以是一样的。当坏芯片数大于n/2的话,那么把芯片分成三个集合:
- k个好芯片,定义为集合G
- k个坏芯片,定义为集合H
- j个坏芯片,定义为集合I
其中n=2k+j,将坏芯片可以联合起来欺骗教授定义为,坏芯片清楚自己所在的集合,清楚自 己所在的测试装置的位置,和与自己放在一起的芯片所在的集合。如此,将测试结果为“芯 片是好的”定义为1,坏的定义为0,每个芯片的测试结果是如下结果中的一种:
这样只要坏芯片采用如此策略就能使所有芯片的检查结果都相同:B芯片取自G B芯片取自H B芯片取自I A芯片取自G k-1个(1, 1) k个(x, 0) j个(x, 0) A芯片取自H k个(0, x) k-1个(x, x) j个(x, x) A芯片取自I k个(0, x) k个(x, x) j-1个(x, x) - 对取自集合H的芯片
- 在对好芯片测试时,将好芯片污蔑成坏芯片;
- 在与H集合的芯片进行测试时,认为H集合的芯片都是好芯片(包括自身);
- 在与I集合的芯片进行测试时,在A位时,认为I集合的芯片是坏芯片,在B位时,提 前选择某一芯片认为自己是I集合的成员,并且认为I是好芯片。
- 对取自集合I的芯片
- 在B位时,都认为A都是好芯片
- 在A位时,将好芯片污蔑成坏芯片,认为H中芯片是好芯片,认为I中其他芯片是坏芯 片。
采用这种策略时,所有芯片的检测结果都是k-1个(1, 1),k个(0, 0),j个(1, 0)。
- 当好芯片多于n/2时,先证明题中的方法能够测得芯片的好坏,用同样方法分析,将集合 I定义成好芯片,得到的测试结果为:
可见,此时,当测试结果中有大于等于k-1个(1, 1)时,就可以认为芯片是好的,如果得 到的芯片是好,那么用这个芯片就可以将剩余的芯片的好坏测出(只有测试结果为(1, 1)的芯片是好芯片);如果得到的芯片是坏的,那么将此芯片去掉,此时好芯片的数目 仍然大于n /2,重复使用此方法就可最后测试出芯片好坏,但是这种方法的最坏情况 下是每n-1次使规模降低到n-1次。要想达到题目要求的效果需要其他算法,要求每次测 试的数目为n/2,自然想到配对测试分组,比较次数就满足了题目要求。算法描述如下:将测试芯片的集合称为V,观察测试结果表,当测试结果出现0时,两个芯片中至少有一 个是坏的,那么就可以把测试结果出现0的测试芯片从V中去掉归到集合U, 显然U中的坏的芯片数量大于等于U中元素数的一半;剩下的芯片留在集合V中,,显然集合V中好的芯片的数量大于V中元素数的一半;重复此过程,直至V中只 剩一个元素或两个元素,那么V中的芯片都是好芯片,最终可以利用好芯片测试出其他 芯片的好坏。 这里有两个细节:B芯片取自G B芯片取自H B芯片取自I A芯片取自G k-1个(1, 1) k个(x, 0) j个(1, 1) A芯片取自H k个(0, x) k-1个(x, x) j个(0, x) A芯片取自I k个(1, 1) k个(x, 0) j个(1, 1) - 考虑芯片为偶数的极端情况,上述某次递归处理的集合中,如果芯片数是奇数,那么在下一次递归开始时,可能会出现恰好有2k个好芯片和2k个坏芯片,测试 时恰好好芯片与坏芯片配对,坏芯片与坏芯片测试,那么最后结果为0,那么可以知道在奇数时这样得到的集合V规模与原规模相同,为了解决这种情况,我们对结果为(1, 1)的芯片对,只选取其中的一个留在V中,这样V中就有k+⌈ j /2⌉个好芯片和k 个坏芯片,V中的好芯片还是多余一半,那么重复使用同时1中的算法,可以得到正确 结果,并且满足题目对规模缩小的要求。
- 某次递归开始时,V中芯片数为奇数,按照上面的算法,两两配对测试后,会出现一个没有比较的芯片。对这个芯片需要决定是否放到V中,如果放在V中,不难想象,如果芯片是坏芯片,则V中好芯片和坏芯片可能各占一半;如果不放在V中,那么如果芯片是好的,则V中也可能出现好坏芯片各一半的情况。如何解决这个问题,考虑下次递归开始前的情况:
- 如果下次递归开始前,不论剩下的这个芯片是好是坏,,如果V中有奇数个芯片,则好芯片数目一定大于坏芯片数目,因为如果剩下的芯片是坏芯片,相当于将此芯片放在U中,自然好芯片数目大于总数一半,如果剩下的芯片是好芯片,那么当上次递归时V是奇数时递归后V还是V并且剩下的是好芯片的话,上次递归时V中必定有k个坏芯片和k+2i+1(0<=i)个好芯片,再加j个好芯片和j个坏芯片,则一共有k+j个坏芯片和k+2i+1+j个好芯片,剩下一个1好芯片后并进行配对测试,就剩k/2个坏芯片和k/2+i个好芯片。所以如果下次递归开始前V中有奇数个芯片,则不将剩下芯片放在V中
- 如果下次递归开始前,不算剩下的这个芯片,如果V中有偶数个芯片。也分两种情况,当剩下芯片是好芯片时,最坏的情况就是好芯片和坏芯片各占一半。当剩下的芯片是坏芯片时,那么不算这个坏芯片,上次递归开始时V中好芯片至少比坏芯片多2个,所以递归后好芯片数肯定多与坏芯片,又因为根据上面的假设,递归后V中有偶数个芯片,所以好芯片比坏芯片至少多两个,加上这个坏芯片V中的好芯片也比坏芯片多。
- 根据2中分析,T(n)=T(⌈ n/2 ⌉)+D(n)+C(n),显然D(n)=Θ(⌊ n/2 ⌋),C(n)是常数 为Θ(1)。所以T(n)=T(⌈ n/2 ⌉)+Θ(⌊ n/2 ⌋)+Θ(1) = T(⌈ n/2 ⌉)+Θ(⌊ n/2 ⌋),忽略上下界,利用主定理,得 T(n)=Θ(f(n))=Θ(n)。