指数関数的(2 ^ n、n ^ n、e ^ nなど)または階乗的(n!)のどちらの関数がより速く成長しますか? Ps:どこかで読んだだけです、n! 2 ^ nより速く成長します。
n!最終的には、定数ベース(2 ^ nおよびe ^ n)の指数関数よりも速く成長しますが、n ^ nはnよりも速く成長します! nが増えるとベースが大きくなるためです。
n! = n * (n-1) * (n-2) * ...
n^n = n * n * n * ...
n^n
の最初の用語の後のすべての用語は大きいため、n ^ nはより速く成長します。
要因時間アルゴリズムは、指数時間アルゴリズムより漸近的に遅くなりますが、違いがいつ始まるかはすぐにはわかりません。たとえば、n=5
およびk=10
、5!=120
は、10^5=10000
。指数時間アルゴリズムのパフォーマンスが向上し始める時期を見つけるには、いくつかの素早い数学的分析を行う必要があります。
スターリングの公式を使用できます。
log_k^(n!) ~ nlog_k^n - nlog_k^e
k^n = n!
log_k^{k^n} = log_k^{n!}
n = log_k^{n!}
n ~ nlog_k^n - nlog_k^e
1 ~ log_k^n - log_k^e
log_k^n - log_k^e - 1 ~ 0
log_k^n - log_k^e - log_k^k ~ 0
log_k^{n/(ek)} ~ 0
n/(ek) ~ 1
n ~ ek
したがって、n
がk
のほぼ3倍のサイズに達すると、階乗時間アルゴリズムは指数時間アルゴリズムよりも遅くなります。ほとんどの実際のシナリオでは、n
の大きな値とk
の小さな値を使用するため、実際には、要因時間アルゴリズムは指数時間よりも厳密に悪いと仮定できます。アルゴリズム。