プログラミング作法 第2章 アルゴリズムとデータ構造 2.5 O記法
アルゴリズムの実行時間と領域の必要量を、プログラミング言語やコンパイラ、マシンアーキテクチャ、プロセッサ速度、システム負荷その他の複雑なファクタから切り離して比較したいからだ。
そのために「O記法(O-notation)」という標準記法が存在する。これの基本パラメータは具体的な問題のサイズを表すnであり、計算量(complexity)つまり実行時間はnの関数として表現される。「二分探索はO(logn)である、すなわち項目数nの配列を探索するのにlognオーダーのステップが必要になる」というように、"O"はオーダー(order)を表す。O(f(n))という表記は、nが十分に大きければ、たとえばO(n^2)あるいはO(nlogn)のように、実行時間は最大でf(n)に比例するという意味になる。
もっとも重要なケースを次に挙げておこう
記法 名称 例 ----------- ------- ---------------- O(1) 定数 配列インデックス O(logn) 対数 二分探索 O(n) 1次 文字列比較 O(nlogn) nlogn クイックソート O(n^2) 2次 単純なソート手法 O(n^3) 3次 行列乗算 O(2^n) 指数 集合分割問題
問題2−3
クイックソートが最悪の振る舞いを見せる場合は、ピボット値を常に最大(最小)値を選び続けた場合が想定できる。動作の測定を行うプロセスを自動化するプロセスは、Cならばqsortの比較関数が呼びされた回数をカウントできるようにすれば良いと思う。開発環境がインストールできたならば試してみよう。これは宿題。
問題2−4
低速なソートといえばバブルソートが思いつく。これも計算量の測定をしようと思うなら、比較して値をいれかえる関数をカウントできるようにすれば良いと思う。これも宿題にしておく。