同时求最值(min 和 max)时如何把比较次数压到最少

这道题是经典题 —— 同时求最值(min 和 max)时如何把比较次数压到最少。下面给出清晰的算法、举例演示,并给出**下界(最少比较次数)**的证明思路,最后确定正确选项 B(\(3n-2\))。


题目回顾

要在 \(2n\) 个数中同时找出最大值和最小值,问最少比较次数。


最优算法(配对法)——步骤与复杂度推导

  1. 配对比较:把 \(2n\) 个数任意分成 \(n\) 对,每对内部比较一次,得到每对的“较大者(winner)”和“较小者(loser)”。
    比较次数:\(n\) 次。

  2. 在所有 winners 中找最大值:winners 有 \(n\) 个,求最大需要 \(n-1\) 次比较。
    比较次数:\(n-1\)

  3. 在所有 losers 中找最小值:losers 有 \(n\) 个,求最小需要 \(n-1\) 次比较。
    比较次数:\(n-1\)

把三部分加起来:

\[\begin{aligned} &\text{总比较次数} = n + (n-1) + (n-1) \\ &= n + n - 1 + n - 1 \\ &= (n+n+n) + (-1-1) \\ &= 3n - 2. \end{aligned} \]

(把 \(2n\) 写成 \(N\) 的形式:总数为 \(N=2n\) 时,比较次数也可写成 \(\tfrac{3}{2}N - 2\)。)


举例说明(便于理解)

\(n=3\)(即共 6 个数),数组为 \([5,2,9,1,7,3]\)

  1. 配对并比较(3 次):
    (5,2) → winner 5, loser 2
    (9,1) → winner 9, loser 1
    (7,3) → winner 7, loser 3

  2. winners = [5,9,7],找最大:比较 5 与 9(1 次,得 9),再比较 9 与 7(1 次,得 9)→ 共 2 次(即 \(n-1=2\))。

  3. 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\) 次比较。

因此任意算法的比较次数至少为

\[n + (n-1) + (n-1) = 3n - 2. \]

我们给出的配对算法恰好达到这个下界,故是最优的。

(注:这是一种常见且直观的下界证明 —— “必须先让每个元素至少比较一次” 这一步是关键,使得后面的 max/min 搜索各自至少需要 \(n-1\) 次。)


结论与选项

计算结果为 \(3n-2\),对应选项 B


额外补充(通用情形)

若元素数不是偶数(设总数为 \(N\)),则一般最少比较次数为

\[\left\lceil \tfrac{3N}{2} \right\rceil - 2, \]

偶数 \(N=2n\) 时退化为 \(3n-2\)


posted @ 2025-08-09 19:34  kkman2000  阅读(32)  评论(0)    收藏  举报