全プロセスの詳細解説
-
逆順の64要素におけるバブルソートの正確な交換回数の予測 7 ステップ
逆順 プリセット(64個の要素、大きい順)でレースを実行してください。バブルソートの交換回数を計算量のオーダーではなく 正確に 予測し、隣接要素の交換を行うどのようなアルゴリズムもその記録を破ることができない理由を述べてください。
-
転倒(inversion)とは、相対的な順序が逆になっている対(ペア)のことである。逆順の入力はその極端な例であり、すべての i < j について手前の要素の方が大きいため、あらゆる対が転倒しており、その総数が転倒数となる。何も移動しないうちにこの数を求めておく。実は、これこそが問題のすべてなのである。
-
バブルソートは、隣接する要素が順序通りでない場合にのみ、その隣接要素同士を交換する。このような交換はその1つの対を解消し、他の対には一切影響を与えない。移動する2つの要素は、それら以外のすべての要素との相対的な位置関係を維持するからである。1回の交換で解消される転倒は常に1つであり、2つになることも、0になることもない。
-
ソート済みとは、転倒が0個であることを意味する。2,016から始めて1回の交換ごとに正確に1個ずつ減らしていく以上、抜け道はない。交換回数は 一義的に決まる のである。パネルには 2,016 回の交換と表示されるが、これは最悪のケースの界(バウンド)ではなく、恒等的な事実(等式)である。
-
比較回数は別のカウントであり、ここではたまたま一致している。パス i では j = 0 … 62 − i をスキャンするため、合計は 63 + 62 + ⋯ + 1 となり、バブル最悪ケース n(n−1)/2 の行に示されている 2,016 と同じになる。両方の回数が等しいということは、あらゆる比較で転倒が検出されたことを意味し、これこそがここでの「最悪のケース」の意味である。各パネルのタイトルの下にあるカウンターは比較1回につき1ステップ、交換1回につき1ステップをカウントするため、開始前は ステップ 0 / 4,032 と表示され、› ボタンを1回クリックするごとにこれらのステップが正確に1つ消費される。タイトルの横にある O(n²) はラベルであって、集計値ではない。
-
ここでステップ2を一般化する。これこそがクイックソートが利用している仕組みだからである。d 離れた位置にある2つの要素を交換しても、その範囲の 外側 にある要素と形成されるすべての対の合計には一切影響を与えない。そのような要素は他方の端と再比較され、2つの比較が入れ替わるだけで、その寄与は変化しないからである。変化し得るのは、その対自体と、各端が形成する 2(d − 1) 個の対(その間にある d − 1 個の要素との対)である。1回の交換で解消できる転倒は最大でも 2d − 1 個であり、d = 1 と置けばステップ2の単一の転倒解消へと還元される。
-
クイックソートの最初の分割では、中央の要素をピボット a[31] = 33 として選択し、(0, 63)、(1, 62)、…、(31, 32) の交換を行う。これは距離 63、61、…、1 での 32 回の交換である。ステップ5により、これらの合計効果の上限は 2,016 個の転倒と抑えられるが、この1回のパスで配列は完全にソートされるため、正確に 2,016 個が解消されたことになる。この上限は等号で達成されており、32 回の交換のそれぞれが自身の最大効果を達成したのである。
-
したがって、この2つのアルゴリズムは巧妙さを競っているのではなく、一度に届く距離(リーチ)を競っているのである。クイックソートの表示された 334 回の比較と 64 回の交換の合計は、カウンターの 398 に一致する。そして、これらの交換のうち実際に要素を移動させるのは 32 回のみであり、残りの 32 回はすでに整列している区間においてピボット自身と交換されているだけである。また、334 という比較回数も 下回って おり、表示されている n·log₂n の参照値 384 よりも少なくなっている。逆順の列の中央要素はその中央値(メディアン)であり、すべての分割が均等になるからである。
解答
2,016 回の交換と 2,016 回の比較 — カウンター上の 4,032 ステップ。 そして、2,016 という数値はバブルソート固有の事実ではなく、アルゴリズムの一群全体に対する下限(フロア)である。隣接する 要素の交換のみに制限された任意のアルゴリズム — 挿入ソート、カクテルソート、ノームソート、あるいはまだ誰も書いていないアルゴリズム — は、ステップ2より1回の交換につき最大1つの転倒しか解消できない。そのため、それらすべてがこの入力に対して少なくとも 2,016 回の交換を必要とし、不器用だからではなく機能するモデルの制約によって、逆順のデータに対してすべて Ω(n²) となる。クイックソートは、一度に要素を 63 個分移動させることが 許可されている ため、その下限を回避できる。32 回の実際の交換によって 2,016 個の転倒が解消されるのは、1回の交換あたり 63 個の転倒解消であり、ステップ5によれば、これはその距離における単一の交換が達成し得る最大値である。パネルは転倒数も、それが意味する下限も計算していない。
-
学習の道すじ
秒ではなく仕事量を数える
参考文献 (1)
- Insight block 3 — quicksort as its author published it: C. A. R. Hoare, "Quicksort." The Computer Journal 5(1), 10–16, 1962. The algorithm first appeared the year before as C. A. R. Hoare, "Algorithm 64: Quicksort", Communications of the ACM 4(7), 321, 1961.