Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Binary Search Tree_Data Stream - Fatal编程技术网

Algorithm 从排序数流生成平衡二叉搜索树的最佳方法

Algorithm 从排序数流生成平衡二叉搜索树的最佳方法,algorithm,data-structures,binary-search-tree,data-stream,Algorithm,Data Structures,Binary Search Tree,Data Stream,我有一个以升序排列的整数输入流,我的任务是动态地从该流中创建一个平衡二叉搜索树。我已经通过了链接:并且了解到我们可以利用红黑树。问题是,我正在寻找使用输入数据中的“排序信息”的更优化的解决方案。如果元素是按排序的顺序出现的,那么可能最简单和最有效的方法就是将每个元素推到一个数组的末尾(例如,当数组变满时,它的大小会翻倍) 将其推入阵列是非常困难的 排序数组中的搜索使用O(log(n))进行。而且,它是对数时间,常数很低 尽管排序数组很简单,但它是一种平衡二叉搜索树。问题在于数据量未知。因此,无论

我有一个以升序排列的整数输入流,我的任务是动态地从该流中创建一个平衡二叉搜索树。我已经通过了链接:并且了解到我们可以利用红黑树。问题是,我正在寻找使用输入数据中的“排序信息”的更优化的解决方案。

如果元素是按排序的顺序出现的,那么可能最简单和最有效的方法就是将每个元素推到一个数组的末尾(例如,当数组变满时,它的大小会翻倍)

  • 将其推入阵列是非常困难的
  • 排序数组中的搜索使用O(log(n))进行。而且,它是对数时间,常数很低

  • 尽管排序数组很简单,但它是一种平衡二叉搜索树。

    问题在于数据量未知。因此,无论输入是否具有模式(升序),此树都必须是自平衡的

    如果在这种情况下O(logn)插入时间是不可接受的(比如对于红黑树),那么我不知道为什么首先需要以平衡二叉树的形式存储它。动态数组上的二进制搜索与树一样快,插入时间为O(1)


    如果事先知道流的大小,那么构建树当然会容易得多。

    如果使用红黑树,但总是从插入的最后一个节点(而不是根节点)开始插入,并且使用自底向上的插入算法,则插入是O(1)摊销的。这意味着构建树的成本是O(n),而不是Ω(n logn)。

    非常感谢@Ami和Emmett的回复。实际上,我正在寻找一种在初始化阶段使用“排序”数据流构建红黑树的方法。此流包含密钥。所以稍后,我需要对它执行随机插入/更新/删除操作。那么,有没有使用排序信息并在初始化阶段运行得更好的特定解决方案?您是否可以为我提供自底向上插入的任何资源或确切逻辑?谢谢你的解决方案,看来我必须这样做。哈哈-我从摊销插入成本中认出了你。很好的使用它在这里!