【问题标题】:Create a binary tree in O(n)在 O(n) 中创建二叉树
【发布时间】:2021-03-10 05:29:39
【问题描述】:

我有一个包含 n 个数字的序列,我想创建一个数据结构来回答以下问题: 序列n = [5 ,7, 4, 24, 8, 3, 12, 34] 我想要min(2,5),那么答案是3,因为a2=7, a3=4, a4=24, a5=8。所以 min(i,j) 返回 (i,j) 之间最小数的位置。 我认为保存这个序列的一个好的数据结构是一个完整的二叉树来保存叶子的序列号。但是我怎样才能在 O(n) 中实现这个结构呢?

【问题讨论】:

  • 我希望在 O(n) 中创建数据结构,所有序列数都在叶子处,并且我希望在 O(登录)
  • 您正在寻找的似乎是范围最小查询。在那里,您确实可以在线性时间内构建结构,然后获得恒定时间的最小索引答案。不过,这并不是微不足道的,并且涉及到 Cartatian 树。见en.m.wikipedia.org/wiki/Range_minimum_query
  • 在 O(n) 中实现数据结构有什么问题?请澄清。

标签: algorithm data-structures tree binary-tree


【解决方案1】:

您所需要的只是一个具有范围最小查询的段树。 Here 是它的详细解释。构建时间为O(n),因为树中的节点不超过2 * n,所以最终的时间复杂度为O(n)

如果您不仅需要找到最小值,还需要找到位置,那么在顶点内部,您不仅需要存储最小值,还需要存储到达的位置。如何更新这样的结构似乎很清楚:当你重新计算父亲中的最小值时,你需要查看它是从哪个儿子接收的,并从儿子那里取最小值的对应位置。对于叶子,位置等于叶子本身的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多