【问题标题】:What is the Time-Complexity of this function in C?C语言中这个函数的时间复杂度是多少?
【发布时间】:2019-12-04 13:32:44
【问题描述】:

我想用 C 计算这个函数的复杂度。 这是一棵普通的树

struct nodeG {  
  int key;
  struct nodeG *left_child;
  struct nodeG *right_sib;
};

int aux (NodeG u) {
    int current = 1;                                                // O(1)
    int childs = 0;                                                 // O(1)
    while (u) {                                                     // O(k)
        if (u-> left_child)                                         // O(1)
            childs += aux (u-> left_child);                         // O(1)
        if (u->right_sib && current && u->key < u->right_sib->key)  // O(1)
            current = 0;                                            // O(1)
        u = u -> right_sib;                                         // O(1)
    }
    return current + childs;                                        // O(1)
}

【问题讨论】:

  • 您访问所有节点一次,所以它是 O(N) 其中 N=树中的节点数。顺便提一下,您的算法与 DFS 非常相似,您用于停止搜索的条件是您在当前子树的空节点处,因此您将访问所有节点。
  • 您有一行代码childs += aux (u-&gt; left_child);,您已将其注释为// O(1),因此您似乎已经决定aux 函数在O(1) 时间内运行。当然不是。

标签: algorithm data-structures time-complexity


【解决方案1】:

考虑到所有递归调用,该函数对树中的每个节点执行 O(1) 操作,因此总运行时间为 O(n),其中 n 是节点数。

更详细地说,该函数会为每个节点的最左边的子节点调用一次。然后while 循环遍历它的所有兄弟。所以循环内部每个节点执行一次,或者一共n次。除了循环和递归调用,其余语句都是 O(1)。所以这最终需要 O(n) 时间。

【讨论】:

  • 这就是我的想法,但是由于我正在访问树的所有节点,它不应该是 Theta(n) 吗?
  • 是的,它是 Theta(n)(这当然意味着它也是 O(n))。很多时候人们会使用 big-O,即使使用 theta 会更精确。
猜你喜欢
  • 2011-08-07
  • 2020-12-03
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
相关资源
最近更新 更多