上一篇文章学习了【算法设计与分析】14 分治算法的一般描述和分析方法

文章目录

  • 1. 芯片测试
    • 1.1 一次测试的过程
    • 1.2 如何测试一块芯片的好坏
    • 1.3 蛮力算法
    • 1.4 分治算法设计思想
      • 1.41 分治算法的正确性证明
      • 1.42 时间复杂度分析
  • 2. 总结

本篇文章借助具体的例子来学习分治策略。这个例子是课本上的:芯片测试的例子。

1. 芯片测试

在讲解具体的芯片测试的分治策略算法之前,先来了芯片测试的意思

1.1 一次测试的过程


如上图,A、B为芯片。测试方法为:将2片芯片(A和B)置于测试台上,互相进行测试,测试报告是“好”或者“坏”,只取其一。

  • 假设:好芯片的报告一定是正确的,坏芯片的报告是不确定的(可能会出错)

那么上述测试的结果有四种可能,如下图:

上面的结果应该不难理解

那么现在问题来了:

  • 输入:n片芯片,其中好芯片,至少比坏芯片多一片
  • 问题:设计一种测试方法,通过测试从n片中挑出1片好芯片
  • 要求:使用最少的测试次数

1.2 如何测试一块芯片的好坏

针对上述问题,现在先来研究一下,如何在上述n片芯片中,测试出A是好芯片还是坏芯片?

  • 问题:给定芯片A,判定A的好坏
  • 方法:用其他n-1片芯片对A进行测试。

假设:n=7:好芯片数>=4

  1. A好,6个芯片中至少3个报“好”
  2. A坏,6个芯片中至少4个报坏

所以对于n是奇数情况下:好芯片数>=(n+1)/2
A好,至少有(n-1)/2个报“好”
A坏,至少有(n+1)/2个报“坏”

结论:

  1. 至少一半报好,A是好芯片
  2. 超过一半报坏,A是坏芯片

假设: n=8:好芯片数>=5

  1. A好,7个芯片中至少4个报“好”
  2. A坏,7个芯片中至少5个报“坏”

所以对于n是偶数:好芯片数 >= n/2+1.
A 好, 至少有 n/2个报告“好”
A 坏, 至少有 n/2+1个报告“坏”

结论:n-1份报告中

  1. 至少一半报好,A是好芯片
  2. 至少一半报坏,A是坏芯片

上面的分析,已经很清晰,我们已经知道如何测试一块芯片的好坏。那么人们最拿手的方法就是:暴力算法(蛮力算法)可以直接写代码了。。。

1.3 蛮力算法

测试算法:任取 1片测试,如果是好芯片,测试结束;如果是坏芯片,抛弃,再从剩下芯片中任取 1片测试,直到得到 1片好芯片

时间估计:

第一片是坏芯片,最多测试n-2次
第二片是坏芯片,最多测试n-3次

总计:Θ(n2)\Theta(n^2)Θ(n2)

可见时间复杂度之高,数据量一多,肯定会超时。

1.4 分治算法设计思想

在分析分治算法的正确性之前,我们先给出这个算法的描述:

假设n为偶数,将n片芯片两两一组做测试淘汰,剩下芯片构成子问题,进入下一轮分组淘汰。

淘汰规则为:

  • “好,好” ==> 任留1片,进入下轮
  • 其他情况 ==> 全部抛弃

递归截止条件:n<=3
3片芯片,一次测试可得到好芯片
1或者2片芯片,不需要再测试,他们都为好芯片。

上述算法过程就是我们给出的分治策略的设计。那么为什么上述的策略是正确的呢?

回忆一下,前面的文章,要保证分治策略的正确性的基本条件是:子问题与原问题性质相同。下面我们就来证明,上述分治策略的子问题与原问题性质相同。

1.41 分治算法的正确性证明

原问题:n片芯片,其中好芯片,至少比坏芯片多一片

那么子问题,命题1:当 n 是偶数时,在上述淘汰规则下,经过一轮淘汰,剩下的好芯片比坏芯片至少多1片

我们需要证明上述子问题的命题1是正确的。

证明:假设原问题中A,B都好的芯片有i组,A与B一好一坏的有j组,A与B都坏的有k组。那么经过一轮淘汰后,好芯片还剩i片,坏芯片还剩k片。

因为

  • 初始芯片总数 2i+2j+2k = n
  • 初始好芯片多于坏芯片:2i+j > 2k+j

得出:i>k

所以,剩余的芯片好芯片比坏芯片,至少多1片。命题1 是正确的。即证明了上述分治算法的正确性。

当n为奇数时,特殊处理。当n是奇数时,可能会出现问题,如图:

可见淘汰后的子问题并不满足于原问题性质相同,此时无法继续测试。

  • 处理办法是:当n为奇数时,增加一轮对轮空芯片的单独测试,如果该轮空芯片为好芯片则算法结束,如果是坏芯片,则淘汰该芯片。

下面给出上述分治算法的伪码描述:

1.42 时间复杂度分析

设输入规模为n,,每轮淘汰后,芯片数至少减半,测试次数(含轮空处理):O(n)

时间复杂度:

W(n) = W(n/2) + O(n)
W(3)=1,W(2)=W(1)=0

解上述方程的得:W(n) = O(n)

结果很振奋人心,你已经将一个O(n2)O(n^2)O(n2)级别的算法优化为了O(n)O(n)O(n)级别!!!

2. 总结

最大的需要注意的地方就是:如何保证子问题与原问题性质相同:

可以:

  1. 增加额外处理(比如上述n为奇数时对轮空数据的处理)
  2. 额外处理的工作量,不改变函数的阶

【算法设计与分析】15 分治策略:芯片测试相关推荐

  1. 算法设计与分析:分治思想 - 入门

    文章目录 分治思想 判断分治的条件 分治思想在排序问题的应用 求逆序对的个数 分治总结 本文参考UCAS卜东波老师的计算机算法设计与分析课程完成 分治思想 分治思想可以归纳为两点: 将一个复杂问题化简 ...

  2. 计算机算法设计与分析二--分治

    1.如果问题和以下数据结构相关,那么把他们分成子问题相对容易 n维数组 矩阵 n个元素的集合 树 有向无环图 通用图 2.分治算法一般应用于可以分成子问题的问题 实例: 一.排序问题:对一个n维数组排 ...

  3. 算法设计与分析 屈婉玲教授(第三章)

    内容概括 最上方途径一:减少子问题的数量,途径二:通过预处理 分治策略 芯片测试 快速排序 分治算法 改进分治算法的途径--减少子问题的数量 示例: 简单的分治不一定能得到好的算法,因为子问题的数量是 ...

  4. 【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

    上一篇文章学习了:[算法设计与分析]15 分治策略:芯片测试 文章目录 1. 快速排序的基本思想 1.2 时间复杂度的计算 1.21 最坏情况时间复杂度计算 1.22 最好情况时间复杂度 1.23 平 ...

  5. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  6. 【算法设计与分析】14 分治算法的一般描述和分析方法

    本文主要描述分治算法的一般描述和分析方法.衔接上一篇文章:[算法设计与分析]13 分治策略的设计思想 文章目录 1 分治算法的一般性描述 1.1 分支算法的时间分析 1.2 两类常见的递推方程与求解方 ...

  7. 0x08算法设计与分析复习(二):算法设计策略-回溯法2

    参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...

  8. 算法设计与分析——十大经典排序算法一(1--5)

    目录 算法设计与分析--十大经典排序算法 第1关:冒泡排序 参考代码 第2关:选择排序 参考代码 第3关:插入排序 参考代码 第4关:希尔排序 参考代码 第5关:归并排序 参考代码 作者有言 一个不知 ...

  9. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

最新文章

  1. 【51CTO学院三周年】我的职业生涯有贵人相助--小强老师
  2. 2_tabbar底部切换
  3. 网络编程 UDP套接字
  4. 多网卡无法上外网的解决
  5. JavaScript indexOf() 方法
  6. 源码分析Dubbo服务提供者启动流程-下篇
  7. 【Flink】Flink PipelineExecutor 体系
  8. 识别你的ADFS是什么版本的(Which version of ADFS is running)
  9. 27.MySQL Status
  10. 在线Javascript美化格式化工具
  11. 什么是3D建模?一文帮助小白了解建模全流程!
  12. 使用Electron和Microsoft Bot Framework制作Skype Bot
  13. 程序员的自我修炼——新手如何学好编程
  14. 一种焊盘的补偿结构分析
  15. 九章算术 九:《勾股》
  16. 计算机如何实现开根号?
  17. 利用JS制作简易计算器
  18. linux centos7以上的自带监控界面cockpit案例
  19. word中如何单栏与双栏混排
  20. Day05java-继承

热门文章

  1. Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持
  2. Java面试题18 牛客 假定Base b = new Derived();
  3. Qt 生成bin文件
  4. 移动端中使用调试控制台
  5. CSS之Responsive设计和CSS3 Media Queries的结合
  6. 数据全裸时代,你的隐私有多容易获取?
  7. 关于如何清除某个特定网站的缓存---基于Chrome浏览器
  8. 刷题总结——xor(ssoj)
  9. SMB MS17-010 利用(CVE-2017-0144 )
  10. maven常见问题问答 收藏