私はアルゴリズムの質問を解決しており、私の分析では、O(2 ^ sqrt(n))で実行されるということです。それはどれくらい大きいですか? O(2 ^ n)と同じですか?それはまだ非多項式の時間ですか?
これは興味深い質問です。幸いなことに、それを解決する方法がわかれば、それほど難しくはありません。
機能について f: N → R+ そして g: N → R+、 我々は持っています f ∈ O(g)lim supの場合に限りん→∞f(ん)/ g(ん)∈ R。
機能 f: N → R+ 定数が存在する場合に限り、最大で多項式の成長があります k ∈ N そのような f ∈ O(ん ↦ んk)。これを任意であるが修正されたものにしよう k ∈ N。
lim supん→∞ 2(ん1/2) / んk =
スリムん→∞ 2(ん1/2) / んk =
スリムん→∞ eログ(2) ん1/2/eログ(ん) k =
スリムん→∞ eログ(2) ん1/2 −ログ(ん) k =∞∉ R
分母と分母の両方が単調に成長する安定した関数であるため、最初の等式は真です。 2番目の等式はIDを使用します バツy = eログ(バツ) y。最終的な式の指数は上記の範囲にないため、制限は有限ではありません。正式な証明を与えずに、それが知られていると仮定することができます ん1/2 log(ん)漸近的に。したがって、問題の関数は多項式の成長を超えています。
ただし、その成長は厳密には指数関数よりも小さく、指数関数は(この目的のために)私は次のように定義されています。 O(ん ↦2cん) ために c >0。これを表示することはさらに簡単です。
lim supん→∞ 2cん/2(ん1/2) =リムん→∞ 2cん − ん1/2 =∞∉ R
固定された c >0。したがって、関数の複雑さは、多項式と指数関数の間のどこかにあります。
それはどれくらい大きいですか?さて、O(2 ^ sqrt(n))は、それがどれだけ大きいかということです:
その意味を理解するために、アルゴリズムが単なるO(2 ^ sqrt(n))ではなく、実際にコンピューター上で正確に2 ^ sqrt(n)ナノ秒かかると想像してください。
n = 100:2 ^ 10 = 1024ナノ秒。時間がない。 n = 1000:2 ^ 31.xxx = 20億ナノ秒。 2秒、それは顕著です。 n = 10,000:2 ^ 100≈10 ^ 30ナノ秒= 10 ^ 21秒= 30兆年。
これは---(lot 2 ^ nナノ秒より優れています。ここで、n = 100は30兆年かかりますが、解決できる問題のサイズは非常に限られています。コンピュータが1週間で解決できる問題を「解決可能」だと考える場合、これは約6 x 10 ^ 14ナノ秒、つまりn = 2,400です。一方、n = 400までは1ミリ秒で解決できます。
(実際には、n = 10,000の場合、O(2 ^ sqrt(n))とO(2 ^ n)の両方にまったく同じ時間がかかります。それを待つには長すぎます。)
それは多項式を超えています。 n ^ 1000秒かかる別のアルゴリズムを取ります。これは、n = 2では実質的に解決できません。このアルゴリズムは、nが約8億8,500万になるまで時間がかかります。しかし、本当に、誰が気にしますか?その時点で、両方のアルゴリズムにかかる年数は9,000桁の数字です。