給定 n 個互不相同的數,只能通過兩兩比較。求在最壞情況下,找出最大值和第二大值所需的最少比較次數。
每次比較獲得 1 bit 信息。要確定最大值和第二大值,相當於在 n 個元素中找出最大和次大。
已知結論:最少比較次數 = n - 1 + ⌈log₂ n⌉ - 1 = n + ⌈log₂ n⌉ - 2。
n-1 次比較。形成一棵比較樹,根為最大值,葉為原始元素。⌈log₂ n⌉ 場比較(樹高),故最多有 ⌈log₂ n⌉ 個候選者。⌈log₂ n⌉ - 1 次比較。(n-1) + (⌈log₂ n⌉ - 1) = n + ⌈log₂ n⌉ - 2。#include
#include
int main() {
int n;
while (scanf("%d", &n) == 1) {
int ans = n - 1 + (int)ceil(log2(n)) - 1;
printf("%d\n", ans);
}
return 0;
}
| n | 公式值 | 解釋 |
|---|---|---|
| 2 | 1 | 1次比較得出最大和次大 |
| 3 | 3 | 2次找最大,1次在兩個候選者中找次大 |
| 4 | 4 | 3次找最大,1次在兩個候選者中找次大 |
| 5 | 6 | 4次找最大,2次在三個候選者中找次大 |
此題不需模擬比較過程,直接套用「比較樹高度 = ⌈log₂ n⌉」的結論。體現了「信息論下界 + 對手論證」在比較模型中的應用。注意 log2 需包含 cmath,ceil 返回 double 需轉 int。