Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定算法的递推关系?_Algorithm_Binary Tree_Time Complexity_Recurrence - Fatal编程技术网

Algorithm 给定算法的递推关系?

Algorithm 给定算法的递推关系?,algorithm,binary-tree,time-complexity,recurrence,Algorithm,Binary Tree,Time Complexity,Recurrence,该算法/代码在二叉树中查找正好有4个节点的子树的数目,它是以自底向上的方式工作的。 我知道这段代码的时间复杂度是O(n),空间复杂度是O(logn),因为它使用递归 代码的递归关系是什么 我试着画T(n)=2T(n-1)+1,这显然是错误的 在您更了解树的结构的情况下,您只能单独讨论n的递归关系,例如: 案例1:每个节点只有一个子含义 T(n)=T(0)+T(n-1)+k 案例2:任何级别的子树都是平衡的,以便 T(n)=2t((n-1)/2)+k 这两种情况都会导致O(n),但这两种情况只是极

该算法/代码在二叉树中查找正好有4个节点的子树的数目,它是以自底向上的方式工作的。 我知道这段代码的时间复杂度是O(n),空间复杂度是O(logn),因为它使用递归

代码的递归关系是什么


我试着画T(n)=2T(n-1)+1,这显然是错误的

在您更了解树的结构的情况下,您只能单独讨论n的递归关系,例如:

案例1:每个节点只有一个子含义 T(n)=T(0)+T(n-1)+k
案例2:任何级别的子树都是平衡的,以便 T(n)=2t((n-1)/2)+k

这两种情况都会导致O(n),但这两种情况只是极少数可能的树。对于更通用的方法,您必须使用像T(n)=T(a)+T(b)这样的公式,其中a和b是由树的结构产生的子问题的任意划分。您仍然可以使用建立此类公式的结果

以下是我将使用的确切公式和方法:
T(n)=nk+mnc,其中mn≤ n+1。(注意:我用k表示递归步骤的开销,用c表示基/空步骤的开销)

基本情况(n=0):
对于空节点T(0)=cso T(n)=kn+mnc,
其中mn=1≤ n+1=1。
感应阶跃(T(x)=xk+mxc,适用于所有x
大小为n的子树具有大小为a和b的两个子树(a或b可以是0),使得n=a+b+1。
T(n)=T(a)+T(b)+k=ak+mac+bk+mbc+k=(a+b+1)k+(ma+mb)c=nk+mnc,
其中mn=ma+mb≤ a+1+b+1=n+1


使用mn的原因仅仅是为了使证明更加平滑,因为空案例的确切数量实际上受到树结构的影响(在前一个案例2中,它是log n)。因此,由于nk项,T(n)最多为O(n),并且由于mnc上的界,T(n)不可能比O(n)最差。

在递归关系中,
n
不是整数。它一定是一棵树。然后,
T(n)=1+T(n.左)+T(n.右)
。形式上,它不仅取决于节点的数量,还取决于它们的结构。您的公式
T(n)=2T(n-1)+1
,这
n
不是节点的数量。只有当树是平衡二叉树时,才能使用它
int print4Subtree(struct Node *root) {
    if (root == NULL)
      return 0;
    int l =  print4Subtree(root->left);
    int r =   print4Subtree(root->right);
    if ((l + r + 1) == 4)
       printf("%d ", root->data);
    return (l + r + 1); }