【问题标题】:Finding recurrence functions in a code snippets在代码片段中查找递归函数
【发布时间】:2021-06-19 19:15:06
【问题描述】:

我应该找到这个sn-p代码的递归函数,但是如果我做的事情是正确的,我真的很困惑。我会放 --- 台词来尝试展示我的思维方式。

假设树是平衡的。

// compute tree height (longest root-to-leaf path)
int height(TreeNode* root) {
if (root == NULL) return 0; **-------- C**
else {
         // Find height of left subtree, height of right subtree
         //Use results to determine height of tree

         return 1 + max(height(root->left), height(root->right)); **---- n/2**
      }
}

我相信这段代码的递归函数会是 T(n) = c + n/2,但是我觉得我错过了一些东西。

【问题讨论】:

    标签: recursion recurrence


    【解决方案1】:

    递归关系将是:

    T(n) = 2T(n/2) + 1

    在任何级别都有一些操作在该级别上也有 2 次调用左右子树。

    我们可以从这里推导出时间复杂度:

    T(n) = 2T(n/2) + 1
         = 2 [2(T(n/4) + 1] + 1
         = 4T(n/4) + 1 + 1= 4T(n/4) + 2
         = 4 [2T(n/8) + 1] + 2
         = 8T(n/8) + 3
         = 2kT(n/2k) + n 
    

    • 保持 n = 1, 2, ... 让 n = 2k,所以 k=log2 n

         = T(1) + n log(n) 
    

    所以时间复杂度将是 nlog(n)

    【讨论】:

    • 你介意解释一下你在哪里得到时间 2 和 + n
    • 两次调用高度:O(N),每棵树N/2个节点进行两次递归调用2T(N/2)
    • 谢谢,但是 + n 呢,我不确定它来自哪里
    • 每个级别都有一个错误,您只检查它是否是root。所以它应该花费0(1)时间。我已经更新了答案。
    • 当时还是 n(logn) 还是现在只是 n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2013-11-05
    • 2018-02-06
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多