树恢复程序的递归运行时

时间:2016-02-16 00:48:54

标签: c++ algorithm recursion runtime analysis

我试图弄清楚我想出的递归算法的运行时间。给定preOrder和inOrder遍历树的算法找到postOrder遍历。这是我的算法:

Recovery(preOrder, inOrder):
  root = preOrder[0]
  rootIndex = inOrder.find(root)

  if preOrder.length <= 0
      return;

  leftPreord = preOrder[1...rootIndex]
  leftInord = inOrder[0...rootIndex]
  rightPreord = preOrder[rootIndex + 1 ... End]
  rightInord = inOrder[rootIndex + 1 ... End]

  Recovery(leftPreord, leftInord)
  Recovery(rightPreord, rightInord)

  print preOrder[0]

我的问题是这个算法与MergeSort算法O(nlogn)的运行时间基本相同。

算法的非递归部分(主要是.find()运算符)在O(n)时间内运行,然后两个递归调用在T(n / 2)时间内运行。因此,T(n)= T(n / 2)+ O(n)。树的高度是log n,每个级别在n次运行,因此O(nlogn)。我唯一担心的是,对于每次递归调用,技术上都是T((n-1)/ 2),因为我们将当前的根留下。这有什么不同吗?

1 个答案:

答案 0 :(得分:0)

你的逻辑是合理的。每次迭代的步骤包括O(1)和O(n)操作的总和。这些的总和只是任何步骤的最高阶:O(n)。你有log(n)[base2]级别,确实会给你一个O(n log n)的算法。

很好的推理。