【发布时间】:2018-10-15 20:52:18
【问题描述】:
我正在计算以下算法的时间复杂度。
我有一个 AVL 树和一对两个数字 (x,y),这样x<y。
该算法的目的是打印树中 x 和 y 之间的所有数字。
x 和 y 肯定不在树中。
我的目标是创建一个运行时间为 O(logn + k) 的算法,其中 k 是 x 和 y 之间的节点数,n 是树中节点的总数。
我的算法是这样的:
一个接收 x 和 y 的函数,从树的根开始,如下所示:
如果当前节点在 x 和 y 之间 - 打印它并用 (x,current node value) 递归调用左节点,用 (current node value,y) 递归调用右节点。
如果当前节点小于 x - 使用 (x,y) 递归调用正确的节点
如果当前节点大于 y - 使用 (x,y) 递归调用左节点 该函数在到达叶子(没有其他节点连接到它的节点)时停止。 我的函数是否满足运行时要求?
【问题讨论】:
-
最初的“当前节点”是什么?是树的根吗?
-
是的。它总是从根开始
-
我不是理论运行时计算方面的专家。但是您的算法似乎还可以,我会以同样的方式进行。你还能做什么呢?
-
我的另一个解决方案是向每个节点添加后继和前驱(按顺序)字段。然后将 x 作为节点添加到树中。找到 x 的后继者并将所有后继者从它一直打印到 y。然后从树中删除 x。事情是它更复杂(树的每个插入都是 3*logn 而不仅仅是 logn)并且算法本身是 3*logn+k。这是一个很容易计算的,所以我知道它可以工作(并且常量无关紧要,所以很好)但是如果这个解决方案满足运行时要求,它会更优雅,我宁愿使用它
标签: algorithm time-complexity avl-tree