假设我有一个长度为400的整数索引数组,我想从头开始删除一些元素,从末尾删除一些元素,从中间删除一些元素,但实际上没有改变原始数组。也就是说,我不想使用索引{0...399}
循环遍历数组,而是想使用分段连续范围,例如
{3...15} ∪ {18...243} ∪ {250...301} ∪ {305...310}
描述这种索引范围的良好数据结构是什么?一个显而易见的解决方案是创建另一个“索引介体”数组,其中包含从连续的从零开始的索引到上面的新坐标的映射,但它感觉非常浪费,因为它中的几乎所有元素都只是序列号,偶尔只有几个“跳跃”。此外,如果我发现,哦,我想稍微修改范围怎么办?必须重建整个索引数组。不太好。
需要注意几点:
{300... 308}
,则应使用{250...310}
替换最后两个范围。在推出自己的解决方案之前,我想知道是否存在一个众所周知的数据结构,可以优雅地解决这类问题。
谢谢!
答案 0 :(得分:2)
似乎数组或整数对列表将是最佳数据结构。您可以选择该对的第二个整数是终点还是第一个整数的计数。
编辑:进一步思考,这个问题正是数据库索引必须要做的。如果整数对不必按数字顺序排列,则可以更轻松地处理拆分。如果数字序列必须保持有序,则需要一个数据结构,允许您将整数对添加到数组或列表的中间。
作为一个例子,当删除10时,拆分必须将(6,12)整数对更改为(6,9)(11,12)。
此外,如果我发现,哦,我想稍微修改范围怎么办?必须重建整个索引数组。不太好。
真。也许一个整数对需要改变。最糟糕的情况是,你必须重建整个数组或列表。