【问题标题】:What's the big-O complexity of this recursive algorithm?这个递归算法的大 O 复杂度是多少?
【发布时间】: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。因为,在这一点上,这对我来说是反直觉的。他逐字逐句地回答,“如果你认为这违反直觉,那你的数学就有严重的问题。”

我的问题是:

  1. 我的演示有什么谬误吗?
  2. 最后的情况不会违反直觉吗?

是的,这也是一个通风口。

【问题讨论】:

  • 如果他说是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


【解决方案1】:

证明 - 1

此重复发生在Master Theorem, 中的 3 个与

  • a = 2;
  • b = 2;并且,
  • c = -∞

因此 Logba = 1 大于 -∞。因此运行时间为Θ(n1) = Θ(n)


证明 - 2

直观地说,您正在将大小 n 的问题分解为大小为 n/2 的 2 个问题,并且连接两个子问题的结果的成本为 0 (即循环中没有常数分量)。

因此在最底层你有 n 个成本为 1 的问题,导致 n * O(1) 的运行时间等于 O(n).


编辑:为了完成这个答案,我还将添加您提出的具体问题的答案。

我的演示有什么谬误吗?

没有。没错。

最后的情况会不会反直觉?

这绝对是违反直觉的。请参阅上面的证明 2。

【讨论】:

    【解决方案2】:

    您在计算给定关系的时间复杂度方面是正确的。如果我们在 n 中测量输入大小(我们应该这样做),那么您的教授声称时间复杂度为 2^n 是错误的。

    你可能应该和他讨论一下,并消除你可能有的任何误解。

    【讨论】:

    • 我明天一定会做的。谢谢。
    【解决方案3】:

    您显然是正确的,满足递归关系的函数T(n)O(n)。这本质上是显而易见的,因为它说给定问题的复杂性是一半大小的问题的两倍。没有比这更线性的了。例如——使用线性搜索在 1000 个元素的列表中搜索的复杂度是在 500 个元素的列表中搜索的两倍。

    如果您的教授也是正确的,那么您可能对满足该重复的复杂性不正确。或者,有时对于如何测量输入大小存在一些混淆。例如,整数n 是指定它所需的位数的指数。例如——整数n 的蛮力除法是O(sqrt(n)),比O(n) 好得多。这与蛮力分解本质上毫无价值的事实并不矛盾,例如破解 RSA 是因为对于 256 位密钥,相关的 n2^256 附近。

    【讨论】:

    • 教授。 C. 实际上并没有从算法中得到这种递归关系。他只是在白板上写了它并告诉我们它是O(2^n)。起初,正如我之前所写,我认为这是为了向我们展示 Merge-Sort 递归关系和这个关系之间存在一些违反直觉的东西。但当我后来问的时候,很明显不是。现在我真的很困惑他为什么向我们展示了这一点。无论如何,你的最后一句话很有趣,请你详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-30
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多