zoukankan      html  css  js  c++  java
  • 算法导论:第4章

    4-2找出所缺的整数

    1. 遍历整数0到n的第一位,分成两个数组:P1[1] 和P0[1],分别代表第一位是1、0的数,并记录第一位是1的个数CountN,代价为O(n)。

    2. 遍历数组A[0...n]的第一位, 分成两个组:Q1[1]和Q0[1],分别代表第一位是1、0的数,并记录1的个数CountA,代价为O(n)。

    3. 比较CountN和CountA的值,结果可能有两种情况CountN = CountA,或者CountN = CountA + 1, 前者表明所缺数的第一位为0, 后者为1,代价为O(1)。

    4. 通过3的结果,随后我们可以在P1[1]和Q1[1](CountN>CountA,即缺少第一位为1的数) 或者 P0[1]和Q0[1](CountN=CountA,即缺少第一位为0的数)中的第2位中重复步骤1,2中的操作,记录数组P1[2]、P0[2]和 CountN'及Q1[2]、Q0[2]和CountA'。代价为O(n/2)和O(n/2), 经过比较后可得到所缺数第二位是0还是1,决定接下来比较P1[2]和Q1[2] 或者 P0[2]和Q0[2]。

    5, 不断重复Ceiling(lg(n))次.

    有T(n) = T(n/2) + O(2n),得T(n) = O(4n)

    4-6 VLSI芯片测试

    a)    在所有的策略中,时间复杂度最高但最有效的方法是:对每个芯片,让其它所有芯片对它进行报告,由于好芯片数目小于n/2,对于任意芯片,坏芯片都可以让判断结果一模一样(比如判断结果好坏各占一半),此时,就无法判断出好坏。得证。

    b)分情况考虑
    (1)n为偶数
        随机的两两配对,则共有n/2对,分别测试。考虑其中一对的测试结果:如果一好一坏,或者两坏,那么把这对丢弃。这样丢弃不难发现丢弃的好芯片数一定不大于丢弃的坏的芯片数;如果两好(实际情况是两个都是真的好或者两个都是真的坏),那么随意丢弃其中一个,留下一个。
        这样操作后,留下的好的芯片数一定还是大于坏的芯片数的。分析:因为n为偶数,设好的芯片数为a,坏的芯片数为b, 则a-b>=2,由鸽巢原理,必然有一对好的相遇。再往下分析,如果有k对坏的相遇,那么至少再有k对好的相遇,所以两个好相遇的对数一定大于两个坏的相遇的对数。
    这样原问题的规模降低一半。

    (2)n为奇数

        这个稍微复杂一点。还是随机两两分对,结果必然留下一个没有配对的。同样,结果为一坏一好或者两坏的,直接把这对扔掉,不影响后续判断,现在剩下的对都是两好的,这样对数设为m(如果m=0,则没有配对的那个必然是好的,结束,所以现在假设m不为0),真正两个好的对数设为a,真正两个坏的对数设为b,则a+b=m。
        i) 如果m为奇数
                不难得到a>b,我们可以把那个没有配对的那个扔掉,而直接考虑从这m对中每对任选一个,剩    下的都丢弃。这样需要考虑的有m个芯片,而且其中好的一定多于坏的。
        ii)如果m为偶数
                 我们也从m对中,每对中任选一个,这样有m个芯片,再加上刚才没有配对的那个,我们考虑这    m+1个芯片即可。需要证明的是,这m+1个芯片中好的一定多于坏的:如果没有配对的那个是好的,    可以得到a>=b,结论没问题;如果没有配对的那个是坏的,并且m是偶数,所以a>=b+2,我们把这个    坏的就算留下也没有关系,好的还是多于坏的(必须要留下,因为我们不知道没有配对的那个是好的    还是坏的,我们只是证明把最后没有配对的这个留下是没有问题的)。
    这样我们就证完了。

    c) 按照b中的方法 T(n)<=T(n/2)+n/2 根据主定理推出T(n)=O(n)

    原文:http://blog.csdn.net/a81895898/article/details/7025254以及http://www.cnblogs.com/longdouhzt/archive/2011/07/15/2107751.html

  • 相关阅读:
    Auty 2017——WebMonitor接口线上检测平台
    Auty 2017——WebMonitor接口本地检测平台
    Python+webdriver爬取博客园“我的闪存”并保存到本地
    Python爬网获取全国各地律师电话号
    Python Locust对指定网站“一键压测”
    12306提前查北京到长春的春运火车票
    PowerShell添加或修改注册表开机启动项脚本
    网易测试分享会——“一起打造你想要的QA团队”
    【分布式】2、分布式资料收集
    【Java并发编程】13、forkjoin
  • 原文地址:https://www.cnblogs.com/rolling-stone/p/3633970.html
Copyright © 2011-2022 走看看