算法导论 4-6

Table of Contents

1 题目

VLSI测试

Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上他们是可以互相测试的。教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏。一个好的芯片总能够报告另一片的好坏,但一个坏的芯片的结果是不可靠的。这样,每次测试的四种可能结果如下:

A芯片报告B芯片报告结论
B是好的A是好的都是好的,或都是坏的
B是好的A是坏的至少一片是坏的
B是坏的A是好的至少一片是坏的
B是坏的A是坏的至少一片是坏的
  1. 证明若多于n/2的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯 片是好的。假设坏的芯片可以联合起来欺骗教授。
  2. 假设有多于n/2的芯片是好的,可虑从n片中找出一片好芯片的问题。证明⌊ n/2 ⌋对测试就足以使问题的规模降至近原来的一半。
  3. 假设多于n/2的芯片是好的,证明好的芯片可用Θ(n)对测试找出。给出并解答表达 测试次数的递归式。

2 分析与解答

  1. 坏芯片可以任意输出被测试芯片的好坏结果,当坏芯片多余n/2且有“智能”时,所有芯 片的检测结果可以是一样的。当坏芯片数大于n/2的话,那么把芯片分成三个集合:
    • k个好芯片,定义为集合G
    • k个坏芯片,定义为集合H
    • j个坏芯片,定义为集合I

    其中n=2k+j,将坏芯片可以联合起来欺骗教授定义为,坏芯片清楚自己所在的集合,清楚自 己所在的测试装置的位置,和与自己放在一起的芯片所在的集合。如此,将测试结果为“芯 片是好的”定义为1,坏的定义为0,每个芯片的测试结果是如下结果中的一种:

     B芯片取自GB芯片取自HB芯片取自I
    A芯片取自Gk-1个(1, 1)k个(x, 0)j个(x, 0)
    A芯片取自Hk个(0, x)k-1个(x, x)j个(x, x)
    A芯片取自Ik个(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)。

  2. 当好芯片多于n/2时,先证明题中的方法能够测得芯片的好坏,用同样方法分析,将集合 I定义成好芯片,得到的测试结果为:
     B芯片取自GB芯片取自HB芯片取自I
    A芯片取自Gk-1个(1, 1)k个(x, 0)j个(1, 1)
    A芯片取自Hk个(0, x)k-1个(x, x)j个(0, x)
    A芯片取自Ik个(1, 1)k个(x, 0)j个(1, 1)
    可见,此时,当测试结果中有大于等于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中的芯片都是好芯片,最终可以利用好芯片测试出其他 芯片的好坏。 这里有两个细节:
    1. 考虑芯片为偶数的极端情况,上述某次递归处理的集合中,如果芯片数是奇数,那么在下一次递归开始时,可能会出现恰好有2k个好芯片和2k个坏芯片,测试 时恰好好芯片与坏芯片配对,坏芯片与坏芯片测试,那么最后结果为0,那么可以知道在奇数时这样得到的集合V规模与原规模相同,为了解决这种情况,我们对结果为(1, 1)的芯片对,只选取其中的一个留在V中,这样V中就有k+⌈ j /2⌉个好芯片和k 个坏芯片,V中的好芯片还是多余一半,那么重复使用同时1中的算法,可以得到正确 结果,并且满足题目对规模缩小的要求。
    2. 某次递归开始时,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中的好芯片也比坏芯片多。
      综上,就是如果某次递归开始时V中的芯片数是奇数,那么当递归后如果V中剩下奇数个芯片,则这奇数个芯片构成V继续递归;如果V中剩下的芯片个数为偶数个,那么就加上没有配对测试的那个芯片组成V进行递归
  3. 根据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)。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值