【问题标题】:Minimum Jump Array Recursive Time Complexity should be O(n^n) or O(n!)最小跳转数组递归时间复杂度应为 O(n^n) 或 O(n!)
【发布时间】:2021-08-30 23:46:21
【问题描述】:

我在 GeekforGeeks https://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/ 中检查“到达终点的最小跳跃次数”问题。 我对那里提到的时间复杂度感到困惑,即 O(n^n)。

// Returns minimum number of
// jumps to reach arr[h] from arr[l]
static int minJumps(int arr[], int l, int h)
{
    // Base case: when source
    // and destination are same
    if (h == l)
        return 0;
 
    // When nothing is reachable
    // from the given source
    if (arr[l] == 0)
        return Integer.MAX_VALUE;
 
    // Traverse through all the points
    // reachable from arr[l]. Recursively
    // get the minimum number of jumps
    // needed to reach arr[h] from these
    // reachable points.
    int min = Integer.MAX_VALUE;
    for (int i = l + 1; i <= h
                        && i <= l + arr[l];
         i++) {
        int jumps = minJumps(arr, i, h);
        if (jumps != Integer.MAX_VALUE && jumps + 1 < min)
            min = jumps + 1;
    }
    return min;
}

如果我看到上面的代码块,就会从 i=l+1 调用 minJumps(arr, i, h) 递归调用。所以在每一个递归步骤中,l(start position)都会增加1。时间复杂度应该如下计算。

T(N) = (n-1)*(n-2)*(n-3)...*1
     = (n-1)!
 

我不明白为什么时间复杂度是 O(n^n)。在其他几个地方,我也看到这个递归解决方案的时间复杂度被称为 O(n^n) 没有适当的解释。请帮我做一个简单的解释并指出我在这里遗漏的内容。

【问题讨论】:

  • 当 2 不在等式中时,您如何将其分解?
  • 我认为是 O((n-1)! ) 但你是对的。该网站的复杂性有点草率——它是 O(n^n) 并没有错,因为大 O 是一个上限,但这不是一个严格的界限。
  • 我不明白你为什么要乘以每个值。
  • 对我来说好像O(2^n)。不过不确定。
  • @Shantanu 我现在对方程式进行了更正。

标签: java arrays algorithm time-complexity


【解决方案1】:

我可以看到递归关系为T(n) = T(n-1) + T(n-2) + T(n-3) + T(n-4) + ... + T(0),因为循环是从 l 到 h(暂时忽略 if 条件)。所以对于区间[l,h],该区间中的每个值都会在最坏的情况下被调用,即minJumps(l+1, h), minJumps(l+2, h) ... minJumps(h, h),并且可以注意到上述递归关系在这里成立。

现在,解决关系,我们可以将其写为T(n) = T(n-1) + T(n-1)T(n-1) = T(n-2) + T(n-3) + T(n-4) + ... + T(0)。因此T(n) = 2 * T(n-1) 归结为O(2^n)

上述算法的时间复杂度应该是O(2^n)

【讨论】:

  • 你是对的!看到它是 2^n 的最简单方法是,每个 A 的索引子集都有一个路径。(即:{1, 2, 3, ..., n} 的子集)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2015-05-25
  • 2019-12-09
  • 1970-01-01
  • 2013-11-30
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多