【问题标题】:if else recursion worst time complexityif else递归最差时间复杂度
【发布时间】:2017-11-11 17:05:57
【问题描述】:

我很难找出下面代码的最差时间复杂度。
(这不是作业,请参阅https://leetcode.com/problems/integer-replacement/description/。)

int recursion (int n) {
    if (n == 1)
        return 0;
    if (n % 2 == 0) {
        return recursion(n/2) + 1
    } else {
        return min(recursion(n / 2 + 1) + 1, recursion(n - 1)) + 1;
   }
}

我唯一知道的是N == 2 ^ k(k > 0),最差的时间复杂度是O(logN)。 但是,我不清楚N 何时不是2^k。因为即使number / 2 仍然可以得到奇数。有人说还是O(LogN),但我不服。

我知道代码不是最好的解决方案,只是想分析一下时间复杂度。我尝试了递归树和聚合分析,似乎没有帮助。

【问题讨论】:

  • 你的 else 案例有一个错误的陈述,它应该是 (n+1)/2
  • @BlackMamba 。嗨, (n + 1) 会溢出。但我还有其他错误。已更新。非常感谢
  • 我看到了leetcode问题陈述。我确实不看到,在前两个修订版中,您的最后一个分支(带有min 在备选方案之间进行选择的分支)与它相关 - 它不应该是“else”的一部分如果“then”以无条件的return 结束,无论如何。
  • 它有一个简单实用的解决方案。如果它比 O(logN) 更糟,那么它总是会在 N 的大值上炸毁堆栈。所以用 INT_MAX 运行一次,如果它没有崩溃,那么它就是 QED。在 SO 中这是否是 leet 并不是很重要 :) leet 足够了。

标签: c algorithm recursion


【解决方案1】:

如果n 是偶数,我们知道T(n) = T(n/2) + 1,如果n 是奇数,我们知道 T(n) = T(n/2 + 1) + T(n-1) + 1。在后一种情况下,由于n 是奇数,我们知道n-1 必须是偶数。如果n/2 + 1 是偶数T(n) = T(n/4) + T(n/2) + 3 并且如果n/2 + 1 是奇数T(n) = 2*T(n/4) + T(n/2) + 3。

根据上述讨论,在最坏的情况下,T(n) 是基于一般情况下的T(n/2) 和T(n/4) 定义的。从Akra-Bazzi Theorem 我们可以说,T(n) = O(n^((log(1+sqrt(5))-log(2))/log(2))) ~ O(n^0.69)(来自第一种情况)和T(n) = O(n) 来自第二种情况(n/2 + 1 是奇数)。

但是,对于更严格的复杂性,我们应该在分析中进行更多检查。

【讨论】:

  • 嗨,Akra-Bazzi 让我大吃一惊。我将其应用于 T(n) = T(n/4) + T(n/2)。
  • 如果 n 是奇数,那么 n/2 + 1 可以是奇数或偶数 - 考虑 n=7 和 n=9。
  • @OmG 如果n=9 则n/2+1 等于5。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多