计算AVL树算法的时间复杂度

时间:2018-05-05 14:43:25

标签: algorithm time-complexity avl-tree

我正在考虑计算以下算法的时间复杂度。 我有一个AVL树和一对两个数字(x,y),使x<y。 该算法的目的是在x和y之间打印树中的所有数字。 x和y绝对不在树中。

我的目标是制作一个运算符为O(logn + k)的算法,使得k是x和y之间的节点数,n是树中节点的总数。

我的算法是:

接收x和y的函数从树的根开始,如下所示:

如果当前节点在x和y之间 - 打印它并用(x,当前节点值)递归调用左节点,用(当前节点值,y)递归调用右节点。

如果当前节点小于x - 使用(x,y)调用右节点recursivley

如果当前节点大于y - 用(x,y)调用左节点recursivley 该函数在到达叶子(没有连接其他节点的节点)时停止。 我的功能是否符合运行时要求?

1 个答案:

答案 0 :(得分:1)

是的。您可以通过注意您的算法除了访问节点之外什么也不做,并且每个节点访问需要O(1)时间来证明它。发现该范围内的值的每次访问可以被“收费”到时间限制的O(k)部分。

但是有一些访问 - 那些发现节点小于或大于范围的访问 - 没有发现值。这些必须被“收费”到时间限制的O(log n)部分。

证明的其余部分是为了表明确实没有超过O(log n)这样的访问。关键是要显示在根的每个深度处最多可以有一个常数c。这需要一些关于BST结构的推理。我会让你玩弄细节。有O(log n)深度,因此这些访问次数为O(c log n)= O(log n)。 QED

附加说明

你的算法不必要地改变了这些值。调整很容易,以便按排序顺序发现值。我再次让你弄清楚细节。