web-dev-qa-db-ja.com

2 ^ sqrt(n)の時間の複雑さ

私はアルゴリズムの質問を解決しており、私の分析では、O(2 ^ sqrt(n))で実行されるということです。それはどれくらい大きいですか? O(2 ^ n)と同じですか?それはまだ非多項式の時間ですか?

11
Gaara

これは興味深い質問です。幸いなことに、それを解決する方法がわかれば、それほど難しくはありません。

機能について f: N → R+ そして g: N → R+、 我々は持っています f ∈ Og)lim supの場合に限り→∞f)/ g)∈ R

機能 f: N → R+ 定数が存在する場合に限り、最大で多項式の成長があります k ∈ N そのような f ∈ O ↦ k)。これを任意であるが修正されたものにしよう k ∈ N

lim sup→∞ 21/2k =
スリム→∞ 21/2k =
スリム→∞ 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/21/2 =リム→∞ 2c − 1/2 =∞∉ R

固定された c >0。したがって、関数の複雑さは、多項式と指数関数の間のどこかにあります。

16
5gon12eder

それはどれくらい大きいですか?さて、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桁の数字です。

6
gnasher729