Algorithm 在二叉树的O(1)中求中值

Algorithm 在二叉树的O(1)中求中值,algorithm,data-structures,language-agnostic,binary-search-tree,Algorithm,Data Structures,Language Agnostic,Binary Search Tree,假设我有一个平衡的BST(二进制搜索树)。每个树节点都包含一个特殊字段count,该字段统计该节点的所有子节点+节点本身。他们称这种数据结构为顺序统计二叉树 此数据结构支持O(logN)的两种操作: rank(x)——小于x的元素数 findByRank(k)——查找具有rank=k 现在我想添加一个新的操作median()来查找中值。如果树是平衡的,我是否可以假定此操作为O(1)?如果树是完整的(即所有级别都完全填满),则可以。除非树是完整的,否则中间值可能是叶节点。因此,在一般情况下,成

假设我有一个平衡的BST(二进制搜索树)。每个树节点都包含一个特殊字段
count
,该字段统计该节点的所有子节点+节点本身。他们称这种数据结构为顺序统计二叉树

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

  • rank(x)
    ——小于
    x的元素数
  • findByRank(k)
    ——查找具有
    rank
    =
    k

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

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

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

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

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


如果需要,您可以通过使用a来减少在插入/删除到O(1)期间更新中值指针的成本,但插入/删除仍然是O(对数N)。

我认为中值将是树的根EI同意Gir。但这只有在树完全平衡的情况下才是正确的。如果一棵树是平衡的,但没有完成呢?你可以使用计数来决定走哪条路。在这种情况下不确定O(1)though@Michael这取决于您对平衡的定义,如果您知道根的两个子树的子树数完全相同,则根将是中位数。@AndreasBrinck“balanced”这意味着每个节点的左、右子树的高度相差不超过1。@Michael在这种情况下,我不认为查找中值将是一个O(1)运算。是的,我们可以实现一种特殊的数据结构来查找O(1)中的中值,如您所建议的2个二进制堆或跳过列表。我想知道我是否可以用增强平衡BST来做。