如何在O(log N)中实现具有以下功能的数据结构?
insert(x) - 添加整数以设置
member(x) - 检查set是否包含整数x
删除(x) - 从集合
中删除整数xdeleteLessThan(x)的 删除所有等于或小于k的数字
我唯一能想到的是使用某种平衡的BST来获取插入,成员和删除的O(log N)。
deleteLessThan()函数将如下所示:找到大于k的最小元素,删除其左子树然后重新平衡。但是,如果删除其中一个子树,是否可以在O(log N)中重新平衡BST?
答案 0 :(得分:2)
摊销的log N足够好吗?在这种情况下,您可以使用splay树。除了删除元素< = k之外的所有操作都在维基百科上解释。对于剩余的操作,将大于k的最小元素展开到顶部,并删除其左子树。
如果您允许摊销,您可以轻松地在O(M)时间内删除N个节点中的M个。