算法导论第四章习题:找出所缺的整数,VLSI芯片测试

4.2 找出所缺的整数
问题:数组A[1..n]的每个元素均在0~n范围内且各不相同(显然,0~n中肯定有个数不在数组A[1..n]内)。数组A[1..n]中的元素只能按位访问(如:取A[i]的第j位),访问一位所花费的时间为常数。现在的任务是给出一个算法,在O(n)时间内找出0~n中不在A[1..n]中的数。

解决思路:
1.    针对A[1,…,n]里面的元素,如果第一位(从右到左)是0,则去掉第一位并放到偶数数组里面;如果第一位是1,则去掉第一位并放到奇数数组里面。
2.    考虑偶数数组里面的元素数量,如果数量少于(n+2)/2的下界,则说明少了个偶数,于是对偶数数组执行类似于步骤1的动作,只不过n变成(n+2)/2的下界。如果偶数数组数量等于(n+2)/2的下界,则说明少了个奇数,于是对奇数数组执行类似于步骤1的动作,只不过n变成(n+1)/2的下界,此时令Num+=1<<k,k为递归次数。
3.    当数组内没有元素时,说明已经找出了那个数字,即为Num。


 

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

a)证明若少于 n/2 的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯片是好的.
b)假设有多于 n/2 的芯片是好的,考虑从 n 片中找出一片好芯片的问题.证明 n/2 对测试就足以使问题的规模降至近原来的一半.
c)假设有多于 n/2 的芯片是好的,证明好的芯片可用 O(n) 对测试找出。

解题思路:
a)    在所有的策略中,时间复杂度最高但最有效的方法是:对每个芯片,让其它所有芯片对它进行报告,由于好芯片数目小于n/2,对于任意芯片,坏芯片都可以让判断结果一模一样(比如判断结果好坏各占一半),此时,就无法判断出好坏。得证。
b)    问题可以这么理解,证明:当多于n/2的芯片是好的时,可以通过【n/2的下界】次操作,得到一个包含至多n/2个芯片的集合,且该集合内好的芯片大于一半。这样,以后只需要在这个集合上执行类似的判断动作就好了。
对于n个芯片的集合,假设good代表好芯片的数目,则坏芯片有(n – good)个,将n个芯片两两组合,接下来分类讨论。
        1.    当n为偶数时,假设好芯片和坏芯片组成的对数为r,则(n - good) >= r。对每个对,如果结果是情况2、3、4,则不做任何操作,如果结果是情况1,则从中挑出一个放到一个集合中。所以,我们可以在好芯片对中取到(good – r)/2个芯片,从坏芯片对中取到m个芯片,m <= (n – good - r)/2。因为(good – r)/2 > (n – good - r)/2,所以新集合中好芯片的数目大于一半,另外总芯片数小于等于(n/2 - r)。
        2.    当n为奇数时,提取一个芯片,对剩下的芯片采取偶数的方法,只不过最后的集合情况是:(good - r)/2 >= (n – 1 – good - r)/2,芯片总数小于等于((n – 1)/2 - r)。
                1)    当总数是偶数时,要么好的芯片数和坏的芯片数一样,原先被提取的芯片是好的芯片,把好的芯片加入集合;要么好的芯片比坏芯片多偶数个,此时不论被提取的芯片是好是坏,把它加入集合也能保证好的芯片数大于坏的芯片数。
                2)    当总数是奇数时,好的芯片数必然大于坏的芯片数。
       得证。
c)    当每次的r为0时,所需要的递归次数最多,T(n) = T(n/2) + n/2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值