いいえ、実行経過時間はプラットフォームごとに異なるため、効率を測定するための標準ではありません。「アルゴリズムが 10 秒で実行された」と言っても、アルゴリズム自体に関する情報はほとんどまたはまったく得られません。それに加えて、環境仕様全体と同時に実行されている他のプロセスを一覧表示する必要があり、非常に面倒です。したがって、順序表記 (Big Oh、Little Oh、Omega など) が開発されました。
効率は通常、次の 2 つのサブセクションに分かれています。
- 時間効率。
- スペース効率。
... 1 つのアルゴリズムは非常に時間効率が良いかもしれませんが、空間的には非常に非効率的です。その逆が適用されます。アルゴリズムは、特定の入力に対して実行する必要がある命令の量をスケーリングする際の漸近的な動作に基づいて分析されますn
。これは、PhD コンピューター科学者によって細心の注意を払って研究されている分野に関する非常に高レベルの説明です。ここで詳細を読むことをお勧めします。
Big Oh表記のリンクを添付していることに注意してください.姉妹表記はすべてそのWikipediaページから見つけることができ、通常はそこから始めるのが良いでしょう. 空間効率や時間効率の違いにも出てきます。
Big Oh を使用した時間効率の小さな応用:
Racket で次の再帰関数を考えてみましょう (私が知っていれば Python にあるでしょう -- 私ができる最高の疑似コードです):
(define (fn_a input_a)
(cond
[(empty? input_a) empty]
[(empty? (rest input_a)) input_a]
[(> (first input_a) (fn_a (rest input_a))) (cons (first input_a) empty)]
[else (fn_a (rest input_a))]))
empty?
... 、rest
、>
およびfirst
はすべて O(1)であることがわかります。また、最悪の場合、 のfn_a
の 3 番目の条件と 4 番目の条件で がrest
呼び出されることにも注意してinput_a
ください。次に、再帰関係を T(n) = O(1) + 2T(n - 1) と書くことができます。これを再帰関係チャートで調べるとfn_a
、最悪の場合、2 つの再帰呼び出しが行われるため、O(2^n) の順序であることがわかります。
fn_a
また、Big Oh の正式な定義により、それが O(3^n)であると述べるのも正しい (しかし役に立たない) ことに注意することも重要です。分析時の多くのアルゴリズムは Big Oh を使用して記述されていますが、Big Theta を使用して範囲を狭める方が適切です。つまり、特定のアルゴリズムに関して最も低く、最も正確な次数を意味します。
注意して、正式な定義を読んでください!