假设我有一个平衡的BST(二叉搜索树)。每个树节点都包含一个特殊字段count
,它计算该节点的所有后代+节点本身。他们称这个数据结构为order statistics binary tree
。
此数据结构支持O(logN)的两个操作:
rank(x)
- 小于x
findByRank(k)
- 找到rank
== k
现在我想添加一个新操作median()
来查找中位数。如果树是平衡的,我可以假设此操作是O(1)吗?
答案 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)。