Big Oで定数因子を無視する理由


20

多くの場合、複雑性に3nなどの定数がある場合、この定数を無視し、O(3n)ではなくO(n)と言います。このような3倍の変化をどうすれば無視できるのか理解できません。あるものは他のものよりも3倍速く変化しています!なぜこの事実を無視するのですか?


「缶」のセマンティクスは重要です。実際には、通常、このような変更を無視することはできませんが、それ(つまり、実世界でのアルゴリズムのパフォーマンスの記述)は、Landau表記法の目的ではありません。より正確な形式存在します。
ラファエル

回答:


22

漸近表記が定数因子を無視する方法を合理化するために、私は通常このように考えます:漸近複雑度は異なるアルゴリズムのパフォーマンスを比較するためではなく、個々のアルゴリズムのパフォーマンスが入力サイズに対してどのようにスケーリングするかを理解するためです。

たとえば、3nステップをとる関数はO(n)であると言います。大まかに言えば、十分に大きい入力の場合、入力サイズを2倍にするとステップの数が2倍になります。同様に、O(n2)は、入力サイズを2倍にすると、最大でステップ数が4倍になることを意味し、O(logn)は入力サイズを2倍にするとステップ数が最大で一定数増加することを意味します。

これは、どのアルゴリズムがより高速であるかではなく、どのアルゴリズムのスケーリングが優れているかを示すためのツールです。


11

まず、他の回答として、既に説明した、、または言葉でそれを置くために、関数はO 3 N であれば、それがある場合にのみ、O N F = O 3 N が存在することを意味する点Nと係数C 3、その結果、すべてのためのN NF N C 33O(3n)=O(n)O(3n)O(n)f=O(3n)NC3nN。今ピック C 1 = 3 C 3:すべてのための N N F N C 1Nので、 F = O N 。逆の証明も同様です。f(n)C33nC1=3C3nNf(n)C1nf=O(n)

次に、これが適切なツールである理由について説明します。アルゴリズムの複雑さを測定するとき、単位を与えないことに注意してください。秒や機械命令はカウントしません。それぞれが制限時間を要する不特定の基本ステップをカウントします。同じアルゴリズムを別のマシンで実行すると、命令ごとに必要な時間が変わるため、クロック周波数にを掛けると、実行時間がf n からf n / 3になります。3f(n)f(n)/3。同じアルゴリズムを別の言語または別のシステムに実装する場合、各基本ステップにかかる時間は異なる場合がありますが、これも非常に詳細です。そのような違いはほとんど気にしません。

正確なタイミングを気にする場合、漸近的な複雑さは関係ありません:漸近的な複雑さは、非常に大きな入力サイズに対して何が起こるかを示します。これは、実際の入力サイズとは異なる場合があります。


また、注目すべき彼の中Sedgewickことを「アルゴリズムの分析への入門」使用して擁護o(g)右措置として、つまりは、持っているは、ランタイムを記述する方法として(必要に応じて支配的な基本操作の観点からは、OPを煩わせる定数因子を含めて)1です。limng(n)T(n)=1
フォンブランド

2
@vonbrand Sedgewickは本当にそう言っているのですか?通常の定義すなわち、LIM N T N / G N = 0(すなわち、画分の他の方法の周り及び制限がゼロではありません統一)。T(n)o(g(n)limn(T(n)/g(n))=0
デビッド・Richerby

3

Big-Oの定義を思い出してください。

が存在するときに限り、C > 0ように F N C G N すべてについて、nはf(n)O(g(n))c>0f(n)cg(n)n

この定義の下で、我々はその持っているすべての定数のdはO表記の目的は、まさにこの方法で式を単純化することです。実際、3 nが速いほどの3倍に成長nは、彼らは両方とも線形です。これが正当化されるかどうか-それはコンテキストに依存します。しかし、O表記を使用することに同意する場合、定義によりこれが保持されます。dnO(n)dO3nnO


2
これはBig-Oの優れた説明を提供しますが、この定義を使用する理由に関する説明はありません。
jmite

私が書いたように-目的は私たちの生活を簡素化することです。アトミック操作の正確なコストがわからないため、または漸近記法が重要なためです。なぜ数学的な興味深い問題ではなく、哲学的な問題だと思います。技術的には、それなしでも可能です。物事が本当にreallyくなり、作業が難しくなります。
シャール

3

Big O表記は、パフォーマンスの変動を測定する単位のない平均であるため、計算プリミティブの相対的なコストの影響を受けません。

簡単に言う と、Big O表記は、単位を使用しない相対測定です(絶対測定とは対照的です)。絶対的なパフォーマンスではなく、パフォーマンスの変動のみを測定できます。定数は重要です。利点は、これらのコストに正の固定された上限と下限がある限り、基本操作の相対コストを無視できる単純な分析を可能にすることにより、これが実装に大きく依存しないことです。しかし、その結果、一定の要因は無意味になります。それでも、意図した目的であっても、漸近的複雑性分析は他の理由疑問視される可能性があり、慎重に検討する必要があります。たとえば、生の入力サイズは考慮すべき適切なパラメータではない場合があります。

最初の発言は、あなたの質問がまったく正確に述べられていないということです。あなたは、一定怠ったとき3 nは、「3倍の変化は、」確かにありますが、両方を同じ割合で変動し、あなたがすることができませんアサート「[1]のものがより迅速に、他の3倍を変化させている」という。33n

Landau表記の定数を無視する正当な理由は、信頼できる単位がないことです。AがBの2倍離れた場所に住んでいると誰かが述べた場合、これはユニットとは無関係に意味を持ちます。私が光年でそれをしている間、あなたがインチで距離を測定しても、我々はそれに同意することができます。ただし、絶対距離測定では単位を指定する必要があり、その数値式は選択した単位に依存します。

アルゴリズムにかかる実際の時間は、基本操作の実行時間に依存しますが、これは非常にマシンに依存しています。基本的な操作の数を数えることはできますが、それらがすべて同じ時間を要すると考える理由はありません。参照仮想マシンに同意しない限り、操作の意味は実際には意味がありません。参照に依存しないことは利点です。

このアプローチの利点の別の見方は、コストに上限と正の下限がある限り、分析で重要なのは基本操作の数を数えることだけです。個々の費用を心配する必要はありません。

しかし、その利点に支払う代価は、計算コストの評価が不特定の単位で与えられることであり、計算時間は、例えば、ナノ秒またはミレニアです-私たちは知りません。言い換えると、定数の変更は定数の変更と不可分であり、参照単位は使用されないため、定数の係数は無意味です。

Patrick87によって述べ、これは入力サイズに対してどのアルゴリズムスケールを理解するのに十分であり、それは、基準ユニットに依存するのショートを性能の絶対的尺度を与えることはありません。共通の参照抽象マシンのアンシングは、個別のアルゴリズムのパフォーマンスを実際に比較したいときに実行できますが、実現の詳細によって比較が偏らないようにすることは困難です。漸近的な複雑さでは、アルゴリズムをそれ自体と比較するため、このリスクは回避されます。

とにかく、素朴なプログラマーだけがアルゴリズムを選択するために漸近的な複雑さに専ら依存するでしょう。未定の定数や基本操作の実際のコストなど、他の多くの基準があります。さらに、最悪のケースの複雑さは、最悪のケースの複雑さの原因がめったに発生せず、入力のフラグメントに影響が制限されるほど小さいため、不十分な指標になる可能性があります。たとえば、ツリー隣接文法の一般的なパーサーは理論的な複雑さを持ち、実際には非常に有用です。私が知っている最悪のケースは、 Damas-Hindley-Milnerポリモーフィック型推論ですO(n6)MLに使用されるアルゴリズム。指数関数的な最悪の場合の複雑さを持ちます。しかし、それはMLユーザーを悩ませたり、MLで非常に大きなプログラムの作成を妨げたりするようには見えません。重要な定数以上のものがあります。実際、漸近解析は、計算のコストの測定値を入力の複雑さの測定値に関連付けます。ただし、未加工のサイズは適切な尺度ではない場合があります。

複雑さは決定可能性のようなものであり、理論的には悪いかもしれませんが、ほとんどのデータスペースにとっては無関係かもしれません...時には。漸近的複雑度分析は、すべてのツールと同様に、その利点と制限を備えた、優れた適切に設計されたツールです。無意味な定数を明示するかどうかにかかわらず、判断を使用する必要があります。


2

On=O3n

n3n

これは、アルゴリズムの速度を推測するのに非常に役立ちます。それ以外の場合は、非常に理解しにくい大規模な区分的関数を調べる必要があります。

もう1つの主な理由は、これらの測定がハードウェアに依存しないようにするためです。異なるコンパイラとアーキテクチャは、同じコードを非常に異なる命令セットに変更します。ただし、命令の数が線形、指数などであることがわかっている場合は、コンパイルまたは実行する実際のコンピューターに関係なく、保持するアルゴリズムの速度がわかります。


1

fn=Ognリムサップnfngn<+

gn=ngn=3n

On2=O.00005321n2+1000000000n+1046803f=


2
=O

fOgfOnn2fバツ=hバツバツバツ=n=符号に含まれます。
yo

私は通常検討します fn ちょうど明示的であるように f1つの引数の関数であること。
ジャン・ヒューデック

表記法の乱用であることも知っているので、私も通常はそうしています;)
yo

-1

簡単に説明させてください。n = 100000としましょう。3nとは何ですか?それは300000です(ええ、nの3倍です)しかし、n ^ 2とは何ですか?10000000000。(nの1千倍です).. n ^ 2とnを比較します。1 lakhと比較すると、3は無視できます。そのため、削除できます。

nが数十億または数兆かどうかを考えます。この場合も、3を数十億または数兆と比較します。これで、3を無視できる理由がわかりました


2
3年はまだ1年より長い時間です。
ユヴァルフィルマス

これが有用な方法で質問にどのように答えるかはわかりません。確かに、既存の長年の回答に何も追加しません。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.