From 水木社区 Programming版 (Dec 22 2006) By pingfan (繁华一梦)
用G表示好芯片,B表示坏芯片,x-y表示用x和y比较,0、1分别表示测试结果为好芯片和坏芯片。
则有以下几种情况:
G-G: 1-1
G-B: 0-0 or 1-0
B-B: 0-0 or 0-1 or 1-0 or 1-1
再做一下逆向分析:
1-1: G-G or B-B
0-1: B-G or B-B
0-0: B-G or G-B or B-B
可以看出,当x-y的比较结果a-b中出现0时,x和y中至少有一个芯片是坏的。
因为好芯片比坏芯片多,所以有如下算法:
1. 定义集合Chip, 包含所有的2k块芯片
2. 将Chip中的芯片等分为两组:x[1..m],y[1..m] 定义新集合newChip <— {}
3. for i <— 1 to m 比较x[i]和y[i],若结果为 "1-1",newChip.insert(x[i]);
4. if newChip.size() = 0
返回temp
else if newChip.size() = 1
返回newChip中的芯片
else if newChip.size() 是奇数
删除newChip中的任意一块芯片,并将其保存到temp
5. Chip <— newChip,回到第2步。
Complexity:最糟糕情况下,比较次数为:k + k/2 + k/4 + ... + 1 < 2*k 。