【问题标题】:Time complexity of counting all nodes with a given key in a ternary tree?在三叉树中计算具有给定键的所有节点的时间复杂度?
【发布时间】:2013-11-01 00:47:26
【问题描述】:

我需要在我的程序中找到一个函数的时间复杂度。它搜索具有给定键的三叉树的所有内部节点。这棵树是随机填充的。我想我已经设法编写了代码,但我不知道如何计算复杂度。

这是树的函数和结构:

typedef struct _no
{
    int chave; 
    struct _no *F[3]; 
} TipoNo;

typedef TipoNo *TipoArvore;

int noSubTree (TipoArvore t, int x){
    int n;
    if (t == NULL){
        return 0;
    }
    else{
        if(t->F[0] == NULL && t->F[1] == NULL && t->F[2] == NULL ){
             return 0;
        }
        else if(t->chave == x) {                 
          return 1 + noSubTree(t->F[0], x) + 
                     noSubTree(t->F[1], x) + 
                     noSubTree(t->F[2], x);
        }
        else {
          return 0 + noSubTree(t->F[0], x) +
                     noSubTree(t->F[1], x) +
                     noSubTree(t->F[2], x);
       }
    }
 }

如果有人能向我解释应该如何做,我将不胜感激。

【问题讨论】:

    标签: c data-structures tree big-o time-complexity


    【解决方案1】:

    思考这个问题的一种方法是思考

    • 每个节点被访问了多少次,以及
    • 每次节点访问完成了多少工作。

    请注意,您的代码在每次访问节点时都会执行 O(1) 工作 - 它只是触发更多递归调用,并可选择在结果中添加一个。您还只访问每个节点一次。每个节点只在其子节点上调用该函数,因此最终将到达所有节点,并且由于所有调用都向下定向并且永远不会重叠,因此不会访问两次节点。

    因此,总时间复杂度为 Θ(n),其中 n 是树中节点的总数。

    顺便说一句:由于您是用 C 编写此代码,因此您可以将一些案例压缩在一起。例如,看看这些代码行:

    if(t->chave == x) {                 
        return 1 + noSubTree(t->F[0], x) + 
                   noSubTree(t->F[1], x) + 
                   noSubTree(t->F[2], x);
    }
    else {
       return 0 + noSubTree(t->F[0], x) +
                  noSubTree(t->F[1], x) +
                  noSubTree(t->F[2], x);
    }
    

    在 C 中,如果两个参数相等,逻辑运算符== 的计算结果为 1,否则为 0。因此,您可以将这些案例浓缩成这样:

    return (t->chave == x) + noSubTree(t->F[0], x) +
                             noSubTree(t->F[1], x) +
                             noSubTree(t->F[2], x);
    

    希望这会有所帮助!

    【讨论】:

    • 不错的分析,但压缩 if 语句不会影响可读性吗?
    • @Sinn- 我认为这是一个判断。我个人觉得它更容易阅读,但取决于阅读/维护它的程序员群体,这可能不是一个好的选择。
    【解决方案2】:

    noSubTree() - 以根为起点 - 命中树的每个节点,但每个节点只命中一次,因此该函数的复杂度为 O(n)。

    如果您想找出搜索的复杂性,这是一个更大的问题。在平衡二叉树上的搜索具有 O(log2(n)) 的复杂度。在平衡三叉树上的搜索将是 O(log3(n))。在最坏的情况下,对不平衡树的搜索必须遍历每个节点,因此复杂度为 O(n)。

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多