题目:
(30分)
芯片测试:有2k块芯片,已知好芯片比坏芯片多.请设计算法从其中找出一片
好芯片,说明你所用的比较次数上限.
其中:好芯片和其它芯片比较时,能正确给出另一块芯片是好还是坏.
坏芯片和其它芯片比较时,会随机的给出好或是坏。
题目分析:
不妨设用芯片比较时,0表示好的判断,1表示坏的判断,X表示不确定的判断。
两个芯片进行比较时,可能出现三种情况:
a) 两个都好 ==> (0,0)
b) 一好一坏 ==> (1,X)
c) 两个都坏 ==> (X,X)
情况a为真,则其逆否命题也为真。知:
如果两个芯片比较结果中出现1,则这两个芯片中至少有一个是坏的。 ……(一)
好芯片比坏芯片多。知:
将2k块芯片平分为两堆芯片,则这两堆芯片中都至少含有一个好的芯片。 ……(二)
根据(一)(二),可以设计如下算法:
算法输入:2k块芯片,其中好芯片比坏芯片多
算法输出:一片好芯片
算法过程:
1) 将所有芯片平分为两堆,记为A和B。
2) 如果A中只包含一个芯片,则返回该芯片;否则从A中任取一个芯片,记为t。
3) 将t与A中其他芯片依次进行比较,有两种可能:
3.1) 一旦比较时结果中出现1,则将进行比较的两片芯片排除出A,同时从B中任取一个芯片加入A,转至第2步;
3.2) 所有比较都得到结果(0,0),则返回芯片t。
算法说明:
步骤2中,如果A中只包含一个芯片,则B中也只包含一个芯片,由于好芯片比坏芯片多,所以只可能这两个芯片都是好芯片。
步骤3.1中,如果比较时结果中出现1,根据(一),这两片芯片中至少有一个是坏的,那么将这两片芯片排除出A后,A和B合起来依然满足好芯片比坏芯片多的条件,对原问题的求解转为对同结构子问题的求解。从B中任取一个芯片加入A,可以实现再次平分。
步骤3.2中,比较都得到结果(0,0),则芯片t一定是好芯片。否则假设t是坏芯片,而根据(二),A中至少含有一个好芯片,用该芯片与t比较时,得到的结果应为(1,X),与所有结果都为(0,0)矛盾。其实可以进一步证明,此时A中所有芯片都是好芯片。
算法复杂度分析:
最坏的情况下,总是不进入步骤3.2,且每次步骤3.1中都是比较到最后一块芯片才出现结果1,则此时需要比较的总次数为(k-1)+(k-2)+...+1 = k*(k-1)/2;因此该算法时间复杂度为O(n^2),其中n为总的芯片个数。