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

上一篇文章学习了【算法设计与分析】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. 额外处理的工作量,不改变函数的阶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术

作者&#xff1a;枸杞忧天(本文首发于公众号“偶尔学学Unity”&#xff0c;文章仅为作者观点&#xff0c;不代表GWB立场)最近在准备公司的技术分享&#xff0c;主题是入门批量渲染&#xff0c;想着反正也总结了&#xff0c;不如充几篇博客吧&#xff0c;也算显得没有那么半途而…

css - clearfix-清除浮动

参考&#xff1a; http://www.cnblogs.com/zllwebjs/archive/2010/03/19/1689980.html http://www.cnblogs.com/zhangyufeng523/archive/2011/05/09/2041224.html 清除浮动方法有好几种&#xff0c; 1. 用空div&#xff0c;设置css为clear:both 2. 用空br&#xff0c;设置css为…

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

上一篇文章学习了&#xff1a;【算法设计与分析】15 分治策略&#xff1a;芯片测试 文章目录1. 快速排序的基本思想1.2 时间复杂度的计算1.21 最坏情况时间复杂度计算1.22 最好情况时间复杂度1.23 平均时间复杂度计算2 总结1. 快速排序的基本思想 用首元素 x 作划分标准&#…

的run窗口不显示_「玩转deepin」如何安装VirtualBox增强功能使得deepin全屏显示?...

在Windows上通过Virtualbox安装deepin深度操作系统&#xff0c;安装完成后&#xff0c;为了让deepin可以在virtualbox中全屏显示&#xff0c;需要安装增强工具&#xff0c;但是不少同学点击安装增强工具后会出现无法安装的情况。在【设备】中点击【安装增强功能】时&#xff0c…

掘金浏览器插件安装图文教程

本文介绍如何安装掘金chrome插件&#xff1a; Chrome插件推荐 2018-02-27 21:53 chrome插件网近日推荐一款设计师开发人员人手必备的一款插件&#xff1a;掘金插件。有网友留言给笔者说希望整理出一套掘金插件详细的安装步骤。于是就有了今天的图文详解掘金插件安装步骤。第一…

python集群到hadoop_如何使用Hadoop流在本地Hadoop集群中运行MRJob?

我正在学习一个大数据类&#xff0c;我的一个项目是在本地建立的Hadoop集群上运行Mapper/Reducer。在我一直在为类使用Python和MRJob库。在下面是我当前用于Mapper/Reducer的Python代码。在from mrjob.job import MRJobfrom mrjob.step import MRStepimport reimport osWORD_RE…

【ThinkPHP】实例化模型的方法

欢迎大家访问我自己架的博客站点 码厩技术博客&#xff01; 1、实例化一个Model function D($name, $app) { static $_model array(); if (empty($name)) return new Model; if (empty($app)) $app C(DEFAULT_APP); if (isset($_model[$app . $name])) return $_model[$app .…

【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

文章目录1 一条SQL查询语句是如何执行的2 mysql体系结构3 InnoDB存储引擎4 总结1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库&#xff0c;都是将数据库看成一个整体&#xff0c;我们的应用与数据库完全就是通过SQL语句进行交互。大多数开发者很少去了解数据库的内部实…

session实现机制_如何理解php session运行机制

php session运行机制就是客户端将session id传入到服务器中&#xff0c;服务器再根据session id找到对应的文件并将其反序列化得到session值&#xff0c;然后保存的时候先序列化再写入今天将要分享的知识点是PHP中的会话运行机制&#xff0c;对于熟悉PHP的开发者来说并不陌生&a…

【MySQL原理解析】01. 一条SQL查询语句是如何执行的

这是【MySQL原理解析】的第一篇文章&#xff0c;MySQL我看了很多的书与教程&#xff0c;对其原理有一定的理解&#xff0c;一直想写一系列的文章来把MySQL的原理给讲清楚&#xff0c;一直没有时间写&#xff0c;今天算是个开头吧。万事开头难&#xff0c;咱们先破了这个开头&am…

【转载】MOS开关(verilog)

MOS开关 一. MOS开关 1. NMOS 源极(d)接Gnd 一般情况下&#xff0c;可认为晶体管受栅极(g)电平VG的控制(control). 1). VGH&#xff0c;源极(s)与漏极(d)接通; 2). VGL&#xff0c;源极(s)与漏极(d)断开. 源极(s)与漏极(d)接通, 则漏极(d)被下拉到Gnd. 2. PMOS 源极(d)接VDD 1)…

【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

用Log4Net来记录系统的日志信息

[http://www.cnblogs.com/xhwy/archive/2011/11/25/2263495.html] 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后&#xff0c;就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明…

扩展插件_Adobe扩展工具插件系列

Adobe系列软件相信大家都已了解到其功能的强大&#xff0c;除了软件之外Adobe系列的插件的功能也是不可忽略的。今天给大家分享的几款Adobe系列超强PS扩展工具&#xff0c;都是一些摄影师、设计师经常用的到的&#xff0c;可以提升不少工作效率&#xff0c;大家千万别错过哦&am…

【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

dexpress 流程图_DevExpress控件使用经验总结

DevExpress是一个比较有名的界面控件套件&#xff0c;提供了一系列的界面控件套件的DotNet界面控件。本文主要介绍我在使用DevExpress控件过程中&#xff0c;遇到或者发现的一些问题解决方案&#xff0c;或者也可以所示一些小的经验总结。总体来讲&#xff0c;使用DevExpress控…

UCenter 表结构

Ucenter 数据库表结构说明uc_admins 管理员表数据表说明&#xff1a;管理员相关信息属性说明&#xff1a;uid mediumint(8) -- 用户IDusername char(15) -- 用户名allowadminsetting tinyint(1) --allowadminapp tinyint(1) --allowadminuser tinyint(1) --allowadminbadword t…

Java学习之路整理-技术书从入门到进阶最全50+本(珍藏版 )

学习交流加 个人微信&#xff1a;LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027一.速读一遍&#xff08;最好在1~2天内完成&#xff09; 人的大脑记忆力有限&#xff0c;在一天内快速看完一本…

问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介1、Seata组件Seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式&#xff0c;为用户打造一站式的分布式解决方案。2、支持模式AT 模式基于支持本地 ACID 事务的关系型数…

Override and Overload (重写和重载)

1&#xff09;方法的重写overriding和重载overloading是java多态性的不同表现. &#xff08;2&#xff09;重写overriding是父类与子类之间的多态性的一种表现&#xff0c;重载是一个类中多态性的表现。如果子类中定义方法与其父类有相同的名称和参数&#xff0c;我们说该方法被…