问题描述
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}]
,
您可以计算,简化或简化这些表达式。
..但请稍等片刻,注意,有一个最高阶操作数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
我认为总是选择第一个算法应该很明显。