【发布时间】:2016-09-11 19:07:06
【问题描述】:
我需要创建一个在这种时间复杂度下工作的数据库:
初始化 O(1)
插入 O(logn)
删除 O(logn)
求中位数 O(1)
我正在努力寻找 O(1) 中的中位数。
我创建了一个空的 AVL 树,以及 1.、2.、3。像具有所需时间复杂度的魅力一样工作。我想过每次输入树时都持有一个指向中位数的指针,但是当我删除一个节点时,如何在树中找到 logn 中的中位数?因为我相信我做不到。这将需要大约 O(n) 的时间复杂度。这意味着 3. 在更新指针以找到新的中位数后将无法使用 O(logn) 复杂度。
有什么想法吗?
【问题讨论】:
-
我认为每个节点都有子树大小的二叉树可以满足这个要求。
-
@GordonLinoff 所以每个节点都会有一个叫做'size'的字段,然后n/2值节点就是中位数?
-
我相信一对平衡的二进制最小/最大堆,每个堆包含一半的集合,这样中位数是较大堆的顶部或两者的平均值,带有用于删除的反向指针,应该做这个把戏
标签: algorithm data-structures median avl-tree