技能一覧 › 大学数学 アルゴリズムと計算量

ソート・探索の最悪比較回数

二分探索・マージ(併合)・挿入ソートなどの最悪の比較回数を数え、決定木による下界 を求められる

前提

この技能までの道筋(16 技能)
算数中学高校大学大学院

読み込み中…

右端(太枠)がこの技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。

一覧で見る(前提が先)
  1. 分数のたし算・ひき算 (算数 計算と数のきまり)
  2. 小数の四則計算 (算数 計算と数のきまり)
  3. 正負の数の加法・減法 (中学数学 数と式)
  4. 分数のかけ算・わり算 (算数 計算と数のきまり)
  5. 四則の混じった計算の順序 (算数 計算と数のきまり)
  6. 正負の数の乗除・累乗と四則混合 (中学数学 数と式)
  7. 約数の見つけ方 (算数 整数の性質)
  8. 素因数分解と約数の個数 (算数 整数の性質)
  9. 平方根の意味と根号の簡単化 (中学数学 数と式)
  10. 根号の乗除と加減 (中学数学 数と式)
  11. 指数の拡張と指数関数 (数学II 指数関数と対数関数)
  12. 対数の定義と性質 (数学II 指数関数と対数関数)
  13. 樹形図で数え上げる (算数 場合の数)
  14. 積の法則と和の法則 (算数 場合の数)
  15. 和の法則・積の法則と樹形図 (数学A 場合の数と確率)
  16. 順列・円順列・重複順列 (数学A 場合の数と確率)

説明

比較だけを使うアルゴリズム(探索・併合・整列)が、最悪の場合に何回比較するかを正確に数えられるようになります。代表的な結果は、二分探索が 回、長さ の整列済み列の併合が 回、挿入ソートが 回です。さらに「どんなに工夫した比較ソートでも最悪 回は比較が必要」という下界を、決定木という考え方で求めます。アルゴリズムの効率を比べるときや、これ以上速くできない限界を知りたいときに使います。

なぜそうしてよいのか

【個別のアルゴリズム】二分探索では、整列済みの 個の中央の要素と目標を比べ、1 回の比較で「等しい・小さい・大きい」がわかるとします。等しくなければ、残る候補は中央より左か右の一方で、多いほうでも 個です。最悪回数を とすると , です。 なら となり、半分にするたびに が 1 ずつ減るので、 です。併合では、1 回比べるごとに小さいほうを 1 個出力します。片方の列が空になれば残りは比較なしで並べられ、最後の 1 個は必ず比較なしで出るので、比較は高々 回です。両方の列の最後の要素が全体の大きいほうから 2 つを占めるときなど、この回数になる入力があります。挿入ソートでは、 番目()の要素を、整列済みの 個に右から比べて差し込みます。入力が逆順なら毎回 回比べるので、合計は 回です。

【下界:決定木】比較ソートの動きを、樹形図として描きます。各分かれ目が 1 回の比較( か否か)で、2 本に枝分かれします。末端(葉)では並べ替え方が 1 つに決まります。異なる 個の数の並び方は 通りあります。異なる並び方が同じ葉に着くと同じ並べ替えが行われてしまい、両方を正しく整列できません。したがって葉は 個以上必要です。一方、最悪比較回数(根から葉までの最長の道の比較数)が なら、積の法則により葉は高々 個です。

よって 、すなわち です。 は整数なので となります( は 以上の最小の整数)。これは「どの比較ソートも、最悪の場合これ以上の回数は比較する」という限界です。

手順

  1. 1 回の比較で何がわかるかを確認する(整列は「 か 」の 2 分岐、二分探索は「」の 3 通り)。

  2. 二分探索の最悪回数: となる整数 を見つけ、 回とする。

  3. 併合の最悪回数:長さ (ともに 1 以上)の整列済み列なら 回。

  4. 挿入ソートの最悪回数: 回(入力が逆順のとき)。

  5. 比較ソートの下界: を計算し、 となる最小の整数 を求める。この が である。

例題

相異なる 5 個の数を、2 数の大小比較だけを用いて整列する。どのような比較ソートでも最悪の場合に必要な比較回数の、決定木による下界 を求めよ。

例題の解答

手順1:比較は「 か 」の 2 分岐なので、最悪 回の比較で区別できる並び方は高々 通りである。
手順5:区別すべき並び方は 通りなので、 となる最小の整数 を探す。、 である。よって となり、 である。したがって、どの比較ソートも最悪の場合 7 回以上は比較する。

答え:

よくある誤り

この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。

入口の問題

この技能を使う問題

この技能の次に学べること