订单统计树和一维点问题操作的时间复杂度

问题描述

我遇到了以下面试问题:

我们需要一个数据结构来在 X 轴上保持 n 个点,这样我们才能有效地实现 Insert(x)Delete(x)Find (a,b)(给出数量 间隔[a,b])。假设 Find(a,b) 返回的最大数量k

  1. 我们可以创建一个数据结构来执行O(log n)

    中的三个操作
  2. 我们可以创建一个数据结构,在 O(log n) 中执行 InsertDelete,在 O( k + log n).

我从一般信息中知道 Find 就像一维点上的范围(但是为了计算这个问题中的元素,即我们需要元素的数量)。例如,如果我们使用 AVL 树,那么我们将得到选项 (2) 的时间复杂度。

但是当我得知 (1) 是正确答案时,我感到很惊讶。为什么 (1) 是正确答案?

解决方法

答案确实是(1)。

AVL 树的想法很好,您的结论是正确的。但是您可以扩展 AVL 树,使每个节点都有一个额外的属性:在节点自己的值之前的值的数量。您必须在 AVL 操作(包括轮换)中注意此额外属性是否保持最新。但这可以通过恒定开销来完成,因此它不会影响 InsertDelete 的时间复杂度。

然后Find可以只搜索值为a的节点(或者最大值小于a的节点),并对值执行相同的操作b。从您发现的两个节点中,您都会获得额外的属性。这两者相减将得到所需的结果。有一些边界情况需要考虑,比如当 a 出现在树中时,那么该节点本身也应该被计算在内,否则不会。可能没有找到值小于或等于a的节点。那么在减法中缺失的属性应该被视为0。

显然这使得 Find 独立于其返回值(最多 k)。两次二分查找的时间复杂度为 O(logn)