互いに異なる 個の実数 を昇順に並べかえる。使える操作は「 つの要素を比べて、どちらが小さいかを知る」比較だけとし、 回の比較の結果は 通りであるとする。このような比較にもとづくソートの手順を決定木で表すと、葉はそれぞれ つの並べ方(順列)に対応し、すべての並べ方が葉として現れる必要がある。この考え方から得られる「最悪の場合の比較回数の下界」 の値を求めよ。
ソート・探索の最悪比較回数
二分探索・マージ(併合)・挿入ソートなどの最悪の比較回数を数え、決定木による下界 を求められる
前提
- 対数の定義と性質 (数学II 指数関数と対数関数)
- 順列・円順列・重複順列 (数学A 場合の数と確率)
この技能までの道筋(16 技能)
読み込み中…
右端(太枠)がこの技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
- 分数のたし算・ひき算 (算数 計算と数のきまり)
- 小数の四則計算 (算数 計算と数のきまり)
- 正負の数の加法・減法 (中学数学 数と式)
- 分数のかけ算・わり算 (算数 計算と数のきまり)
- 四則の混じった計算の順序 (算数 計算と数のきまり)
- 正負の数の乗除・累乗と四則混合 (中学数学 数と式)
- 約数の見つけ方 (算数 整数の性質)
- 素因数分解と約数の個数 (算数 整数の性質)
- 平方根の意味と根号の簡単化 (中学数学 数と式)
- 根号の乗除と加減 (中学数学 数と式)
- 指数の拡張と指数関数 (数学II 指数関数と対数関数)
- 対数の定義と性質 (数学II 指数関数と対数関数)
- 樹形図で数え上げる (算数 場合の数)
- 積の法則と和の法則 (算数 場合の数)
- 和の法則・積の法則と樹形図 (数学A 場合の数と確率)
- 順列・円順列・重複順列 (数学A 場合の数と確率)
説明
比較だけを使うアルゴリズム(探索・併合・整列)が、最悪の場合に何回比較するかを正確に数えられるようになります。代表的な結果は、二分探索が 回、長さ の整列済み列の併合が 回、挿入ソートが 回です。さらに「どんなに工夫した比較ソートでも最悪 回は比較が必要」という下界を、決定木という考え方で求めます。アルゴリズムの効率を比べるときや、これ以上速くできない限界を知りたいときに使います。
なぜそうしてよいのか
【個別のアルゴリズム】二分探索では、整列済みの 個の中央の要素と目標を比べ、1 回の比較で「等しい・小さい・大きい」がわかるとします。等しくなければ、残る候補は中央より左か右の一方で、多いほうでも 個です。最悪回数を とすると , です。 なら となり、半分にするたびに が 1 ずつ減るので、 です。併合では、1 回比べるごとに小さいほうを 1 個出力します。片方の列が空になれば残りは比較なしで並べられ、最後の 1 個は必ず比較なしで出るので、比較は高々 回です。両方の列の最後の要素が全体の大きいほうから 2 つを占めるときなど、この回数になる入力があります。挿入ソートでは、 番目()の要素を、整列済みの 個に右から比べて差し込みます。入力が逆順なら毎回 回比べるので、合計は 回です。
【下界:決定木】比較ソートの動きを、樹形図として描きます。各分かれ目が 1 回の比較( か否か)で、2 本に枝分かれします。末端(葉)では並べ替え方が 1 つに決まります。異なる 個の数の並び方は 通りあります。異なる並び方が同じ葉に着くと同じ並べ替えが行われてしまい、両方を正しく整列できません。したがって葉は 個以上必要です。一方、最悪比較回数(根から葉までの最長の道の比較数)が なら、積の法則により葉は高々 個です。
よって 、すなわち です。 は整数なので となります( は 以上の最小の整数)。これは「どの比較ソートも、最悪の場合これ以上の回数は比較する」という限界です。
手順
1 回の比較で何がわかるかを確認する(整列は「 か 」の 2 分岐、二分探索は「」の 3 通り)。
二分探索の最悪回数: となる整数 を見つけ、 回とする。
併合の最悪回数:長さ (ともに 1 以上)の整列済み列なら 回。
挿入ソートの最悪回数: 回(入力が逆順のとき)。
比較ソートの下界: を計算し、 となる最小の整数 を求める。この が である。
例題
相異なる 5 個の数を、2 数の大小比較だけを用いて整列する。どのような比較ソートでも最悪の場合に必要な比較回数の、決定木による下界 を求めよ。
例題の解答
手順1:比較は「 か 」の 2 分岐なので、最悪 回の比較で区別できる並び方は高々 通りである。
手順5:区別すべき並び方は 通りなので、 となる最小の整数 を探す。、 である。よって となり、 である。したがって、どの比較ソートも最悪の場合 7 回以上は比較する。
答え:
よくある誤り
を や と取り違える誤り。 では 、 となるが、正しくは である。
二分探索の最悪回数を としてしまう誤り。 では 3 になってしまうが、等しいかどうかを確かめる比較も数えると、正しくは 回である。
併合の最悪回数を 回とする誤り。最後の 1 個は比較なしで出力できるので、正しくは 回である(例: なら 5 回)。
下界 を、必ず達成できる最小回数だと思い込む誤り。これは「これより少なくはできない」という保証にすぎない。たとえば では だが、実際に必要な最小の最悪回数は 30 である。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。
入口の問題
互いに異なる 個の実数 を、比較ソートで昇順に並べかえる。比較ソートとは、 つの要素の大小を比べる操作(結果は「」か「」の 通り)だけを用いて並べ方を決めるアルゴリズムのことである。
どの比較ソートも、最悪の場合には少なくとも 回の比較を行う。これは決定木の考え方から得られる下界である。この下界 の値を求めよ。ただし、 は 以上の最小の整数を表す。
互いに異なる 個の実数 を、比較だけを使って昇順に並べかえる。 回の比較では、ある 個 について「 か」を調べ、「はい」か「いいえ」の答えを得る。どのような比較ソートのアルゴリズムでも、最悪の場合の比較回数は決定木による下界 以上になる。この下界 の値を求めよ。ただし、 は 以上の最小の整数を表す。
この技能を使う問題
昇順に並んだ互いに異なる 個の数の配列 から、値 を次の二分探索で探す。ただし、 は のどれかと必ず等しいとする。
- はじめに , とする。
- とし、 と を比較する。この比較は 回で「」「」「」のどれであるかがわかるものとし、比較 回と数える。
- ならば探索を終える。 ならば とし、 ならば として、前の手順に戻る。
が のそれぞれと等しい確率がどれも であるとき、探索を終えるまでの比較回数の期待値を求めよ。
を 以上の整数とする。相異なる 個の実数からなる列 が与えられたとき、 が単調であるかどうか、すなわち「 または 」が成り立つかどうかを判定し、「はい」または「いいえ」を出力する問題を考える。
判定を行うアルゴリズムは決定的であり、入力の値には「2 つの添字 を指定して かどうかを調べる」比較によってのみアクセスできるものとする。どの比較を次に行うか、いつ停止して何を出力するかは、それまでの比較の結果だけから決まる。
この判定を常に正しく行う任意のアルゴリズムに対し、比較を少なくとも 回行う入力が存在すること、すなわち最悪の場合の比較回数が 以上であることを証明せよ。
互いに異なる 個の実数を並べた配列を、次のマージソートで昇順に並べかえる。
- 長さ の列はそのまま返す。
- 長さ の列は、前半の 個と後半の残り 個に分け、それぞれを再帰的に昇順に並べかえてから、次の手続きで併合する。
- 併合の手続き: 昇順に並んだ つの列 が与えられたとき、どちらも空でない間は、 の先頭と の先頭を 回比較し、小さい方を取り出して出力の末尾に加える。一方の列が空になったら、もう一方の列に残っている要素を、比較を行わずにそのまま順に出力の末尾に加える。
入力の 個の数の並び方は 通りすべてが等確率で現れるとする。このマージソート全体で行われる要素どうしの比較回数の期待値を求めよ。
この技能の次に学べること
- ソートの平均比較回数と転倒数 (大学数学 アルゴリズムと計算量)