Big Oh表記は定数値に言及していません


12

私はプログラマーであり、アルゴリズムを読み始めたばかりです。表記法、つまり、Bog Oh、Big Omega、およびBig Thetaに完全には納得していません。その理由は、Big Ohの定義によるもので、関数f(x)が常にf(x)以上になるように関数g(x)が存在する必要があることを示しています。または、n> n0のすべての値に対してf(x)<= cn。

定義に定数値を記載しないのはなぜですか?たとえば、関数6n + 4の場合、O(n)と表記します。しかし、定義がすべての定数値に当てはまることは事実ではありません。これは、c> = 10およびn> = 1の場合にのみ有効です。cの値が6よりも小さい場合、n0の値は増加します。では、なぜ定義の一部として定数値に言及しないのでしょうか?


4
定数値を正確に表現することをどのように提案しますか?
ダニエルB

1
さらに一歩進んで、nをバインドした場合、終了関数はO(1)になります。
ブライアン

回答:


22

O(n)およびその他の順序表記は、(通常)小さな値に対する関数の動作に関係しません。これは、非常に大きな値に対する関数の動作、つまりnが無限に向かって移動するときの制限に関係しています。

定数は技術的には重要ですが、通常、nが十分に大きくなると抽象化されます。cの値はまったく無関係です。cの値が重要な場合、分析に含めることができますが、比較される関数に非常に大きな定数係数がない場合、または効率が特に重要な関心事である場合を除き、通常はそうではありません。


3
たとえば、ピラミッドの構築はO(n)であり、それらの写真の並べ替えはO(n log n)です。ある時点で、新しいピラミッドを構築するよりも、画像を並べ替えるのに時間がかかる十分なピラミッドがあります。しかし、非常に多数のピラミッドに対してのみです!
マーティンベケット

良い答えですが、与えられたNと、通常は同じ「ファミリー」の複雑さに分類される2つのアルゴリズムに対して、OPが示唆することを正確に実行し、少なくとも相対係数を含めることにはメリットがあります。要素ごとの命令数が別の2倍の線形アルゴリズムは、2番目のalgの* O *(N)に対して* O *(2N)と呼ばれ、相対的な差異を示します。どのNでも、最初のアルゴリズムは常に2倍になるためです。秒の実行時間; ただし、* O *(NlogN)などの複雑さの異なるファミリーの関数と比較する場合、係数は重要ではありません。
キース

22

いくつかの理由がありますが、おそらく最も重要な理由は、定数がアルゴリズム自体ではなく、アルゴリズムの実装の関数であることです。アルゴリズムの順序は、実装に関係なくアルゴリズムを比較するのに役立ちます。

クイックソートの実際の実行時間は、CまたはPythonまたはScalaまたはPostscriptで実装されている場合、通常変更されます。同じことがバブルソートにも当てはまります。ランタイムは実装によって大きく異なります。

ただし、データセットが大きくなると、バブルソートの実行に必要な時間は、通常の場合のクイックソートの実行に必要な時間より速くなります。合理的に正しい実装を想定して実装されています。この単純な事実により、具体的な詳細が得られない場合にアルゴリズム自体についてインテリジェントな推論を行うことができます。

アルゴリズムの順序は、実際の実世界の測定では重要ですが、要約でアルゴリズムを比較するときにノイズになる傾向がある要因を除外します。


9

定義による Big O表記法は次のように述べています。BigO表記法は、n 'の右およびnのすべての値nに対して、f(n)の値がcg(n)以下であるという直感に基づいています。 また、定数は単なる値であり、それらの係数と同じくらい大きくなる可能性のある変動量ではないため、高値(可変)係数(n平方またはnキューブなど)に行くときも定数は重要ではありません。 以下にBig-O表記のグラフを示します。
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




ここに画像の説明を入力してください

この表記の本質は、事実「how lower is f(n) from c.g(n) and not when it starts becoming lower」にあります。


その場合、すべてのO(n)はnのBig thetaでもあります。これは、ある定数の定義によると下限であり、ある定数では上限であるためです。たとえば、6n + 4も大きなシータ(n)です。これは、cが10未満の場合、常に下限であるためです。また、cが10を超える場合、上限になります。それで、与えられたBig Oh記法についてもBig thetaであると言えますか?
プラディープ

1
言い換えると、「ビッグシータはビッグオー」という意味です。Big -Ohは、漸近的にタイトな境界のBig-Thetaに置き換えることができます。
バイバブアガルワル

9

アルゴリズム分析では、Order of Growthが主要な抽象化であり、入力サイズの変化に応じて実行時間が変化する速度を示します。アルゴリズムに実行時間があるとしましょうf(n) = 2n + 3。次に、いくつかの入力サイズを接続します。

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

ご覧のとおり、成長の順序は主に変数によって決定されますn。定数2と3はそれほど重要ではなく、入力サイズが大きくなると、定数を決定する際にさらに重要ではなくなります。これが、アルゴリズム分析で定数が、関数の成長の順序を決定する変数に有利に収まる理由です。


1

(これはより長い答えなので、要約の太字を読んでください

あなたの例取り上げて、私たちがしていることの背後にある目的を理解しながら、ステップバイステップで見ていきましょう。私たちはあなたの機能とそのBig Oh表記を見つけることの目標から始めます。

f(n) = 6n+4

まず、聞かせてO(g(n))表記ビッグああも私たちが見つけようとしていますf(n)。ビッグああの定義から、我々は見つける必要が簡略化され g(n)、いくつかの定数が存在する場所cn0場所c*g(n) >= f(n)のすべてのために真であるnS」よりも大きいですn0

まず、選択してみましょうg(n) = 6n + 4O(6n+4)ビッグオハイオ州で得られる)。この場合、それはc = 1すべての値が常に等しいn0ため、Big Ohの定義からの数学的要件を満たします。g(n)f(n)

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

この時点で、数学的要件を満たしました。 我々が停止した場合O(6n+4)、これは何の書き込みよりも有用であることは明らかませんf(n)ので、アルゴリズムの一般的な時間の複雑さを理解する:それはビッグああ表記の真の目的を逃します! したがって、次のステップである単純化に進みましょう。

まず、我々はアウト簡素化することができます6nので、ビッグああですかO(4)?番号! (読者が理由を理解できない場合は、読者に運動をさせてください)

第二に、大王が4そうであるように単純化することができO(6n)ますか?はい! その場合、次のg(n) = 6nように:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

この時点で、のc = 2各増分について、左側が右側(6)よりも速く(12)増加するように選択しますn

2*6n      >=  6n + 4

ここn0で、上記の式がnその値よりも大きいすべてに対して真である場合、正の値を見つける必要があります。左側が右側よりも速く増加していることは既にわかっているので、必要なことは1つの正解を見つけることだけです。したがって、n0 = 2上記を真にするので、それはg(n)=6n、またはO(6n)の潜在的なBig Oh表記であることがわかりf(n)ます。

さて、Big Ohがそうであるように単純化できますか?はい!6O(n) その場合、次のg(n) = nように:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

c = 7左が右よりも速く増加するので、選んでみましょう。

7*n         >=  6n + 4

以上のすべてnの場合に上記が当てはまることがわかりn0 = 4ます。したがって、O(n)はの潜在的なBig Oh表記ですf(n)g(n)もう単純化できますか?いや!

最後に、最も単純なBig Oh表記であることがわかりましたf(n)O(n) なぜ私たちはこれらすべてを経験したのですか?ので、今私たちが知っていることは、f(n)直線的であることのビッグああ表記は、線形複雑であるため、O(n)。良いことは、時間の複雑さf(n)を他のアルゴリズムと比較できるようになったことです! たとえば、私たちは今、それが知っているf(n)機能に匹敵する時間が複雑でありh(n) = 123n + 72i(n) = nj(n) = .0002n + 1234、など。上記で説明したのと同じ単純化プロセスを使用すると、それらはすべて線形の時間複雑性を持つためO(n)です。

甘い!!!


こんにちは、良い説明。まだ少し疑問があります。1.変数値「n」があるため、O(4)として6n + 4を作成できません。これが答えですか?2.簡略化しながら、c = 7を選択し、それに応じてn0〜4を計算しました。c= 7で7以上を決定したのはなぜですか。cの値に基づいて、n0が変化するためです。
プラディープ

@Pradeep:1については、あなたは正しいです。より詳細な説明:を試してみるとO(4)、不等式が作成さc*4 >= 6n+4れ、選択したものcについては、n上記のすべての値が不等式を偽とする値を常に見つけることができます。
Briguy37

@Pradeep:2の場合、との実際の値は重要cn0はありません。重要なのはn0c私たちが選ぶために存在することです。これが真であるためには、不等式の左側がの大きな値に対して右側よりも速く増加する必要がありnます。 c=6これは良くない(6n >= 6n+4決して真実ではない)ので、私はを選んだc=7。私は同じように簡単に選んだ可能性がありc=10c=734あるいはc=6.0000001、まだいくつかがあったことを見ることができただろうn0ための不等式が真作るために存在していたことはn >= n0、我々がテストしているビッグああが有効であることを意味します。
Briguy37

明確な説明をありがとう。これはまさに私が探していたものです。もう一度ありがとう。
プラディープ

@Pradeep:喜んで助けてくれました:)
Briguy37

1

パフォーマンス関数がの6n + 4場合、関連する質問は「6 what?」です。1つのコメントが尋ねたように:あなたの定数は何を表していますか?物理学の用語では、定数因子の単位は何ですか?

O()表記法がアルゴリズムのパフォーマンスを説明するために非常に広く使用されている理由は、その質問に答えるための移植可能な方法がないためです。プロセッサが異なると、同じ基本計算を実行するのに異なるクロックサイクル数と異なる時間がかかります。または、関連する基本計算を異なる方法で一括処理する場合があります。異なるコンピューター言語、または疑似コードのような異なる公式および非公式の記述は、直接比較するのが難しい方法でアルゴリズムを表します。同じ言語の実装でさえ、同じアルゴリズムを異なる方法で表すことができます-行数のような些細な書式設定の詳細は別として、一般に、任意のアルゴリズムを実装するための多種多様な任意の構造上の選択肢があります。

別の方法で見てください。「アルゴリズム」を使用して、特定の実装を記述するのではなく、同じ一般的な手順の潜在的な実装のクラス全体を記述します。この抽象化は、実装の詳細を無視して一般的な価値のあるものを文書化することを支持し、一定のパフォーマンス要因はこれらの詳細の1つです。

とはいえ、アルゴリズムの説明には、実際のハードウェアでの実際の実装のパフォーマンスを説明する民間伝承、メモ、または実際のベンチマークさえ伴うことがよくあります。これにより、どのような定数要因が予想されるかについて大まかな考えが得られますが、実際のパフォーマンスは、特定の実装の最適化に費やされた作業量などに依存するため、一概には言えません。また、長期的には、最新の最高のプロセッサのアーキテクチャが変更されると、同等のアルゴリズムの相対的なパフォーマンスがドリフトする傾向があります...


0

Big-Oh表記の概念全体は、特に定数を無視し、アルゴリズムの実行時間を記述する関数の最も重要な部分を提示することです。

しばらくの間、正式な定義を忘れてください。どちらがより悪い(より速く成長している)の関数である、n^2 - 5000または5000 n + 60000?にとってn 5000の周り未満、線形関数が大きい(従って悪い)です。それ以上(正確な値5013?)、二次方程式は大きくなります。

5000よりも大きい(さらに多い)正の数が少ないよりも多いため、一般に2次関数を「より大きな」(より悪い)関数と見なします。順序表記(Big-Ohなど)はそれを強制します(これらの定義を使用して、加法定数と乗法定数をいつでも削除できます)。

もちろん、物事は必ずしも単純ではありません。時には、あなたはないこれらの定数を知りたいです。挿入ソートとバブルソートのどちらが優れていますか?両方ともO(n^2)。しかし、一方が他方よりも本当に優れています。より詳細な分析を行うと、疑問に思っているような定数を取得できます。通常、より正確な関数よりもBig-Oh関数を計算する方がはるかに簡単です。

Big-Ohはこれらの定数を無視して、最も重要な比較を簡素化し、簡単にします。通常、(ほとんど関係のない)定数について知りたくないので、表記法が好きです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.