芯片测试问题

有n片芯片,已知其中好芯片比坏芯片至少多1片。现在需要通过测试从中找出1片好芯片。测试的方法是:将2片芯片放到测试台上,2片芯片互相测试并报告测试结果:”好”或者”坏”。假定好芯片的报告是正确的,坏芯片的报告是不可靠的(可能是对的,也可能是错的)。请设计一个算法,使用最少的测试次数来找出1片好芯片。

由于好芯片至少比坏芯片多1片,对1片芯片来说,如果有⌊n/2⌋片芯片都报告它是”好的”,那么这片芯片一定是好的因为如果该芯片的所有报告都是坏芯片产生的,则说明已经有⌊n/2⌋个坏芯片,又因为好芯片比坏芯片多,所以当前芯片一定是好的;而如果并非所有报告都是坏芯片产生的,那么有些报告是好芯片产生的,所以当前芯片一定是好的)。一个蛮力算法就是任取1片芯片,然后用其余所有芯片来测试它,直到找到1片好芯片为止。这个算法最坏情况下Θ(n^2)次测试。

下面尝试一下分治策略

初始的想法就是:将n片芯片两两一组分成⌊n/2⌋组,每组测试1次。就像体育比赛的淘汰赛一样,通过第一轮的⌊n/2⌋次测试淘汰一部分芯片,剩下的芯片构成一个规模较小的子问题进入第二轮。如果测试的芯片不超过3片(即子问题规模小于等于3),并且好芯片比坏芯片至少多1片,那么只要测试1次就可以找出好芯片。剩下需要考虑的一个问题是:采取什么样的淘汰规则,能够保证进入下一轮的好芯片比坏芯片至少多一片,换句话说,每轮测试丢弃的坏芯片数至少和丢弃的好芯片数一样多。这涉及算法的正确性。另一个问题是:每轮测试淘汰的芯片数占测试芯片数的比例是多少。这涉及子问题规模缩小得有多快,它决定了算法的效率。

先分析一下不同的测试报告究竟给出了什么信息。假设放到测试台上的芯片是A和B,表1列出了可能的结果。

  • 如果测试结果是情况1,那么A、B中留1片,任意丢掉1片(实际上A、B都好或A、B都坏);
  • 如果是后三种情况,则把A和B全部丢掉(实际上因为至少有一片是好的,因此最差的情况是好坏芯片同归于尽,但至少没有多丢掉好芯片)。

命题 1 当n是偶数时,在上述规则下,经过一轮淘汰,剩下的好芯片比坏芯片至少多1片。
证 设A、B都是好芯片的有i组,A、B一好一坏有j组,A、B都坏的有k组,那么

经过淘汰后,剩下好芯片数为i,坏芯片数为k,满足i>k。

但是当n是奇数,没被分组而轮空的是1片坏芯片时,可能淘汰后剩下的好芯片与坏芯片数相等。比如n=7,有4片好芯片,3片坏芯片。如果分组为:{好,好},{好,好},{坏,坏}1片坏芯片轮空,那么淘汰后的4片芯片恰好2好2坏。对于奇数的情况,可以增加一轮特殊处理,即把这个轮空的芯片与每1片其他芯片都测一遍。根据前面的分析,通过这些测试可以判断这片芯片的好坏。如果它是好的,算法结束;如果它是坏的,丢弃它。这些额外工作需要O(n)次测试,而这轮分组内的测试也需要O(n)次(精确说应该是⌊n/2⌋次),因此不论是偶数还是奇数,归约为子问题的工作量都是O(n)。

下面考虑第二个问题。

命题2 因为每组至少需要丢掉1片芯片,因此经过一轮测试后,剩下的芯片数至多为n/2。算法的伪码描述如下:


根据前面关于递推方程的分析结果,可以得到 。不难看出,比起蛮力算法,分治算法在效率上有明显的提高。


选择问题

1、同时选最大和最小算法

该算法的基本思想是:首先将L中的元素两两一组,分成⌊n/2⌋组(当n是奇数时有一个元素轮空)。每组中的两个数通过1次比较确定本组的”较大”和”较小”。把至多⌊n/2⌋+1(当n为奇数时,需要把被轮空的元素加进来)个小组”较大”放到一起,运行Findmax算法找出其中的最大元素,它就是L中的最大元素。类似地,再把至多⌊n/2⌋+1(当n为奇数时,需要把轮空的元素加进来)个小组”较小”放到一起,运行Findmin算法找出其中的最小元素,它就是L中的最小元素。

该算法的伪码描述如下:

2、找第二大元素的算法

显然两次调用Findmax算法可以得到第二大元素,先用Findmax算法找出最大元素,然后从L中删除max,再调用Findmax找出剩下元素的最大元素,就是输入L的第二大元素Second。不难看出该算法的时间复杂度是:

下面尝试锦标赛算法。该算法的基本思想是:将L中的元素两两一组,分成⌊n/2⌋组(如果n是奇数时可能有1个元素轮空)。每组内进行比较,将较小的元素淘汰,每组中较大的元素和轮空的元素(如果存在的话)进入下一轮。进入下一轮的元素应该有⌈n/2⌉个。在下一轮中,继续进行同样的分组淘汰,胜者再进入下一轮,直到产生”冠军”,即最大元素为止。到此算法总计淘汰了n-1个元素,每次比较恰好淘汰1个元素,因此算法已经做了n-1次比较。但是,我们的任务还没有完成,怎样找第二大元素Second呢? 如果还是再次调用找最大算法,那么算法还需要n-2次比较。这就和刚才的两次调用Findmax的算法在时间上一样了。我们的想法是:利用第一阶段竞争冠军时比较运算的结果信息,以减少第二阶段的比较次数。这是可能的。首先观察到,第二大元素只能在与最大元素max直接比较所淘汰的元素中产生。如果一个元素被其他元素淘汰,而那个元素本身不是冠军,那么该元素至多只能排在第三名之后。这样,我们在找第二大元素时只需关心那些被max淘汰的元素即可。需要考虑的是在第一阶段中,被max淘汰的元素有多少,又是哪些元素。在max没产生之前,算法并不知道谁是最后的冠军,我们必须要求每个元素把被自己淘汰掉的元素全部记录下来。为此,在比赛之前为每个元素设定一个指针,指向一个链表。如果该元素在比较中把其他元素淘汰了,就把那个元素记录在自己的链表里。到max产生的时候,我们只需要检查max的链表,在上面调用Findmax 算法就可以找到第二大元素了。算法的伪码描述如下:

这个算法的时间复杂度是多少? 算法所做的比较次数分成两部分,第一部分是找最大元素max过程中的比较次数,第二部分是在产生max后在其链表中找最大所需要的比较次数。在第一部分,每次比较正好淘汰1个元素,淘汰n-1个元素的比较次数就等于n-1。在第二部分,比较次数恰好等于max 链表中的元素个数减1,只要估计出max 所淘汰掉的元素个数就可以得到这部分的工作量。

我们有下面的命题:

算法设计与分析:芯片测试问题、选择问题详解相关推荐

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

    上一篇文章学习了[算法设计与分析]14 分治算法的一般描述和分析方法 文章目录 1. 芯片测试 1.1 一次测试的过程 1.2 如何测试一块芯片的好坏 1.3 蛮力算法 1.4 分治算法设计思想 1. ...

  2. 算法设计与分析——顺序统计量:期望为线性时间的选择算法

    分类目录:<算法设计与分析>总目录 相关文章: · 顺序统计量:最大值与最小值 · 顺序统计量:期望为线性时间的选择算法 · 顺序统计量:最坏情况为线性时间的选择算法 选择算法指的是在一个 ...

  3. 【算法设计与分析】屈婉玲教授—课程笔记

    网课地址与课件 B站:[北大公开课] 算法设计与分析 屈婉玲教授 (76p) 课件:来源于评论区小伙伴分享(百度云)     提取码:1111 笔记 课程知识框架 算法设计思想 设计思想:尽量选复杂度 ...

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

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

  5. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  6. C++算法设计与分析课后习题(第三章)

    C++算法设计与分析课后习题[第三章] 前言 一.求2+22+222+2222+...+22...(n个2)...22(精确计算) 变量解释 运行截图 二.编写一个算法,其功能是给一维数组a输入任意6 ...

  7. C++ 算法设计与分析 地图着色问题(中国+美国)

    文章目录 中国+美国可选择地图着色问题 地图着色问题 解决方法 回溯法 队列 代码展示 美国地图着色 代码(c++) 结果 中国+美国地图着色 代码(c++) 结果 可视化 中国+美国可选择地图着色问 ...

  8. 国科大刘玉贵老师计算机算法设计与分析2021年期末考试题回顾

    总体感受 国科大研究生的计算机算法设计与分析课程有三位老师教授,分别是卜东波老师.陈玉福老师 和刘玉贵老师,这三位老师上课各有特色和风格.我选择的是刘玉贵老师的课程. 这门课程的内容挺充足的,但是有个 ...

  9. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

  10. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

    计算机算法设计与分析(第4版) 目录 1 算法概述 2 递归与分治策略 3 动态规划 4 贪心算法 5 回溯法 6 分支限界法 7 随机化算法 8 线性规划与网络流 算法概述 复杂性分析 NP-完全性 ...

最新文章

  1. 深度学习中的图像分割:方法和应用
  2. python的用途实例-python中类方法,实例方法,静态方法的作用和区别
  3. 读书笔记—写给大家看的PPT设计书
  4. python简单爬豆瓣电影排名
  5. 分配的访问权限的展台应用:最佳做法
  6. 9 Unconstrained minimization
  7. koa2-cookie-session
  8. leetcode 实现 strStr()
  9. 使用RDLC报表(四)--钻取式报表
  10. mybatis mysql uuid_spring boot整合mybatis利用Mysql实现主键UUID的方法
  11. 16小时31分12秒!2019天猫双11成交额超2135亿元,超越2018年全天成交额
  12. Flask带参URL传值的方法
  13. kafka集群安装部署
  14. #CSP 201512-1 数位之和(100分)
  15. 版本帝Java 12 / JDK 12 正式发布,八大重大更新及部分代码示例
  16. cmake Can‘t find third_party/gtest
  17. 【语音合成】基于matlab两端音频合成【含Matlab源码 1490期】
  18. win7家庭版计算机桌面,win7家庭普通版如何显示桌面图标
  19. PADS9.5 导入立创元器件库卡顿
  20. python--修改证件照的大小

热门文章

  1. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
  2. 中石油训练赛 - 手机号码(简单分块+思维)
  3. UVA - 11846 Finding Seats Again (DFS搜索对象)
  4. C++读图片——Mac下对于bmp文件读写读取过大的解决方案
  5. 从内存中加载并运行exe(两种方法)
  6. 像加载DLL一样加载EXE
  7. Redis 数据结构 :SDS、链表、字典、跳表、整数集合、压缩列表
  8. C++ 面向对象(三)异常 :异常概念、异常的匹配规则、异常安全、异常体系
  9. 经典动态规划:0-1 背包问题
  10. 【内含福利】七牛云线下专场活动免费报名