2 ^ nとn * 2 ^ nは同じ時間の複雑さですか?


178

時間の複雑さについて私が見つけたリソースは、特に非多項式の例で、時間の複雑さの方程式の項を無視してもよいかについては不明です。

n 2 + n + 1の形式が与えられた場合、最後の2つの項は重要ではないことは明らかです。

具体的には、2つの分類2 nとn *(2 n)が与えられた場合、2 番目の分類は最初の分類と同じ順序ですか?追加のn乗算は重要ですか?通常、リソースは、x nが指数関数であり、はるかに速く成長するというだけです...次に進みます。

2 nnを大幅に上回らないので、なぜそうならないのか理解できますが、2つを加算していないため、2つの方程式を比較するときに非常に重要です。実際、それらの差は常にnの因数となります。控えめに言っても重要なようです。


8
私の意見では、NLogNはNよりも厳密に遅いと見なされますが、ほとんどの人はそれほど気にしないので、N2 ^ Nは2 ^ Nよりも遅いだけですが、「十分に遅い」とは言えません。気に..
ジャック

@tobias_k、私はこの点を理解していますが、O(n!)の例を検討してください。余分なn項は本当に異なるのでしょうか?O(n!)はO((n + 1)!)であるのと同じように、O(n!)はO(n * n!)です。伸びは同じですが…この場合、厳密に大きいのに伸びが違うのでしょうか?これは、複雑さが気にかける時間ではありませんか?
matty-d 2014

3
@JackWu ですが、nではなくnlognを使用して何億ものレコードを並べ替えるまで、ほとんどの人はそれほど気にしません :)
CB

4
実際、n! = o((n+1)!)つまり、漸近的に厳密に遅くなります。
chepner 2014

16
これは複雑さの理論とは何の関係もないことに注意してください。また、この種の質問は、コンピューターサイエンスのほうがよいでしょう。
Raphael

回答:


231

Oこの質問に答えるには、ビッグO()の正式な定義に移動する必要があります。

定義は、制限が存在する、つまり無限ではない場合にのみf(x)属します。定数が存在することをこの短い手段は、のような値を超えることはありません。O(g(x))limsupx → ∞ (f(x)/g(x))Mf(x)/g(x)M

ご質問の場合は、let and letしてください。その後、それはまだ無限に成長します。したがって、に属していません。f(n) = n ⋅ 2ng(n) = 2nf(n)/g(n)nf(n)O(g(n))


5
やや読みやすい定義については、こちらを
Alden

3
正式に言えば、あなたはの制限を受け入れることはできませんO(f(x)/g(x))。big-O通知は一連の関数の省略形であり、値を制限できる単一の関数ではありません。しかし、もし存在すればそれを示すことができるのは本当だと思いますf(x) = O(g(x))lim(x->infinity) f(x)/g(x)
chepner 2014

44
制限が存在する必要はありません。比率は、十分に大きいxの定数によって上で制限される必要があるだけです。たとえば、2 + sin(x)はO(1)にありますが、(2 + sin(x))/ 1はx-> infinityのように制限に近づきません。
user2357112は

2
の定義はではlim supなくで正しくなりますlim
David Eisenstat

11
@IvayloStrandjevの短い説明が正しくないことに注意してください。これxは、のすべての値ではなく、十分に大きい場合に当てはまる必要がありますx
K.Steff 2014

85

それn⋅2ⁿが大きいことをすばやく確認するには、変数を変更します。みましょうm = 2ⁿ。その後n⋅2ⁿ = ( log₂m )⋅m(の両側に2を底とする対数を取ってm = 2ⁿいますn = log₂m)、あなたは簡単にそれを示すことができるm log₂mよりも速く成長しますm


3
ありがとうございました!これは私の意見では最良の答えです。正式な定義に基づいた証明は正しいですが、ある種の障害を乗り越えなければならない場合は、非常に快適で使い慣れたアナロジーが最も効果的かつ迅速に機能します。
John P

1
愚かな質問、何lgですか?2を底とする対数?
Pierre Arlaud、2014

3
それは怠惰な略語です。コンピュータサイエンスでは、2を意味する傾向があります。これは、主に分割統治戦略から生じるためです。big-O表記では、xとyに関係なく、数値の底xの対数は定数yだけが底yの対数と異なるため、それは何でも表すことができます。
chepner 2014

3
振り返ってみるlgと、漸近的な実行時間について議論するときに最も一般的に使用される基本的な非依存的な使用法ではなく、10を底とする対数のISO表記法に注意する必要があります。en.wikipedia.org/wiki/Logarithm#Particular_basesを
chepner

わかりましたが、n 2 ^ nが2 ^ nより速く成長するというよりも、m log mがmより速く成長するほうが明白である理由はわかりません。
djechlin 2015年

10

それn⋅2ⁿはにはないことに同意しますがO(2ⁿ)、優れた使用法の制限が常に満たされるとは限らないため、より明確にする必要があると思いました。

:ビッグOの正式な定義によってf(n)であるO(g(n))定数が存在する場合c > 0n₀ ≥ 0、すべてのためになるようにn ≥ n₀、我々は持っていますf(n) ≤ c⋅g(n)。容易にそのような定数のために存在しないことを示すことができるf(n) = n⋅2ⁿg(n) = 2ⁿ。ただし、にあることを示すことg(n)ができますO(f(n))

言い換えれば、n⋅2ⁿはによって下限が定められてい2ⁿます。これは直感的です。これらは両方とも指数関数的であり、したがってほとんどの実際的な状況で使用される可能性は等しくありませんが、2ⁿ必ずしもより遅くなるため、同じ順序であるとは言えませんn⋅2ⁿ


f(n) = 2*2^nあなたが意味したと思いますn*2^nか?
tobias_k

4

私はそれn⋅2ⁿがよりも速く成長するという他の答えとは論争しません2ⁿ。しかし、n⋅2ⁿ成長はまだ指数関数的です。

アルゴリズムについて話すとき、時間の複雑さが増大することは指数関数的であるとよく言います。だから、私たちはあることを考える2ⁿ3ⁿeⁿ2.000001ⁿ、または当社のn⋅2ⁿ指数が成長と複雑さの同じグループであることを。

それを少し数学的な意味を与えるために、我々は、機能を検討しf(x)、そのような定数が存在する指数関数的にあれば(ないよりも速く)成長するc > 1ことを、。f(x) = O(cx)

以下のためにn⋅2ⁿ、一定c以上の任意の数の大きい可能性が2レッツ・テイク、3。次に:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿこれは以下である1すべてのためn

したがって、2ⁿはより遅く成長しn⋅2ⁿ、最後はより遅く成長します2.000001ⁿ。しかし、3つすべてが指数関数的に成長します。


最後の例では、n * 2 ^ nは2.000001 ^ nより大きく、n = 34,726,000までです。その時点で、2 ^ nは1000万桁を超える数値であるため、
特に

1
@ gnasher729これは、f(n)とc * f(n)がbig-Oに関して同じ複雑さであるため、省略できる定数です。たとえば、40'000'000 * 2.000001 ^ nはすぐにn * 2 ^ nより大きくなります。しかし、あなたが正しい、それは本当に重要ではありません、私たちが指数関数的増加に達したら(それは私たちがnの小さな値しか取得しない限り)重要ではないと私は言うでしょう。
Andrey

2

「2番目は1番目と同じ順序ですか?追加のn乗算は重要ですか?」これらは、2つの異なる答えを持つ2つの異なる質問です。

n 2 ^ nは2 ^ nより漸近的に成長します。それが答えられた質問です。

しかし、「アルゴリズムAが2 ^ nナノ秒かかり、アルゴリズムBがn 2 ^ nナノ秒かかる場合、1秒/分/時間/日/月/年で解を見つけることができる最大のnは何ですか?答えはn = 29/35/41/46/51/54対25/30/36/40/45/49です。実際にはそれほど違いはありません。

時間Tで解決できる最大の問題のサイズは、どちらの場合もO(ln T)です。

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