创建具有更好复杂性的二叉搜索树

时间:2016-12-11 22:03:06

标签: algorithm data-structures

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

2 个答案:

答案 0 :(得分:0)

我假设所有数字都是不同的(如果不是这样,你可以使用一对(数字,索引)代替。)

假设我们要插入我们要插入元素X。如果它是迄今为止最小/最大的元素,它清晰的地方。

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

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

  2. a没有合适的孩子或b没有左孩子。

  3. 证明:

    1. 不是这样的。让l = lca(a, b)。由于a在其左子树中,b在其右子树中,a < l < b。矛盾。

    2. a成为b的祖先。如果b有一个左孩子c。比a < c < b。矛盾(另一种情况同样处理)。

    3. 所以解决方案是这样的:

      1. 让我们保留一组已经存在于树中的元素(我的意思是一个有效的集合,其中包含低级操作,如C ++中的std::set或Java中的TreeSet)。

      2. 让我们在每次插入时(使用set的lower_bound操作在a时间内)找到bO(log N)。其中只有一个没有合适的孩子。这就是新元素的用武之地。

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

答案 1 :(得分:-1)

如果你在字典中查找单词,可以打开中途的字典并查看页面。然后,它会告诉您搜索词是否在字典的第一个或第二个半部分。重复,消除每个传球中剩余一半的一半,然后你很快将它缩小到一个单词。 40亿字词典将需要大约32遍。

二叉搜索树使用相同的原理。除了查找,您还可以插入。插入是O(log N),除非树变得退化。 为了防止树变质,你使用了一个&#34; red&#34;和&#34;黑&#34;节点(颜色只是传统的),你不允许长时间运行 要么是颜色。完整的解释在我的书“基本算法”

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

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