n^2 和 n*lgn*lgn 哪个更有效率?
Which is more efficient n^2 or n*lgn*lgn?
一个非递归算法可以在n^2
次内解决的问题。同样的问题可以在 n lg(n)
操作中使用递归算法来解决,将输入分成两个相等的部分,并在 lg(n)
操作中组合输入
两个解决方案在一起。你觉得哪种算法效率更高?
编辑: 基本情况:T(n) = 1 如果 n = 1.
这意味着 nlgn lgn
将比 n^2
更有效率。对吗?
与 "simple" O(n^2)
版本相比,您的递归算法需要做多少额外工作是个问题。例如,在递归实现中检查 n<32
并在这种情况下使用 O(n^2)
子算法可能是个好主意。但是足够大 n
,O(n*log(n)*log(n))
最终会比O(n^2)
快。
A table 来证明增长的差异(log
是以 2 为底的对数):
n n^2 n*log(n) n*[log(n)]^2 1000*n*[log(n)]^2
32 1024 160 800 800 000
1024 ~10^6 ~10^4 ~10^5 ~10^8
10^4 ~10^8 ~10^5 ~2*10^6 ~2*10^9
10^5 ~10^10 ~2*10^6 ~3*10^7 ~3*10^10
10^6 ~10^12 ~2*10^7 ~4*10^8 ~4*10^11
所以,基本上,即使你的递归算法的每个 "step" 有 1000 倍的操作,当你的 n
超过一百万时,结果仍然更快。
一个非递归算法可以在n^2
次内解决的问题。同样的问题可以在 n lg(n)
操作中使用递归算法来解决,将输入分成两个相等的部分,并在 lg(n)
操作中组合输入
两个解决方案在一起。你觉得哪种算法效率更高?
编辑: 基本情况:T(n) = 1 如果 n = 1.
这意味着 nlgn lgn
将比 n^2
更有效率。对吗?
与 "simple" O(n^2)
版本相比,您的递归算法需要做多少额外工作是个问题。例如,在递归实现中检查 n<32
并在这种情况下使用 O(n^2)
子算法可能是个好主意。但是足够大 n
,O(n*log(n)*log(n))
最终会比O(n^2)
快。
A table 来证明增长的差异(log
是以 2 为底的对数):
n n^2 n*log(n) n*[log(n)]^2 1000*n*[log(n)]^2
32 1024 160 800 800 000
1024 ~10^6 ~10^4 ~10^5 ~10^8
10^4 ~10^8 ~10^5 ~2*10^6 ~2*10^9
10^5 ~10^10 ~2*10^6 ~3*10^7 ~3*10^10
10^6 ~10^12 ~2*10^7 ~4*10^8 ~4*10^11
所以,基本上,即使你的递归算法的每个 "step" 有 1000 倍的操作,当你的 n
超过一百万时,结果仍然更快。