1

我有一个具有整数宽度的项目列表,可以将其解释为从左到右堆叠在一起的间隔。例如,假设项目是 A、B、C、D、E 和 F,宽度分别为 5、2、2、3、2 和 4:

例子

项目下面的数字表示从列表开始的偏移量。

我正在寻找一种有效支持这些操作的数据结构,理想情况下少于 O(n):

  • 从给定位置查找项目。例如,位置 11 的项目是 D,因为它跨越从 9 到 12,位置 14 的项目是 F,因为它从那里开始。
  • 在任何两个现有项目之间插入一个项目,或删除任何现有项目。这应该改变后续项目的位置。例如,删除项目 E 应该导致项目 F 向左移动两个位置,因此它将从 12 跨越到 16。

我正在考虑使用类似于跳过列表的东西,每个级别都存储它包含在下面级别中的宽度,但我不太确定我可以获得哪些性能特征。

有什么建议么?

4

1 回答 1

3

绳子的变种怎么样。

但它不是在叶子上有字符串,而是有间隔。

找到包含特定位置的区间将是 O(log n) (只需修改绳索的索引算法以返回叶子而不是对其进行索引)。

在任何地方插入一个项目将是 O(log n)(通过拆分一次并连接两次,所有这些都需要 O(log n))。

与跳过列表不同,跳过列表本质上是概率性的,如果你遇到一些坏运气,最坏的情况是 O(n),这些操作将是 O(log n) 保证的(假设你使用 O(log n) 平衡连接) .

于 2013-08-27T12:11:55.173 回答