【问题标题】:Find median in O(1) in binary tree在二叉树中找到 O(1) 中的中位数
【发布时间】:2012-08-12 04:39:42
【问题描述】:

假设我有一个平衡的 BST(二叉搜索树)。每个树节点都包含一个特殊字段count,它计算该节点的所有后代+节点本身。他们称这种数据结构为order statistics binary tree

该数据结构支持O(logN)的两种运算:

  • rank(x) -- 小于 x 的元素数量
  • findByRank(k) -- 找到 rank == k 的节点

现在我想添加一个新操作median() 来查找中位数。如果树是平衡的,我可以假设这个操作是 O(1) 吗?

【问题讨论】:

  • 我认为中位数是树的根
  • 我同意吉尔。但这只有在树完全平衡的情况下才是正确的。

标签: algorithm data-structures language-agnostic binary-search-tree


【解决方案1】:

除非树是完整的,否则中位数可能是叶节点。所以在一般情况下,成本将是 O(logN)。我猜有一个具有请求属性和 O(1) findMedian 操作的数据结构(可能是一个跳过列表 + 一个指向中间节点的指针;虽然我不确定 findByRank 和 rank 操作)但平衡的 BST 不是其中之一。

【讨论】:

  • 是的,我们可以实现一个 special 数据结构来找到 O(1) 中的中位数,例如2个二进制堆或您建议的跳过列表。我想知道我是否可以使用增强的平衡 BST 来做到这一点。
【解决方案2】:

如果树是完整的(即所有级别都完全填充),是的,你可以。

【讨论】:

  • 如果树是平衡的但不是complete怎么办?
  • 您可以使用计数来决定旅行的方式。不过在这种情况下不确定 O(1)
  • @Michael 这取决于你对平衡的定义,如果你知道根的两个子树的子树数量完全相同,那么根将是中位数。
  • @AndreasBrinck "balanced" 表示每个节点的左右子树的高度相差不超过1。
  • @Michael 在那种情况下,我认为找到中位数不是 O(1) 操作。
【解决方案3】:

在平衡顺序统计树中,找到中位数是 O(log N)。如果在 O(1) 时间内找到中位数很重要,您可以通过维护指向中位数的指针来扩充数据结构。当然,问题是您需要在每次插入或删除操作期间更新此指针。更新指针需要 O(log N) 时间,但由于这些操作已经花费 O(log N) 时间,更新中值指针的额外工作不会改变它们的大 O 成本。

实际上,与插入/删除次数相比,这仅在您执行大量“查找中值”操作时才有意义。

如果需要,您可以使用(doubly) threaded binary tree 将插入/删除期间更新中间指针的成本降低到 O(1),但插入/删除仍将是 O(log N)。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 2015-05-11
    • 2017-11-13
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2021-03-10
    相关资源
    最近更新 更多