当前位置: 首页 > 知识库问答 >
问题:

最小跳转数组递归时间复杂度应为O(n^n)或O(n!)

元望
2023-03-14

我在GeekforGeekshttps://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;
}

如果我看到上面的代码块,minJumps(arr,I,h)递归调用是从I=l1调用的。所以在每个递归步骤中,l(起始位置)都会增加1。时间复杂度的计算方法如下。

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

我不明白为什么时间复杂度是O(n^n)。在其他地方,我也看到这个递归解的时间复杂度被称为O(n^n),没有适当的解释。请给我一个简单的解释

共有1个答案

蒋俊
2023-03-14

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

现在,解决这个关系,我们可以把它写成T(n)=T(n-1)T(n-1)asT(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)

 类似资料:
  • 问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)

  • 我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的

  • 就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市? 我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?

  • 给定一个整数数组arr,计算元素x,使得x 1也在arr中。如果arr中有重复项,请分别计数。 示例1:输入:arr=[1,2,3]输出:2说明:1和2被计数,因为2和3在arr中。 示例2:输入:arr=[1,1,2]输出:2解释:1计数两次,原因2在arr中。 示例3:输入:arr=[1,1,3,3,5,5,7,7]输出:0说明:没有计算数字,因为arr中没有2、4、6或8。 示例4:输入:a

  • 我需要以下递归关系的帮助。 T(1)=1 T(n)=T(n-1)*n 这就是我尝试过的。我想我可能把替换部分搞砸了,但请再看一次,让我知道我得到的时间复杂度是否正确。 现在我不确定我所做的是否完全正确,但如果有任何帮助,我将不胜感激。