数据结构表示分段连续范围?

时间:2010-11-16 13:34:26

标签: data-structures indexing range

假设我有一个长度为400的整数索引数组,我想从头开始删除一些元素,从末尾删除一些元素,从中间删除一些元素,但实际上没有改变原始数组。也就是说,我不想使用索引{0...399}循环遍历数组,而是想使用分段连续范围,例如

{3...15} ∪ {18...243} ∪ {250...301} ∪ {305...310}

描述这种索引范围的良好数据结构是什么?一个显而易见的解决方案是创建另一个“索引介体”数组,其中包含从连续的从零开始的索引到上面的新坐标的映射,但它感觉非常浪费,因为它中的几乎所有元素都只是序列号,偶尔只有几个“跳跃”。此外,如果我发现,哦,我想稍微修改范围怎么办?必须重建整个索引数组。不太好。

需要注意几点:

  • 范围从不重叠。如果将新范围添加到数据结构中,并且它与现有范围重叠,则整个范围应该合并。也就是说,如果我在上面的示例中添加范围{300... 308},则应使用{250...310}替换最后两个范围。
  • 在整个范围内简单地循环应该非常便宜。
  • 直接查询值也应该相对便宜:“在映射坐标中给我对应于第42个索引的原始索引”。
  • 以其他方式工作应该是可能的(尽管可能不是很便宜):“给我在原始坐标中对应于42的映射坐标,或者告诉我它是否被映射。”

在推出自己的解决方案之前,我想知道是否存在一个众所周知的数据结构,可以优雅地解决这类问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

似乎数组或整数对列表将是最佳数据结构。您可以选择该对的第二个整数是终点还是第一个整数的计数。

编辑:进一步思考,这个问题正是数据库索引必须要做的。如果整数对不必按数字顺序排列,则可以更轻松地处理拆分。如果数字序列必须保持有序,则需要一个数据结构,允许您将整数对添加到数组或列表的中间。

作为一个例子,当删除10时,拆分必须将(6,12)整数对更改为(6,9)(11,12)。

  

此外,如果我发现,哦,我想稍微修改范围怎么办?必须重建整个索引数组。不太好。

真。也许一个整数对需要改变。最糟糕的情况是,你必须重建整个数组或列表。