【问题标题】:Determining the running time of the following code (recursion with a loop inside)确定以下代码的运行时间(内部循环递归)
【发布时间】:2019-05-09 10:54:33
【问题描述】:

我有如下代码,需要判断这个算法的运行时间。

int res=0; 
if (n <= 1) 
    return 1;
for (int i = 0; i < n; i++) 
    res += Catalan(i) * (Catalan(n - i - 1); 
return res;

由于递归内部的循环,我很难确定运行时间。我知道我需要将其转换为回归公式,然后对其进行分析,但我不知道该怎么做。

【问题讨论】:

  • 您可以尝试为n 输入一些小值,然后尝试找出发生了什么。

标签: algorithm recursion time time-complexity catalan


【解决方案1】:

要获得第一个想法,请使用不同大小的输入对其进行分析。

如果您根据输入的大小绘制图形运行时,您将很容易知道它是 O(N) 还是 O(N²)。

然后你就会知道你在寻找什么复杂性,仔细查看你的代码以找到你观察的格式证明。

【讨论】:

  • 您的建议很好,但是您知道我如何将其转换为回归方程吗?我的意思是 t(n)=t(n/2)+1 例如
【解决方案2】:

让我们将你的函数简化为:

    for (int i=0; i< n; i++) 
        res += Catalan(i)*(Catalan(i-1); 
    return res;

这种简化不应影响时间复杂度。

令 n = 1:

   1 
   /\
  0  0

然后我们将调用 3 次 Catalan 函数。

如果 n = 2,那么对于 Catalan(i) 我们将有:

     2
     /
    1 
   /\ 
  0 0 

对于加泰罗尼亚语(i-1)

   1 
   /\
  0  0

所以我们总共会有:

     2      
     /\    
    1  1   
   /\  /\  
  0 0 0  0 

如果 i=3,则:

          3
       /     \
      2       2 
     /\       /\
    1  1     1  1
   /\  /\    /\ /\
  0 0 0  0  0 0 0 0

在我看来就像O(2^n) complexety

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多