Big-O-Notationの通常のランタイムのバリエーションはありますか?


9

やなど、複数の表記があります。やなど、実際にそれらのバリエーションがあるのか​​、それとも数学的に正しくないのかと思いました。OO(n)O(n2)O(2n2)O(logn2)

それとも、をに改善できると言うのは正しいことでしょうか?私はまだランタイムを理解することはできませんし、必要もありませんし、何も改善する必要はありませんが、これが実際の関数の記述方法かどうかを知る必要があります。O(5n2)O(3n2)


1
漸近分析中、O(5n ^ 2)とO(3n ^ 2)の間に大きな違いはありません。どちらもO(n ^ 2)であり、定数のみが異なります。実際、証明では、O(5n ^ 2)をO(3n ^ 2)またはO(n ^ 2)に削減して、同等であるため、数学をより簡潔にすることができます。証明を書くときは、サイドバーに同等であることをメモします。実際、O(log n)をO(n)と交換して、サイドバーのO(log n)<= O(n)に注意することもできます。サイドバーのメモは、それが意図的なものであり、タイプミスではないことを読者に伝えます。(少なくとも、私が大学でアルゴリズム分析を受けたときのやり方です)。
jww

2
表記を使用して小さな要因を取り除く場合は、「...のようなものをいつでも記述できます。実行時間がから改善されます。 "など。または、同等に、および。前者の省略形としてと書くことを好む作者もいます。たとえば、TrefethenとBauによる教科書を参照してください。5 N 2 + O N 23 N 2 + O N 2)、 5 + O 1 、N 23 + O 1 nは25 N 2O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n25n2
ヨナタンN

回答:


21

やなど、実際にそれらのバリエーションがあるのか​​、それとも数学的に正しくないのかと思いました。O(2n2)O(log(n2))

はい、O(2n2)またはO(log(n2))は有効なバリエーションです。

ただし、特に最終結果では、まったく表示される場合はほとんど表示されません。その理由は、O(2n2) O(n2)です。同様に、O(log(n2)) O(logn)です。初心者には意外かもしれません。ただし、これらの等式が多かれ少なかれ、大きなO表記法が導入されたまさにその理由であり、ピン留めが困難で比較的重要ではないことが多い乗法定数係数を隠すためです。

O(5n2)O(3n2)に改善することが可能であると言うのは正しいことでしょうか?

アルゴリズムの時間複雑さから変更された場合、それは全く改善しないでO(5n2)O(3n2)またはからΩ(5n2)Ω(3n2)から、O(5n2)O(3n2)Ω(5n2)Ω(3n2)。したがって、時間の複雑性がO(5n2)からO(3n2)改善されたと言うのは誤りです。もちろん、アルゴリズムの時間の複雑さは5n2から3n2に改善されていると言って間違いありません。


運動1.示すことO(5n2)=O(3n2)=O(n2)

運動2.示すことO(logn)=O(log(n2))

運動3.示すことΩ(n2+n)=Ω(n2)


1
@bv_Martnは、ここでの表記のかを理解するには良いリンクの次のように定義されます(単純な限界微積分!)math.stackexchange.com/questions/925053/...O(n)
Akshatマハジャン

2
2つのアルゴリズムは同じ複雑さのクラスですが、一方が厳密にもう一方よりも速いという点を誰かが指摘したい場合は、big-O表記で一定の要素を見たときだけです。
マーク

7
@AkshatMahajan その質問の唯一の答え/math/925053は明らかに間違っています。大きな表記には信頼できる情報源がたくさんあります。O
John L.

1
「アルゴリズムの時間の複雑性が5n ^ 2から3n ^ 2に改善されたと言っても間違いありません」正確な実行時間は、多くの場合、入力サイズと値によって異なります。また、これには、すべての演算の重み付け/ 1つの演算に焦点を当てることが含まれます。これは、現実の世界で得られる一定の要因についてあまり言及しない場合や、異なる重みを使用する他のアルゴリズムと比較できない場合があります。そのため、いくつかの有効な使用例があるかもしれませんが、上記のようなことを言うことは限られた有用性です(それがおそらくほとんど見られない理由です)。
デュケリング

1
@マーク:それは単に間違っています。
user21820

13

この表記法を使用しないことは常に自由です。つまり、関数f(n)をできるだけ正確に決定し、それを改善することができます。たとえば、f(n)比較を行う並べ替えアルゴリズムがあり、g(n)比較のみを行う別の並べ替えアルゴリズムを考え出すことができます。もちろん、あらゆる種類の関数f(n)が(理論的には)存在し、(実際には)発生する可能性もあります。

Big Ohの表記を神秘的な魔法として扱うのではなく、魔法使いに相談して何かできるかどうかを尋ねる代わりに、その定義確認する必要があります。定義を尊重し、仕事を完了するために必要なことをすべて実行します。


実はまだ必要ありません。または理論的には、実際には、Wikipediaから与えられた定義O(1)-O(n!)が存在する唯一の定義であるかどうか、または実際にOなどのように異なる場合に異なる方法で説明できるかどうかを知る必要があります。 (7N)。私の恐れは、私がそれを使用すると、数学の教授が彼の翼を
失うことです

1
O(1)O(n!)

6
@bv_Martn のリストを定義のリストとして表示しているため、数学の教授が裏返る可能性がはるかに高くなります。数学のポイントの多くは、特定の場合だけでなく、一般的に機能するように定義することです。あなたの質問は基本的に「ウィキペディアでは1つ追加して2つ追加して17つ追加できると言っていますが、他の数字も追加できますか?」のより高度なバージョンです。
David Richerby

7

O(n)=O(2n)

Big-O表記はスケーラビリティを説明します

基本的に、Big-O表記は、アルゴリズムの実行にかかる時間の記述ではありません。また、アルゴリズムが行うステップ数、コード行、または比較の説明でもありません。これは、アルゴリズムが入力数に応じてスケーリングする方法を説明するために使用される場合に最も役立ちます。

O(logn)。対数は2を底としていますが、それは問題ではありません。関係の中心は、リストに定数値を乗算すると、時間に定数値が追加されるだけです。

nnO(n)O(2n)O(n)

これらの回答の多くは、基本的にBig-Oの定義を読んで自分でこの結論に到達するように指示していることに感謝します。しかし、この直感的な理解のために頭を一周するのにかなり時間がかかりました。そのため、できるだけわかりやすく説明しました。


5
O(n)

3
@Juho有益かもしれませんが、コンピュータ科学者の大多数にとっては最終的には役に立たないでしょう。
散布

4
これで私は同意しないでください。自分をコンピュータサイエンティストとして分類することは、ある表記法が何を使用するのか、つまりすべての数学をスキップすることを理解しないことの言い訳にはなりません。
Juho

3
うん。プログラマーがこのことを理解していないことには異論はありませんが、自分をコンピュータサイエンティストと呼びたい場合は、これがコアマテリアルです。
David Richerby

2
@dkaeaeいいえ、私はソフトウェア開発者など、この分野で他のキャリアを積んでいる人々を指しています。
散布

5

O(f)fg(n)=O(f(n))cg(n)cf(n)nf

g(n)=O(f(n))g(n)=O(2f(n))g(n)cf(n)ng(n)c22f(n)g(n)=O(2f(n))c/2

logn2log(n2)2logn

O


4

O(f(n))の定義を見ると、たとえばO(2n ^ 2)とO(n ^ 2)はまったく同じであることがわかります。アルゴリズムを5n ^ 2演算から3n ^ 2演算に変更すると、40%改善されます。O(5n ^ 2)からO(3n ^ 2)への変更は、実際には変更ではなく、同じです。

もう一度、O(f(n))の定義を読みます。


4

O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

=

O(n)=O(2n)


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