当前位置: 首页 > 面试题库 >

计算其中具有循环的递归函数的时间复杂度

蒋文光
2023-03-14
问题内容

我当时正在研究一个简单的问题,后来想出了C ++中的递归函数,以下是我的函数

void test(int arr[],int n,int x = 0){
    cout<<arr[x];
    for(int i = x+1;i < n;i++){
        test(arr, n, i);
    }
}

我想知道,如果有人可以计算上述方法的时间复杂度,那么上述函数的时间复杂度将是多少,这将对改善我的功能有很大帮助。


问题答案:

您可以像下面这样编写其经常性关系:

 T(n) = T(n-1) + T(n-2) + ... + T(1) + 1

确实T'(x)T(n - x)T(1) = 1(该位置中的最后一个是cout)。我们可以看到:

T(2) = T(1) + 1 = 2
T(3) = T(2) + T(1) + 1 = 2 + 1 + 1 = 4
T(4) = 4 + 2 + 1 + 1 = 2^2 + 2^1 + 2^0 + 1 = 8
T(5) = 8 + 4 + 2 + 1 + 1 = 2^3 + 2^2 + 2^1 + 2^0 + 1 = 16
.
.
.
T(n) = 2^{n-2} + 2^{n-1} + ... + 2^0 + 1 = 2^{n-1}

因此,T(n) = \Theta(2^n)



 类似资料:
  • 我想用尽可能多的方法解决塔式料斗问题,并计算每种方法的时间复杂性(仅用于自我练习)。解决方案之一是: 我知道递归时间复杂度计算的一般想法,但我在分析注释行(在 for 循环内)时遇到了麻烦。通常我用 )计算时间复杂度,并用一般表达式(例如 T(n-k))降低它,直到我达到基本情况并且可以用 n 表示 k,但是 for 循环的时间复杂度是多少?

  • 这是一个使用两个递归调用对数组进行排序的算法。我试图粗略地计算其时间复杂度,但不确定。我知道两个for循环需要n次,但是递归调用怎么办,我如何计算它们呢?任何人都可以用简单的数学方法帮助计算。

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 所以我想我知道的是: 第1行只是1。 第一个时循环是N 1。 i--;是N次,因为它在第一个while循环中。 j=i-1;也是N. 第二个时循环是(N 1)N=N^2 N,因为它是时循环中的时循环 if语句:??? j--;是N(N)=N^2 返回0;是1 我对计算算法的时间复杂度非常陌生,所以我甚至不确定我认为我知道的是否完全正确。但是让我困惑的是if语句,我不知道如何计算它(如果它之后还有一

  • 顺便说一句,我试图解决时间复杂性,我找到了O(2^n)。正确吗?

  • 我在计算时间复杂度时遇到困难,尤其是while循环: 示例1: 时间复杂度是O(n x 3 x r)还是O(3)? 示例 2: 时间复杂度会是O(3 x n)还是O(3)?

  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。