【发布时间】:2016-01-14 10:35:19
【问题描述】:
我正在学习算法和数据结构课程。
今天教授说下面算法的复杂度是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)),我问他为什么复杂度较低的算法会得到更高的 big-O。因为,在这一点上,这对我来说是反直觉的。他逐字逐句地回答,“如果你认为这违反直觉,那你的数学就有严重的问题。”
我的问题是:
- 我的演示有什么谬误吗?
- 最后的情况不会违反直觉吗?
是的,这也是一个通风口。
【问题讨论】:
-
如果他说是
O(2^n),他是对的,因为O是一个上限。如果他认为是在Theta(2^n),那就错了。 -
即使我给出了答案(基于给定的重复出现),如果您编辑帖子以给出正在讨论的算法,它仍然会有所帮助。换句话说——是“以下算法”?
-
@JohnColeman 我刚刚在您对此的回答下发表了评论。我会在这里复制它:C教授实际上并没有从算法中得到这种递归关系。起初,正如我之前所写,我认为这是为了向我们展示 Merge-Sort 递归关系和这个之间存在一些违反直觉的东西。但当我后来问的时候,很明显不是。现在我真的很困惑他为什么向我们展示这个。
-
@helpYou 是的:D 谢谢。我没有考虑那个。不过,他说这不是 O(n) 是否正确?
-
它在O(n), O(2^n), O(n^n), O(nlogn) 等而不是O(logn), O(sqrt(n) ))、O(1) 等等。所以,如果他说它不在
O(n)中,他是错的,但如果他说它在O(2^n)中,他是对的,因为这是真的,即使这是'不太相关。
标签: algorithm sorting big-o time-complexity complexity-theory