【问题标题】:calculating the time complexity of an AVL tree algorithm计算 AVL 树算法的时间复杂度
【发布时间】: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


【解决方案1】:

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

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

剩下的证明是证明确实不超过 O(log n) 次这样的访问。关键是要表明在从根开始的每个深度处最多可以有一个常数 c。这需要对 BST 的结构进行一些推理。我会让你享受解决细节的乐趣。有 O(log n) 个深度,所以这些访问的次数是 O(c log n) = O(log n)。 qed

补充说明

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

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2015-02-20
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多