在二叉树中找出O(1)的中位数

时间:2012-08-10 12:19:34

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

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

此数据结构支持O(logN)的两个操作:

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

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

3 个答案:

答案 0 :(得分:2)

除非树完整,否则中值可能是叶节点。因此,一般情况下,成本将为O(logN)。我想有一个带有请求属性和O(1)findMedian操作的数据结构(也许是跳过列表+指向中间节点的指针;虽然我不确定findByRank和排名操作)但是平衡的BST不是其中之一。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

实际上,只有与插入/删除次数相比进行大量“查找中位数”操作才有意义。

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