【问题标题】:Deriving a Big O notation by Algorithm time-complexity analysis通过算法时间复杂度分析推导大 O 符号
【发布时间】:2020-10-11 03:28:35
【问题描述】:
int m(int i)                                                                                     
{
if (i==1)                                                                                     
    return i;                                                                                 
else                                                                                            
    return m(i-1) + m(i-1);                                                     
        }

我做了以下事情: 第 3 行和第 4 行各计为 1。我不知道要计算检查第 5 行和第 6 行的次数。既然是递归的,我该如何推导出大 O 符号?

【问题讨论】:

  • checkout Master theorem,用于确定递归的时间复杂度。

标签: algorithm big-o computer-science


【解决方案1】:

您可能最好通过在纸上写下对于一些小输入的函数调用的样子来最好地理解这一点,例如i == 3

            m(3)
       /           \
    m(2)           m(2)
  /      \       /      \
m(1)     m(1)  m(1)     m(1)

应该清楚的是,在每个级别,函数调用的数量都会翻倍。这是指数行为,因此复杂度大致为O(2^n),其中n 是输入值。

【讨论】:

  • 每条语句会以指数行为的形式被检查多少次?
  • 你打电话给m(2),有3个评价。你拨打m(3),有7个评价。
  • 在计算机科学中,这确实是指数级的。然而,在编程中,根据语言的不同,编译器可能被允许将m(i-1) + m(i-1) 优化为2 * m(i-1),这使其成为线性的。或者,可以想象,甚至 1 << (i - 1) 用于固定时间。
  • @dxiv 当然,如果你想走这条路,我们可以考虑使用动态规划,完全消除递归。
【解决方案2】:

递归公式为:

现在,扩展公式并使用数学归纳法:

至于i=1,我们有常数时间计算,我们假设T(1) = 1。因此:

【讨论】:

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