【问题标题】:Time complexity of creating a BST with minimal height given a sorted array with elements in increasing order给定元素按升序排列的排序数组,创建具有最小高度的 BST 的时间复杂度
【发布时间】:2014-09-02 19:35:44
【问题描述】:

我尝试通过两种方式解决这个问题。 最明显的解决方案是使用 BST 的标准插入操作,从根节点开始,递归地进一步进行。但是,插入每个节点需要log N 时间。因为我必须为 N 个节点做这件事,所以我完全需要NlogN。 所以我想到了如何切断几个调用,这样我就不需要遍历整个树来插入每个节点。 在这种方法中,在插入根之后,我只通过数组的一半(左半边)生成左子树,数组的右半边(右半边)生成右子树。 它的代码如下:

public static TreeNode createMinBST(int arr[], int start, int end){
 if (end < start) {
 return null;
 }
 int mid = (start + end) / 2;
 TreeNode n = new TreeNode(arr[mid]);
 n.left = createMinBST(arr, start, mid - 1);
 n.right = createMinBST(arr, mid + 1, end);
 return n;
 }

这个,我很容易上来。但我发现很难分析这段代码的运行时间。请问有什么帮助吗? 您能否也说明一下如何到达运行时,以便我可以将该分析重用于其他问题?

【问题讨论】:

    标签: data-structures big-o time-complexity binary-search-tree


    【解决方案1】:

    该算法运行时间为 O(n)。这里有两种查看方式。

    首先,您可以注意到对函数的每次调用都会在 O(1) 时间内运行,并且每次调用都会“用完”其中一个节点。这意味着总共只能有 O(n) 次调用,因此总工作量将是 O(n)。

    或者,您可以使用主定理。您的函数执行 O(1) 工作并对大小(大致)n / 2 的子数组进行两次调用,因此您得到了递归

    T(n) = 2T(n / 2) + O(1)

    根据主定理,这解决了 O(n)。

    希望这会有所帮助!

    【讨论】:

    • 感谢@templatetypedef。我对时间复杂度的理解现在有了更多的发展!!!
    【解决方案2】:

    T(n) 成为createMinBST 接受大小为n = end - start 的输入的时间。我们可以为T(n)写一个递归关系如下:

    T(0) = a
    T(n) <= 2T(floor(n/2)) + b
    

    注意我是故意写&lt;=的;只有当两个递归调用具有相同的大小时,我们才会有相等性,只有当整体大小是奇数时才会发生这种情况。为此,要一直沿递归树向下工作,您将被限制为S = 1, 3, 7, ..., S(n-1)*2 + 1, ... 形式的初始大小。但是,我们可以随意假设这个输入大小,因为它是最坏的情况(将不到一半的元素传递给其中一个递归调用并不比将相同的元素传递给两个调用更糟糕)。

    我们可以通过多种方式在这里找到解决方案。我们可以写出一些术语,进行猜测并通过归纳来证明。以下是一些术语:

    T(0) = a
    T(1) <= 2T(0) + b = 2a + b                 = 2a + b
    T(2) <= 2T(1) + b = 4a + 2b + b            = 4a + 3b
    T(4) <= 2T(2) + b = 8a + 4b + 2b + b       = 8a + 7b
    T(8) <= 2T(4) + b = 16a + 8b + 4b + 2b + b = 16a + 17b
    ...
    T(n) <= (2n)a + (2n-1)b = 2(a+b)n - b
    

    我作为练习离开,以表明此解决方案适用于所有n。当然,这个的渐近界是O(n)

    一旦你有一个很好的递归关系,你也可以使用“主方法”。

    提出递归关系如下:

    1. 确定基本情况,以及这些情况的T(n) 的固定值。
    2. 对于递归情况,找出递归调用的数量和每个问题的大小。

    在分析递归关系时,确定最坏的情况(如果这是您感兴趣的界限)并确保您的关系对于该情况是正确的。然后,使用任何方法来解决您喜欢的递归关系。如果您想列出术语,猜测然后证明解决方案,请选择易于计算的值;在我的例子中,二的幂有效,但其他递归关系可能有不同的模式(事实上,在这里,我们可以使用更精确的方程并选择 1、3、7、15、.. .).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2021-08-12
      相关资源
      最近更新 更多