我正在学习算法和数据结构课程。
今天,我的教授说以下算法的复杂度是2n。
课程结束后,我走到他面前告诉他我认为这是一个O(n)算法,并进行了计算来证明它,想向他展示,但他仍然坚持说不是,并没有给出令人信服的解释。
该算法是递归的,其复杂度如下:
{ 1 if n=1
T(n) = {
{ 2T(n/2) otherwise
我计算出来它是O(n)
,方法如下:
我们扩展一下T(n)
:
T(n) = 2 [2 * T(n/(2^2))]
= 2^2 * T(n/(2^2))
= 2^2 * [2 * T(n/(2^3))]
= 2^3 * T(n/(2^3))
= ...
= 2^i * T(n/(2^i)).
当T内的项为1时,我们停止计算,即:
n/(2i) = 1 ==> n = 2i ==> i = log n
代入后,我们得到:
T(n) = 2^log n * T(1)
= n * 1
= O(n).
自从我注意到归并排序算法是O(n log n)的,其复杂度为2T(n/2)+Θ(n)(显然高于2T(n/2)),我一直在想,一个复杂度较低的算法为什么会得到更高的大O值。因为这时候对我来说是违反直觉的。他回答道:“如果你认为这违反了直觉,那么你的数学基础有严重问题。”
我的问题是:
1. 我的论证中是否存在任何谬误? 2. 最后的情况难道不是违反直觉的吗?
是的,这也是发泄。
O(2^n)
,那么他是正确的,因为O
是一个上限。如果他认为它在Theta(2^n)
中,那么他是错误的。 - ROMANIA_engineer