列出数据结构以允许查询“x之前是否发生x”

时间:2014-01-15 09:57:36

标签: data-structures

我有一个64位有符号整数的列表,例如[10232,10233,10234,10400,10235,10236,10401]

哪种数据结构最合适,因为我需要对其进行以下操作(按操作频率排序)

  1. 查询列表中的另一个号码是否出现在另一个号码之前(例如10235之前的10233)
  2. 从前面删除
  3. 追加到最后
  4. 在列表中的任何位置插入一个数字(例如,在10234之后插入10402)。 sentinel值用于表示它应该插入列表的顶部。
  5. 删除列表中任意位置的数字

1 个答案:

答案 0 :(得分:1)

使用a rope之类的节点的整数映射。

绳索是二叉树。它实际上用于字符串,但我们可以使用它进行微小的更改。

让每个节点的“权重”等于1加上其左子树中所有节点的总和。每个节点的值由这些权重隐式定义,并且对应于列表中的索引。在确定这些值时,我们从根节点到目标节点,如果我们向右移动或者我们正在寻找的节点是目标节点,则将权重相加。

每个节点还需要有一个指向其父节点的指针(因此我们能够确定某个给定节点的索引)。

使用这些结构组合,O(log n)将支持所有操作。

通过查询树中的两个数字的索引并比较它们,查询是否在一个数字出现之前可以完成另一个数字。通过首先获得索引,然后在该索引处加上1来插入数字,可以类似地插入一个数字。

例如,如果我们有这样的树:

       .
     /   \
    .     .
   / \   / \
  .   . .   .
 /   /   \
.   .     .

权重将是:

       6
     /   \
    3     3
   / \   / \
  2   2 1   1
 /   /   \
1   1     1

节点的值将是:

       6
     /   \
    3     9
   / \   / \
  2   5 7   10
 /   /   \
1   4     8

要在上面的树中获取7,我们从根开始并添加6,因为我们正确。然后我们走了,所以无事可做。然后我们在目标节点,并且没有左子树,所以我们添加1,给我们7