[プロ技]オーダー記法の考え方(教材)

woody_1227 オーナー 公式アカウント

質問が多かったので載せておきます。
ログインすると、チェック機能を利用できるようになります。
オーダーは、データの入力によって、アルゴリズムの計算量がどのように変化するかを表現する方法。
そのため、アルゴリズムの計算量を大体で表す。
(データを十分に大きくしたとき、影響が十分に小さい項を除外してもいい。
※この言葉は理解しなくても、大丈夫です。下の説明を読んでみてください。)

例えば、\(n > m\) のときを考える。

足し算(引き算)のときは、値が大きい方のみを採用する。
\(O(n)+O(m) = O(n)\)
\(O(n)-O(m) = O(n)\)

掛け算(割り算)のときは、どちらも採用する。
\(O(n) \times O(m) = O(n \times m)\)
\(O(n) \div O(m) = O(\frac{n}{m})\)

上に書いたように、プログラムの計算量がデータによって、どのように変化するかを大まかに表すことができればよいので、基本的には、代入式などではなく、繰り返し文のことを考える。
(数学関数などもオーダーで表されることはある。)

もう少し具体的な例は、次の通り。
for (int i = 0; i < n; i++)
↑\(O(n)\)
for (int i = 10; i < n; i++)
↑\(O(n)\)
for (int i = 0; i < n / 2; i++)
↑\(O(\frac{n}{2})\)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
}
}
↑\(O(n \times n) = O(n^{2})\)

※実際には、\(O(n \times m)\)は、\(O(n \cdot m)\)や\(O(nm)\)と表記することもあります。(表記揺れの範囲内なので、気にしなくて大丈夫です)