使用三元树中的给定键计算所有节点的时间复杂度?

时间:2013-11-01 00:47:26

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

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

这是树的功能和结构:

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);
       }
    }
 }

如果有人能向我解释应该怎么做,我将非常感激。

2 个答案:

答案 0 :(得分:0)

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

  • 访问每个节点的次数,
  • 每个节点访问完成了多少工作。

请注意,每次访问节点时,您的代码都会执行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);

希望这有帮助!

答案 1 :(得分:0)

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

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