为init、insert、delete、median创建一个数据库

Create a database for init,insert,delete,median

我需要创建一个在这个时间复杂度下工作的数据库:

  1. 初始化 O(1)

  2. 插入 O(logn)

  3. 删除O(logn)

  4. 求中位数 O(1)

我正在努力寻找 O(1) 中的中位数。

我创建了一个空的 AVL 树,以及 1., 2. ,3.就像具有所需时间复杂度的魅力一样工作。我想着每次对树输入时都持有一个指向中位数的指针,但是当我删除一个节点时,如何在树中找到logn中的中位数?因为我相信我做不到。它需要大约 O(n) 的时间复杂度。这意味着 3. 在更新指针以找到新的中位数后将无法使用 O(logn) 复杂度。

有什么想法吗?

此问题有多种解决方案,具体取决于您已有的解决方案:

  1. Order Statistics tree,它是二叉搜索树的变体,允许您通过顺序统计快速(对数时间)访问元素。在您的例子中,您正在寻找第 ceil(n/2) 个元素。
    虽然这意味着您会在 O(logn) 中找到中位数,但您可以在每个 insertion/deletion 之后轻松缓存它,并且它不会改变原始操作的复杂性 - 它将保持不变 O(logn).

  2. 另一种(可能更简单的)方法是使用以下观察:
    每insertion/deletion个非空集后,中位数可以做三个选项之一:
    一个。保持相同的元素。示例:1,2,3 -> 1,2,3,4 - 中位数仍然是 2,
    b。向右移动一个元素。示例:1,2,3,4 -> 1,2,3,4,5 - 中位数从 2 更改为 3
    c。向左移动一个元素。示例:1,2,3,4,5 -> 1,2,3,4(与之前相同,相反)。

假设您可以在对数时间内找到“上一个”和“下一个”元素,则只需很少的额外工作即可轻松维护指向中位数的指针。