我正在寻找支持以下操作的数据结构
整数键k
,范围从0到M-1。
insert(k)
,erase(k)
,lookup(k)
。find_missing_key()
,它返回结构中当前不存在的任何键。一个明显的实现是"免费密钥列表"结构,实现为堆;但这需要O(M)空间。是否有一些数据结构满足所有要求?
答案 0 :(得分:5)
使用二进制段树。
树中的每个节点表示一个整数范围[a,b],并且是叶子[a,a]或者分成两个节点,表示范围[a,m]和[m + 1,b]其中m是(a + b)/ 2。
只在必要时扩展节点,所以最初我们只有[0,M-1]范围的根节点(或者如果你愿意,还有[0,M])
在每个节点中,记录该子树中已使用/可用的点数。
x的插入,查找和删除是O(log n):只需保持细分直到到达[x,x],并更新从该节点到根节点的路径上的所有内容。
find_missing_key也是O(log n):由于您知道每个段的大小以及其中有多少个自由元素,因此您可以在每个节点处决定是向左还是向右以查找空闲元素。 / p>
(编辑:顺便提一下,这也允许您查找第一个,最后一个,甚至第i个免费元素,无需额外费用。)