時間計算量に関して
おおざっぱに言うと、n の増大に対して計算量がどの割合で膨張するのかを示すもの。
計算式の中では一番強いものに引っ張られる。
↓は代表的なもの
名前 | 早さ | 概要 | 数式 | 例 |
factorial time | slower | nのn乗に比例した時間を費やす | 巡回セールスマン問題の総当たりによる解法 | |
指数関数時間 | slow | 定数のn乗に比例した時間を費やす | ルービックキューブの総当たりによる解法 | |
多項式時間 | fast | nの定数乗に比例した時間を費す | 比較ソート (バブル、挿入、選択ソート) | |
linearithmic time | faster | 多項式時間と線形時間の中間の時間を費す | 線形対数ソート*1 (クイックソート、ヒープソート、マージソート) | |
線形時間 | even faster | Nに直接比例した時間を費やす | 配列走査 | |
対数時間 | much faster | Nの対数に比例した時間を費やす | 2分探索 | |
定数時間 | fastest | 入力がどんなに大きくても固定の時間を費やす | インデックスによる配列要素へのアクセス |
参考:Time Complexity [C++ Reference] -- http://www.cppreference.com/wiki/complexity
たとえば、
という式があったとする。
n=1では500が圧倒的に大きい。
しかし、n = 1000 を代入すると、
*2
*3
と天文学的な数字の上のほうと比べて下のほうは誤差といってもいい程度に見える。
下三つはまだ、そんなに差が出ていない。が、
これらも
n=100000000000000000000000000000000000000000000000000000000000000000
くらいを代入すれば差が開く。