web-dev-qa-db-ja.com

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

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

フォームnの何かが与えられたことは私には明らかです2 + n + 1、最後の2つの用語は重要ではありません。

具体的には、2つのカテゴリー化が与えられた場合、2n、およびn *(2n)、2番目は1番目と同じ順序ですか?そこに追加のn乗算が重要ですか?通常、リソースはxと言うだけですn 指数関数的であり、はるかに速く成長します...そして次に進みます。

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

177
matty-d

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

定義は、f(x)O(g(x))に属するということです。つまり、制限limsupx → ∞ (f(x)/g(x))が存在する場合、つまり無限ではない場合のみです。要するに、これは、f(x)/g(x)の値がMより大きくならないような定数Mが存在することを意味します。

質問の場合は、f(n) = n ⋅ 2ng(n) = 2nを入力してください。 f(n)/g(n)nであり、無限に成長し続けます。したがって、f(n)O(g(n))に属しません。

229

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

85
chepner

n⋅2ⁿO(2ⁿ)に含まれていないことに同意しますが、優れた使用制限が常に当てはまるわけではないので、もっと明示的にすべきだと思いました。

Big-Oの正式な定義では、すべてのc > 0f(n)があるような定数n₀ ≥ 0およびn ≥ n₀が存在する場合、O(g(n))f(n) ≤ c⋅g(n)にあります。 f(n) = n⋅2ⁿおよびg(n) = 2ⁿにはそのような定数が存在しないことを簡単に示すことができます。ただし、g(n)O(f(n))にあることを示すことができます。

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

10
zpr

n⋅2ⁿ2ⁿよりも速く成長すると言う他の回答とは異議を唱えません。しかし、n⋅2ⁿの成長はまだ指数関数的です。

アルゴリズムについて話すとき、時間の複雑さが増すと指数関数的であるとよく言います。そのため、2ⁿ3ⁿeⁿ2.000001ⁿ、またはn⋅2ⁿであるとみなし、指数関数的に増加する同じ複雑さのグループと見なします。

少し数学的な感覚を与えるために、そのような定数c > 1、つまりf(x)が存在する場合、関数f(x) = O(cx)が指数関数的に成長する(より速くはない)と考えます。

n⋅2ⁿの場合、定数c2より大きい任意の数値にすることができます。3を使用してみましょう。次に:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿおよびnの場合、これは1未満です。

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

4
Andrey

「2番目は最初の順序と同じ順序ですか?追加の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)です。

2
gnasher729