Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 创建具有更高复杂性的二叉搜索树_Algorithm_Data Structures - Fatal编程技术网

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

Algorithm 创建具有更高复杂性的二叉搜索树,algorithm,data-structures,Algorithm,Data Structures,您将得到一个数字,它是二叉搜索树的根。然后给您一个包含N个元素的数组,您必须将其插入到二进制搜索树中。如果数组按排序顺序排列,则时间复杂度为N^2。我需要以更高的复杂度获得相同的树结构(比如NlogN)。我试了很多次,但都没能解决。有人能帮忙吗?如果你在字典里查一个单词,你可以在大约一半的时候打开字典,看看这一页。然后告诉你搜索词是在词典的前半部分还是后半部分。重复一遍,每次都把剩下的单词去掉一半,很快你就会把它缩小到一个单词。40亿字字典将需要大约32遍 二叉搜索树使用相同的原理。除了查找外,

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

如果你在字典里查一个单词,你可以在大约一半的时候打开字典,看看这一页。然后告诉你搜索词是在词典的前半部分还是后半部分。重复一遍,每次都把剩下的单词去掉一半,很快你就会把它缩小到一个单词。40亿字字典将需要大约32遍

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

这里有一个实现

但是如果你想了解红黑,你需要一些解释
树。我假设所有的数字都是不同的(如果不是这样,你可以使用一对(数字,索引)

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

让我们来看看
a=max y:y在树中,y
b=min y:y在树中,y>X
。我声称:

  • 其中一个是另一个的祖先

  • a
    没有右边的子项,或者
    b
    没有左边的子项

  • 证明:

  • 不要这样。让
    l=lca(a,b)
    。由于
    a
    在其左子树中,
    b
    在其右子树中,
    a
    。矛盾

  • a
    成为
    b
    的祖先。如果
    b
    有一个左子女
    c
    。而不是
    a
    。矛盾(另一种情况处理类似)

  • 所以解决方案是这样的:

    > P>让我们保存一组已经在树中的元素(我的意思是一个有效的集合,如下标的下限操作,如<代码> STD::C++中的SET<代码>或<代码>树目录>爪哇>)
  • 让我们在每次插入时(在
    O(logn)
    时间中使用集合的下界操作)查找如上所述的
    a
    b
    。他们中正好有一个没有合适的孩子。这就是新元素的发展方向


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

    您是否尝试过搜索?给定“排序列表到bst”,Google会生成许多结果,例如@Gene您提供的链接是到平衡bst的排序列表,这不是我的问题。@HansSolo:您需要生成与naive算法完全相同的链接布局,还是只需要生成有效的bst?如果您只需要生成一个有效的BST,那么生成平衡BST的算法应该可以很好地工作。构建一个元素小于根的树并将其放在左侧,构建一个元素大于根的树并将其放在右侧。如果数组被排序,它看起来是O(N)@paulhank每次从根开始,那么如果数组按升序或降序排序,它将是N^2,对吗?谢谢你的回复。虽然我还没有完全明白这一点,但我会在周末完成这项工作,然后回来。谢谢