同时求最值(min 和 max)时如何把比较次数压到最少
这道题是经典题 —— 同时求最值(min 和 max)时如何把比较次数压到最少。下面给出清晰的算法、举例演示,并给出**下界(最少比较次数)**的证明思路,最后确定正确选项 B(\(3n-2\))。
题目回顾
要在 \(2n\) 个数中同时找出最大值和最小值,问最少比较次数。
最优算法(配对法)——步骤与复杂度推导
- 
配对比较:把 \(2n\) 个数任意分成 \(n\) 对,每对内部比较一次,得到每对的“较大者(winner)”和“较小者(loser)”。
比较次数:\(n\) 次。 - 
在所有 winners 中找最大值:winners 有 \(n\) 个,求最大需要 \(n-1\) 次比较。
比较次数:\(n-1\)。 - 
在所有 losers 中找最小值:losers 有 \(n\) 个,求最小需要 \(n-1\) 次比较。
比较次数:\(n-1\)。 
把三部分加起来:
(把 \(2n\) 写成 \(N\) 的形式:总数为 \(N=2n\) 时,比较次数也可写成 \(\tfrac{3}{2}N - 2\)。)
举例说明(便于理解)
取 \(n=3\)(即共 6 个数),数组为 \([5,2,9,1,7,3]\)。
- 
配对并比较(3 次):
(5,2) → winner 5, loser 2
(9,1) → winner 9, loser 1
(7,3) → winner 7, loser 3 - 
winners = [5,9,7],找最大:比较 5 与 9(1 次,得 9),再比较 9 与 7(1 次,得 9)→ 共 2 次(即 \(n-1=2\))。
 - 
losers = [2,1,3],找最小:比较 2 与 1(1 次,得 1),再比较 1 与 3(1 次,得 1)→ 共 2 次(即 \(n-1=2\))。
 
总比较次数 = \(3 + 2 + 2 = 7\)。代入公式 \(3n-2 = 3\times3 -2 = 9-2 =7\),一致。
为什么不能更少?(下界/最优性说明——直观且合理的证明)
- 
若有某个元素从未参与任何一次比较,那么算法无法确定它是否可能是最小或最大的元素——因此每个元素至少要参与一次比较。每次比较涉及 2 个元素,所以覆盖全部 \(2n\) 个元素最少需要 \(\lceil 2n/2\rceil = n\) 次比较。换句话说,任意正确算法至少要有 \(n\) 次比较以“触及”所有元素。
 - 
做完这至少 \(n\) 次比较后,我们可以把参与比较的每对(或经过安排的比较)视为产生了 \(n\) 个 winners 和 \(n\) 个 losers(每对产生一个 winner 和一个 loser)。要从这 \(n\) 个 winners 中确定真正的最大者,最少需要 \(n-1\) 次比较;同理要从这 \(n\) 个 losers 中确定真正的最小者,最少需要 \(n-1\) 次比较。
 
因此任意算法的比较次数至少为
我们给出的配对算法恰好达到这个下界,故是最优的。
(注:这是一种常见且直观的下界证明 —— “必须先让每个元素至少比较一次” 这一步是关键,使得后面的 max/min 搜索各自至少需要 \(n-1\) 次。)
结论与选项
计算结果为 \(3n-2\),对应选项 B。
额外补充(通用情形)
若元素数不是偶数(设总数为 \(N\)),则一般最少比较次数为
偶数 \(N=2n\) 时退化为 \(3n-2\)。
                    
                
                
            
        
浙公网安备 33010602011771号