这种递归算法的重要性是什么?

时间:2015-10-15 20:03:50

标签: algorithm sorting big-o time-complexity complexity-theory

我正在学习算法和数据结构课程。

今天,我的教授说下面算法的复杂性是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.因为,在这一点上,它对我来说是直观的。他用语言回答道,“如果你认为这是违反直觉的,你的数学就会出现严重问题。”

我的问题是:

  1. 我的示威中有谬误吗?
  2. 最后一种情况不会违反直觉吗?
  3. 是的,这也是一个发泄。

3 个答案:

答案 0 :(得分:3)

证明 - 1

这种复发属于Master Theorem,中的3个

  • a = 2;
  • b = 2;和,
  • c =-∞

因此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是错误的。

您应该与他讨论并清除您可能存在的任何误解。