具有高效查找缺失的一组密钥的数据结构

时间:2016-02-08 04:08:46

标签: algorithm data-structures

我正在寻找支持以下操作的数据结构 整数键k,范围从0到M-1。

  • O(1)或O(log n)insert(k)erase(k)lookup(k)
  • O(1)或O(log n)用于特殊操作find_missing_key(),它返回结构中当前不存在的任何键。
  • O(n)或O(n log n)空间。特别是。不应该是O(M)。

一个明显的实现是"免费密钥列表"结构,实现为堆;但这需要O(M)空间。是否有一些数据结构满足所有要求?

1 个答案:

答案 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个免费元素,无需额外费用。)