【问题标题】:Resolution easy recurrence equation分辨率易递归方程
【发布时间】:2015-06-05 22:09:27
【问题描述】:

我必须找到以下函数的递推方程。

public static boolean f(int[] a) {
    return fr(a, 0);
}

private static boolean fr(int[] a, int i) {
    int n = a.length;
    if(i >= n-1) 
        return true;
    else if(a[i] > a[i+1]) 
        return false;
    else 
        return fr(a, i+1);
}

我认为是:

T(1) = 1

T(n) = T(n - 1)

解决我得到结果T(n) = n。这是正确的?这个方程的分辨率似乎很奇怪.. 查看代码很容易看出复杂度是Θ(n)(贯穿整个数组)。

这是一个愚蠢的问题,但让我感到困惑。 感谢任何想帮助我的人

【问题讨论】:

  • 是什么让你认为 T(n) = T(n - 1)?你是否认为 T(2) = T(1) = 1?如果是这样,T(3) = T(2) = T(1) = 1, ... T(n) = 1 吗?
  • @Amit T(n) = T(n-1) 因为递归调用是对数组长度减1...

标签: time-complexity recurrence


【解决方案1】:
T(1) = O(1)
T(n) = T(n-1) + O(1)

这确实是顺序搜索的签名,它具有 O(n) 时间复杂度。这是因为T(n) = T(n-1) 具有 O(n) 复杂性,而 O(1) 项会丢失。

解决方案很简单: 假设我们知道T(n) = T(n-1),我们也知道T(1) = O(1)。这意味着T(2) = O(1)T(3) = O(1) 等等。所以它就相当于n*O(1),也就是O(n)

【讨论】:

  • 为什么将 aT(n-1) 添加到 O(1)?是 return 语句吗?
  • O(1) 项来自实际大于比较的成本。您还可以在概念上将函数的其余语句集中在一起,例如 ifreturn。只要它们是一次性语句并且它们的复杂性与长度无关n,它们的总和都会为 O(1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多