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

问题描述

我有这些算法,但我没有发现哪一个需要花费更多时间。

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) 
,

对于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}]

Comparison of two Logarithmic Timings

,

您可以计算,简化或简化这些表达式。

..但请稍等片刻,注意,有一个最高阶操作数2 n ,它以指数方式增长 (对于 n -s足够大)比您拥有的任何其他操作数都快-n 2 或log 2 n。

因此,对于足够大的输入, O ((n *(2 n ))会花费更多。

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

我认为您可以看到图案。

请注意,就渐近分析而言,我们始终对大型输入感兴趣,否则,对于1、2或很小的输入,行为将有所不同。

,

在数学上不足以显示证明,但是仅填写“ n”值将为您提供良好的指示。假设n = 100,对数的底数是10。

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

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

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