代码之家  ›  专栏  ›  技术社区  ›  Joonas Pulakka

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

  •  3
  • Joonas Pulakka  · 技术社区  · 14 年前

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

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

    什么样的数据结构可以很好地描述这种索引范围?一个明显的解决方案是制作另一个“索引中介器”数组,它包含从基于连续性零的索引到上面的新坐标的映射,但是这感觉非常浪费,因为它中的几乎所有元素都只是简单的序号,只有偶尔的“跳跃”。另外,如果我发现了,我想修改一下范围怎么办?必须重建整个索引数组。不太好。

    需要注意的几点:

    • 范围永远不会重叠。如果一个新的范围被添加到数据结构中,并且它与现有的范围重叠,则整个事物应该被合并。也就是说,如果我在上面的示例中添加 {300... 308} ,它应该将最后两个范围替换为 {250...310} .
    • 简单地说 在整个范围内。
    • 直接查询一个值也应该相对便宜:“给我对应于映射坐标中第42个索引的原始索引”。
    • 应该有可能(虽然可能不太便宜)以另一种方式工作:“给我对应于原始坐标中42的映射坐标,或者告诉我它是否已映射。”

    在我自己的解决方案之前,我想知道是否存在一个众所周知的数据结构,巧妙地解决了这一类问题。

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  2
  •   Gilbert Le Blanc    14 年前

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

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

    例如,当删除10时,拆分将不得不将(6,12)整数对更改为(6,9)(11,12)。

    另外,如果我发现了,我想修改一下范围怎么办?必须重建整个索引数组。不太好。

    是的。可能需要更改一个整数对。最坏的情况是,必须重建整个数组或列表。