我正在学习算法和数据结构课程。
今天,我的教授说下面算法的复杂性是2 n 。
我一直等到课程结束,接近他并告诉他我其实认为这是一个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 /(2 i )= 1 ==> n = 2 i ==> i = log n
替换后,我们获得
T(n) = 2^log n * T(1)
= n * 1
= O(n).
由于这个算法从Merge Sort的课程中跳了出来,我注意到Merge Sort,其中出了名的O(n log n)
复杂度为2T(n / 2)+Θ(n)(明显高于2T( n / 2)),我问他为什么,复杂度较低的算法得到更高的大O.因为,在这一点上,它对我来说是直观的。他用语言回答道,“如果你认为这是违反直觉的,你的数学就会出现严重问题。”
我的问题是:
是的,这也是一个发泄。
答案 0 :(得分:3)
证明 - 1
这种复发属于Master Theorem,中的3个
因此Log b a = 1,大于-∞。因此,运行时间Θ(n 1 )=Θ(n)。
证明 - 2
直观地说,您将大小 n 的问题分解为2个大小 n / 2 的问题,并且加入两个子问题的结果的成本是0(即复发中没有恒定的成分。
因此,在最底层,你有 n成本1 的问题,导致 n * O(1)的运行时间等于<强> O(n)的
编辑:为了完成此答案,我还会为您提出的具体问题添加答案。
我的示威中有谬误吗?
没有。这是对的。
最后一种情况不会违反直觉吗?
绝对是违反直觉的。见上面的Proof-2。
答案 1 :(得分:2)
您明确正确的是,满足该递归关系的函数T(n)
是O(n)
。它基本上是显而易见的,因为它表示给定问题的复杂性是问题的两倍,而问题只有一半。你无法获得更多的线性。例如,使用线性搜索搜索1000个元素列表的复杂性是搜索包含500个元素的列表的两倍。
如果你的教授也是正确的,那么也许你对于复杂性的复杂性是不正确的。或者,有时对于如何测量输入大小存在一些混淆。例如,整数n
是指定它所需的位数的指数。例如,整数n
的强力试验除法为O(sqrt(n))
,这比O(n)
要好得多。这与蛮力因子分解基本上没有价值的事实相矛盾的原因是破解RSA是因为比如说256位密钥,相关的n
大约是2^256
。
答案 2 :(得分:2)
您在计算给定关系的时间复杂度时是正确的。如果我们在n
(我们应该)测量输入大小,那么您的教授声称时间复杂度为2^n
是错误的。
您应该与他讨论并清除您可能存在的任何误解。