证明/解释算法的时间复杂度为O(h + k)

时间:2017-06-29 16:33:24

标签: algorithm tree time-complexity pseudocode asymptotic-complexity

证明/解释给定算法的时间复杂度为O(h + k)。其中h是树的高度,k是x和y(包括)之间范围内的节点数。

我知道如果k = 0(范围内没有项目),那么算法只是遍历树的高度,因此O(h)。我也知道一个节点是否在范围内,它会重复到它的两个子节点而不是其中一个节点。但这似乎有倍增效应,所以我对如何证明/解释这个问题感到困惑。

INRANGE-TREE-WALK (v, x, y)
  if v != NIL
    if v.key < x
      INRANGE-TREE-WALK(v.right, x, y)
    else if v.key 〈= y
      print v.key
      INRANGE-TREE-WALK (v.left, x, y)
      INRANGE-TREE-WALK (v.right, x, y)
    else
      INRANGE-TREE-WALK(v.left, x, y)

1 个答案:

答案 0 :(得分:1)

我假设树是二叉搜索树。

您可以查看调用该函数的当前节点的深度,然后注意,对于任何给定的深度,它将永远不会发生多个节点 v ,并且访问该深度v.key < x

尽管在不同的深度上可能会发生多次,但声称这种情况在树中相同的深度不会发生多次。

假设这个声明是假的,并且在树中的一个特定深度 d ,算法访问两个节点 a b ,它发现a.key < xb.key < x。我们还选择 a b ,以便a.key <= b.key,即 a 位于 b 的左侧

首先,请注意,访问 a b 的唯一方法是首先访问这些节点的公共祖先 p ,我们有x <= p.key <= y。否则就无法沿着树上的两个不同的分支走。

但由于这是一个二叉搜索树, p 下面右子树中的所有节点 v 的值均为v.key >= P.key,结果为{{1} }。对于节点 b 也是如此。但这与v.key >= x

的前提相矛盾

因此,我们证明了不会在同一级别上为两个节点调用该函数,并且两个节点都有b.key < x。因此,在算法的总执行中,只能找到 h 次的条件。

案例v.key < x可以得出同样的结论。

v.key > y的真实次数是多少?由于算法永远不会访问同一个节点两次(因为它只访问任何被访问节点的子节点),因此该条件为真的次数等于 k

保持x <= p.key <= y的次数。这永远不会超过访问节点数加一个。

将所有这些加在一起,我们得到一些不超过 2(2h + k)+1 的单个函数调用,并且假定执行一个函数调用 - 排除递归调用 - 是常量,我们得到 O(h + k)的时间复杂度。