我需要在程序中找到函数的时间复杂度。它搜索具有给定密钥的三元树的所有内部节点。这棵树是随机填充的。我想我已经设法编写代码,但我不知道如何计算复杂性。
这是树的功能和结构:
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);
}
}
}
如果有人能向我解释应该怎么做,我将非常感激。
答案 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)。