時間の複雑さについて私が見つけたリソースは、特に非多項式の例で、時間の複雑さの方程式の用語を無視しても大丈夫なのか不明確です。
フォームnの何かが与えられたことは私には明らかです2 + n + 1、最後の2つの用語は重要ではありません。
具体的には、2つのカテゴリー化が与えられた場合、2n、およびn *(2n)、2番目は1番目と同じ順序ですか?そこに追加のn乗算が重要ですか?通常、リソースはxと言うだけですn 指数関数的であり、はるかに速く成長します...そして次に進みます。
なぜそうならないのか理解できます2n nを大幅に上回るが、それらは一緒に加算されないため、2つの方程式を比較する際に非常に重要であり、実際、それらの差は常にnの係数であり、控えめに言っても重要と思われる。
この質問に答えるには、大きなO(O
)の正式な定義に移動する必要があります。
定義は、f(x)
がO(g(x))
に属するということです。つまり、制限limsupx → ∞ (f(x)/g(x))
が存在する場合、つまり無限ではない場合のみです。要するに、これは、f(x)/g(x)
の値がM
より大きくならないような定数M
が存在することを意味します。
質問の場合は、f(n) = n ⋅ 2n
とg(n) = 2n
を入力してください。 f(n)/g(n)
はn
であり、無限に成長し続けます。したがって、f(n)
はO(g(n))
に属しません。
n⋅2ⁿ
が大きいことを簡単に確認するには、変数を変更します。 m = 2ⁿ
としましょう。次にn⋅2ⁿ = ( log₂m )⋅m
(m = 2ⁿ
の両側で2を底とする対数を取るとn = log₂m
になります)、m log₂m
がm
よりも速く成長することを簡単に示すことができます。
n⋅2ⁿ
がO(2ⁿ)
に含まれていないことに同意しますが、優れた使用制限が常に当てはまるわけではないので、もっと明示的にすべきだと思いました。
Big-Oの正式な定義では、すべてのc > 0
にf(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ⁿ
よりも遅くなるため、同じ順序であるとは言えません。
n⋅2ⁿ
は2ⁿ
よりも速く成長すると言う他の回答とは異議を唱えません。しかし、n⋅2ⁿ
の成長はまだ指数関数的です。
アルゴリズムについて話すとき、時間の複雑さが増すと指数関数的であるとよく言います。そのため、2ⁿ
、3ⁿ
、eⁿ
、2.000001ⁿ
、またはn⋅2ⁿ
であるとみなし、指数関数的に増加する同じ複雑さのグループと見なします。
少し数学的な感覚を与えるために、そのような定数c > 1
、つまりf(x)
が存在する場合、関数f(x) = O(cx)
が指数関数的に成長する(より速くはない)と考えます。
n⋅2ⁿ
の場合、定数c
は2
より大きい任意の数値にすることができます。3
を使用してみましょう。次に:
n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿ
およびn
の場合、これは1
未満です。
したがって、2ⁿ
はn⋅2ⁿ
よりもゆっくりと成長し、最後は2.000001ⁿ
よりも遅くなります。しかし、それらの3つはすべて指数関数的に成長します。
「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)です。