时间复杂度(重复)[来自前序遍历的BST构造]

时间:2015-07-28 17:39:52

标签: algorithm time-complexity recurrence

我正在执行从给定的前序遍历构造BST的程序。我想到了递归逻辑,这是解决这个问题的天真方法。 对于预订,根将始终是遍历中的第一个节点。并且值开始大于根的点表示右子树,类似于小于root的值表示它们存在于左子树中。 由于两个子树中的节点不一定是总节点的一半,因此递归关系变得有点像这样:

T(n)= T(k)+ T(n-k)+ c [每次递归调用的常量工作] 假设左/右子树中的k个节点和另一个中的n-k。

此帖子的方法1表达了类似的方法:http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversa/

该方法的时间复杂度为O(n ^ 2),这让我感到困惑,因为我无法解决上述递归关系,其中每个子树中的节点数可能会有所不同,或者可能会再次发生制定不正确。

我很欣赏任何关于此的指导,我在这里查找了主要定理和其他类似的问题,以获得复发问题的时间复杂性,但仍然无法解决上述问题。感谢。

1 个答案:

答案 0 :(得分:1)

T(n) = T(k) + T(n-k) + c描述了O(n)解决方案。问题的最佳解决方案确实是O(n)。帖子http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversa/中描述的第二个算法是O(n)中解决此问题的一个示例。

O(n^2)复杂度适用于您所包含的帖子中描述的第一个算法。在该算法中,每个节点都有一个O(n)步骤来确定左右子树之间的分区: 请注意以下几行:

...
for ( i = low; i <= high; ++i )
    if ( pre[ i ] > root->data )
       break;
...

因此,在此版本中,算法应描述为T(n) = T(k) + T(n-k) + c + n,其中描述了O(n^2)算法。