【问题标题】:Create a binary search tree with a better complexity创建复杂度更高的二叉搜索树
【发布时间】:2016-12-12 07:04:41
【问题描述】:

给你一个数字,它是二叉搜索树的根。然后你会得到一个包含 N 个元素的数组,你必须将其插入到二叉搜索树中。如果数组按排序顺序,时间复杂度为 N^2。我需要以更好的复杂性(比如 NlogN)获得相同的树结构。我尝试了很多但无法解决它。有人可以帮忙吗?

【问题讨论】:

  • 您是否尝试过搜索? GIVEN "Sorted list to bst" Google 产生许多结果,例如geeksforgeeks.org/sorted-linked-list-to-balanced-bst
  • @Gene 您提供的链接是到平衡 bst 的排序链表,这不是我的问题。
  • @HansSolo:您需要生成与朴素算法生成的完全相同的链接布局,还是只需要生成有效的 BST?如果您只需要生成有效的 BST,则生成平衡 BST 的算法应该可以正常工作。
  • 用小于根的元素构建一棵树,放在左边,用大于根的元素构建一棵树,放在右边。如果数组已排序,那看起来是 O(N)。
  • @PaulHankin 每次从根开始,所以如果数组是按升序或降序排序的,那将是 N^2 对吧?

标签: algorithm data-structures


【解决方案1】:

我假设所有数字都是不同的(如果不是这种情况,您可以使用一对 (number, index) 代替)。

假设我们要插入我们要插入一个元素X。如果它是迄今为止最小/最大的元素,那么它的去向很清楚。

让我们a = max y: y in tree and y < Xb = min y: y in tree and y > X。我声称:

  1. 其中一个是另一个的祖先。

  2. a 没有右孩子或b 没有左孩子。

证明:

  1. 不要这样。让l = lca(a, b)。因为a 在它的左子树中,b 在它的右子树a < l < b 中。矛盾。

  2. a 成为b 的祖先。如果b 有一个左孩子c。比a < c < b。矛盾(其他情况类似处理)。

所以解决方案是这样的:

  1. 让我们保留一组已经在树中的元素(我的意思是具有下界操作的有效集合,例如 C++ 中的 std::set 或 Java 中的 TreeSet)。

  2. 让我们在每次插入时按照上述方法找到ab(在O(log N) 时间使用集合的lower_bound 操作)。恰好其中一个没有合适的孩子。这就是新元素的所在。

总时间复杂度显然是O(N log N)

【讨论】:

  • 感谢您的回复。虽然我不太明白,但我会在周末继续工作,然后回来。谢谢。
【解决方案2】:

如果您在字典中查找一个单词,您将字典打开大约一半并查看页面。然后,它会告诉您搜索词是在字典的前半部分还是后半部分。重复一遍,每次通过消除一半剩余的单词,你很快就会把它缩小到一个单词。 40 亿个单词的词典大约需要 32 遍。

二叉搜索树使用相同的原理。除了查找之外,您还可以插入。插入是 O(log N),除非树变得退化。 为了防止树退化,您使用“红色”和“黑色”节点的系统(颜色只是常规的),并且不允许长时间运行 任何一种颜色。完整的解释在我的书《基本算法》中

http://www.lulu.com/spotlight/bgy1mm

这里有一个实现

https://github.com/MalcolmMcLean/babyxrc/blob/master/src/rbtree.c https://github.com/MalcolmMcLean/babyxrc/blob/master/src/rbtree.h

但如果你想了解红黑,你需要一些解释 树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-10-09
    相关资源
    最近更新 更多