这些算法中的哪一个需要更多时间?

which one of these algorithm take more time?

我有这些算法,但我没有找出哪个需要更多时间。

O((n^2)*log(n))

O(n*(2^n))

我计算了它们的对数,但我不明白哪个需要更多时间。

log((n^2)*log(n)) = 2log(n)+log(log(n))

log(n*(2^n))=log(n)+n*log(2)

第二个,因为:

2^n > n^2

n > log(n) 

您可以计算、减少或简化这些表达式。

..但稍等一下,注意,有一个 最高 顺序操作数 2n,它增长 exponentially - 比你拥有的任何其他操作数更快(对于足够大的 n-s) - 即 n2 或 log2n.

因此,O((n*(2n)) 对于足够大的输入来说会占用更多空间。

  • 输入1→2操作
  • 输入2→8次操作
  • 输入3→24次操作
  • 输入4→64次操作 ...
  • 输入10 → 10240次操作

我想你能看出其中的规律。

注意,根据渐近分析,我们总是对大输入感兴趣,否则,对于 1、2 或非常小的输入,行为会有所不同。

数学不够好,无法证明,但只需为“n”填写一个值即可为您提供一个很好的指示。让我们取 n = 100,log 的底数是 10。

# First algorithm
100^2 * log(100) = 10000 * 2 = 20000

# Second algorithm
100 * 2^100 = 100 * 1267650600228229401496703205376 = 126765060022822940149670320537600

我认为总是选择第一种算法应该是很明显的。

对于 n 的小范围值(大约 n = 5 (~4.738) 到 26 (~25.783))假设自然对数,第一个大于第二个,但大于第二个总是更大,并且随着 n 的增加而变得越来越大。

绘制它证实了这一点,这里使用 Mathematica:

f1[n_] := Log[n^2]*Log[n]
f2[n_] := Log[n*(2^n)]

Plot[{f1[n], f2[n]}, {n, 1, 50}]