算法导论习题4-5:芯片检测

习题4-5 3rd edition (4-6 2nd edition)

解法1:

将芯片两两配对,对于后三种情况(至少其中一个是坏的),可以直接将该对芯片丢弃,这样丢弃的好的一定不会超过坏的。

剩下的都是第一种情况,以及可能剩下的单个未配对的。

如果数量为偶数,即没有未配对的,那么“好好”对数一定超过“坏坏”对数,所以每对里面丢弃一个即可。

如果数量为奇数,则保留那个未配对的,并且每对丢掉一个。

解法2:

优点是只需单向检测即可。其实解法1稍作修改也可只用到单向检测。

本方法是基于如下事实:用所有芯片去检测某一个固定芯片,如果报告好的次数 >= 坏的次数,则被测芯片是好的。

方法如下:分别用第2,3,4...个芯片去检测第一个,一旦坏的次数 > 好的次数,则将所有用过的芯片丢弃。

分两种情况讨论:(1)被测芯片是好的 (2)被测芯片是坏的。这两种情况都可以保证丢弃的好芯片一定不多于坏芯片。


def findGood(a):
good, bad = 0, 0
for i in range(1,len(a)):
if a[i].test(a[0]) = "good":
good += 1
else:
bad += 1
if bad == good + 1:
return find(a[i+1:])
return a[0]

另外对于第一问的回答参考这里:

http://www.cnblogs.com/longdouhzt/archive/2011/07/15/2107751.html

时间: 2024-10-06 07:44:06

算法导论习题4-5:芯片检测的相关文章

算法导论习题 通用汇点

来自习题22.1-6 给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink).通用汇点指的是入度为|V|-1,出度为0的节点. 思路: 考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i 相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1 那么可以令游标从矩阵左上角开始,遇1向下,逢

从头看算法导论 习题2.3-7 深入分析

题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素. 算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i],算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn. 批注:该思想,不是最好的(从简洁.时间复杂度上得到结论),不喜勿喷. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h

算法导论学习笔记(3)-习题2.3-7-排序+二分

question(题意): Describe a O(n lg(n))-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x. 设计一个O(n lg(n))时间复杂度的算法,给定一个n个数字的集合,和一个数字x, 问,是否能在这个集合中找到两个数字,他

算法导论2:几个习题 2016.1.2

一.在归并排序中对小数组采用插入排序(放在上一篇里了): 二.冒泡排序 冒泡排序效率几乎是所有排序里最低的,但却很流行,就是因为它的变成复杂度也是最低的.大多数时候,效率还不及插入排序,其实冒泡排序.插入排序.选择排序基本上效果是差不多的(这个效果不是功能..功能上讲肯定差不多啊都是排序),只是过程略有区别.既然写到这里,就自己总结一下三者吧. 1.插入排序——摸扑克牌的过程 假定前一个是有序的,把第二个插进它应当在的位置,那么前两个就是有序的了,把第三个插进它应当在的位置,那么前三个就是有序的

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

《算法导论》思考题15-2 整齐打印

画外音:没想做到15-2题也是费了一番周折,看来<算法导论>里题都不是白给的 整齐打印问题: 考虑在一个打印机上整齐地打印一段文章的问题.输入的正文是n个长度分别为L1.L2.…….Ln(以字符个数度量)的单词构成的序列.我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符.“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格字符个数为 M - (j-i) - (Li+ …… + Lj),它必须是非负值才能让该行容纳这些单词.我

算法导论_第二章(1)

年前的时候去逛书店,久仰算法导论这本书的大名看见后也就买了下来.回家看了一段时间,发现看书的进度真的是极慢,书里的课后题很多,那些不会的问题也是通过网上搜别人的答案才得以解决的.所以,我就想把我看这本书的心得连带课后的解答分享给大家.同时也是给我坚持把算法导论这本书看完的一个动力 ^_^ 因为本书的第一章相当于一个导论就直接跳过了,那么,从第二章开始! 第二章主要介绍了插入排序和归并排序: 所谓的插入排序就像是一局扑克刚开始时的摸牌阶段,你对手中的扑克所做的整理排序一样.开始时,我们的左手为空并

算法导论学习笔记 (页码:9 ~ 16)

前面算法在生活中不谈,算法的重要性不谈,直接说算法. 第2章 算法基础 2.1 插入排序 书中主要介绍了插入排序的思想,即对于数组A[0 ~ N - 1],长度为N.那么,升序的插入排序的过程即是从A[1]开始,先和A[0]比较,如果比A[0]小,那么将A[0]的元素顺序后移放置在A[1]中,将原本A[1]的元素插入在A[0]的位置上,同理再拿A[5]举例,如果比A[4]小,那么A[4]后移,继续比较A[3],如果还是小,A[3]后移,直到找到合适的位置进行插入,原书中提供的伪代码,我这里提供对

算法导论5:基数排序 2016.1.5

今天的这个比较神奇,是一个线性复杂度的排序算法O(n),算法导论在这一部分先证明了比较排序的复杂度下界是nlgn,所以基数排序不是基于比较的排序. 其实这种比较方法我们应该都接触过.假设输入的数都是三位以下的数(当然其他位数也可以,类比一下,这里就假设是三位数.两位数.一位数),那么只需要大致3n的复杂度就可以排好序.过程是这样: 先设置辅助空间t[0..9][n] 然后扫第一遍n个数,个位是几就放在t[几]那一行.然后扫一遍t数组,按顺序放回原数组中 然后扫第二遍n个数,十位是几就放在t[几]