回答:
漸近表記が定数因子を無視する方法を合理化するために、私は通常このように考えます:漸近複雑度は異なるアルゴリズムのパフォーマンスを比較するためではなく、個々のアルゴリズムのパフォーマンスが入力サイズに対してどのようにスケーリングするかを理解するためです。
たとえば、ステップをとる関数はであると言います。大まかに言えば、十分に大きい入力の場合、入力サイズを2倍にするとステップの数が2倍になります。同様に、は、入力サイズを2倍にすると、最大でステップ数が4倍になることを意味し、は入力サイズを2倍にするとステップ数が最大で一定数増加することを意味します。
これは、どのアルゴリズムがより高速であるかではなく、どのアルゴリズムのスケーリングが優れているかを示すためのツールです。
まず、他の回答として、既に説明した、、または言葉でそれを置くために、関数はO (3 N )であれば、それがある場合にのみ、O (N )。F = O (3 N )が存在することを意味する点Nと係数C 3、その結果、すべてのためのN ≥ N、F (N )≤ C 3 ⋅ 3。今ピック C 1 = 3 C 3:すべてのための N ≥ N、 F (N )≤ C 1 ⋅ Nので、 F = O (N )。逆の証明も同様です。
次に、これが適切なツールである理由について説明します。アルゴリズムの複雑さを測定するとき、単位を与えないことに注意してください。秒や機械命令はカウントしません。それぞれが制限時間を要する不特定の基本ステップをカウントします。同じアルゴリズムを別のマシンで実行すると、命令ごとに必要な時間が変わるため、クロック周波数にを掛けると、実行時間がf (n )からf (n )/ 3になります。。同じアルゴリズムを別の言語または別のシステムに実装する場合、各基本ステップにかかる時間は異なる場合がありますが、これも非常に詳細です。そのような違いはほとんど気にしません。
正確なタイミングを気にする場合、漸近的な複雑さは関係ありません:漸近的な複雑さは、非常に大きな入力サイズに対して何が起こるかを示します。これは、実際の入力サイズとは異なる場合があります。
o(g)
右措置として、つまりは、持っているは、ランタイムを記述する方法として(必要に応じて支配的な基本操作の観点からは、OPを煩わせる定数因子を含めて)1です。
Big-Oの定義を思い出してください。
が存在するときに限り、C > 0ように F (N )≤ C G (N )すべてについて、nは。
この定義の下で、我々はその持っているすべての定数のdは。O表記の目的は、まさにこの方法で式を単純化することです。実際、3 nが速いほどの3倍に成長nは、彼らは両方とも線形です。これが正当化されるかどうか-それはコンテキストに依存します。しかし、O表記を使用することに同意する場合、定義によりこれが保持されます。
簡単に言う と、Big O表記は、単位を使用しない相対測定です(絶対測定とは対照的です)。絶対的なパフォーマンスではなく、パフォーマンスの変動のみを測定できます。定数は重要です。利点は、これらのコストに正の固定された上限と下限がある限り、基本操作の相対コストを無視できる単純な分析を可能にすることにより、これが実装に大きく依存しないことです。しかし、その結果、一定の要因は無意味になります。それでも、意図した目的であっても、漸近的複雑性分析は他の理由で疑問視される可能性があり、慎重に検討する必要があります。たとえば、生の入力サイズは考慮すべき適切なパラメータではない場合があります。
最初の発言は、あなたの質問がまったく正確に述べられていないということです。あなたは、一定怠ったときで3 nは、「3倍の変化は、」確かにありますが、両方を同じ割合で変動し、あなたがすることができませんアサート「[1]のものがより迅速に、他の3倍を変化させている」という。
Landau表記の定数を無視する正当な理由は、信頼できる単位がないことです。AがBの2倍離れた場所に住んでいると誰かが述べた場合、これはユニットとは無関係に意味を持ちます。私が光年でそれをしている間、あなたがインチで距離を測定しても、我々はそれに同意することができます。ただし、絶対距離測定では単位を指定する必要があり、その数値式は選択した単位に依存します。
アルゴリズムにかかる実際の時間は、基本操作の実行時間に依存しますが、これは非常にマシンに依存しています。基本的な操作の数を数えることはできますが、それらがすべて同じ時間を要すると考える理由はありません。参照仮想マシンに同意しない限り、操作の意味は実際には意味がありません。参照に依存しないことは利点です。
このアプローチの利点の別の見方は、コストに上限と正の下限がある限り、分析で重要なのは基本操作の数を数えることだけです。個々の費用を心配する必要はありません。
しかし、その利点に支払う代価は、計算コストの評価が不特定の単位で与えられることであり、計算時間は、例えば、ナノ秒またはミレニアです-私たちは知りません。言い換えると、定数の変更は定数の変更と不可分であり、参照単位は使用されないため、定数の係数は無意味です。
Patrick87によって述べ、これは入力サイズに対してどのアルゴリズムスケールを理解するのに十分であり、それは、基準ユニットに依存するのショートを性能の絶対的尺度を与えることはありません。共通の参照抽象マシンのアンシングは、個別のアルゴリズムのパフォーマンスを実際に比較したいときに実行できますが、実現の詳細によって比較が偏らないようにすることは困難です。漸近的な複雑さでは、アルゴリズムをそれ自体と比較するため、このリスクは回避されます。
とにかく、素朴なプログラマーだけがアルゴリズムを選択するために漸近的な複雑さに専ら依存するでしょう。未定の定数や基本操作の実際のコストなど、他の多くの基準があります。さらに、最悪のケースの複雑さは、最悪のケースの複雑さの原因がめったに発生せず、入力のフラグメントに影響が制限されるほど小さいため、不十分な指標になる可能性があります。たとえば、ツリー隣接文法の一般的なパーサーは理論的な複雑さを持ち、実際には非常に有用です。私が知っている最悪のケースは、 Damas-Hindley-Milnerポリモーフィック型推論ですMLに使用されるアルゴリズム。指数関数的な最悪の場合の複雑さを持ちます。しかし、それはMLユーザーを悩ませたり、MLで非常に大きなプログラムの作成を妨げたりするようには見えません。重要な定数以上のものがあります。実際、漸近解析は、計算のコストの測定値を入力の複雑さの測定値に関連付けます。ただし、未加工のサイズは適切な尺度ではない場合があります。
複雑さは決定可能性のようなものであり、理論的には悪いかもしれませんが、ほとんどのデータスペースにとっては無関係かもしれません...時には。漸近的複雑度分析は、すべてのツールと同様に、その利点と制限を備えた、優れた適切に設計されたツールです。無意味な定数を明示するかどうかにかかわらず、判断を使用する必要があります。
簡単に説明させてください。n = 100000としましょう。3nとは何ですか?それは300000です(ええ、nの3倍です)しかし、n ^ 2とは何ですか?10000000000。(nの1千倍です).. n ^ 2とnを比較します。1 lakhと比較すると、3は無視できます。そのため、削除できます。
nが数十億または数兆かどうかを考えます。この場合も、3を数十億または数兆と比較します。これで、3を無視できる理由がわかりました。