有没有办法在恒定时间内移动链表的光标位置?

时间:2018-03-21 08:28:15

标签: c++ algorithm data-structures

我有一个这样的链接列表:

  

平视> A-> B-> C-> D->尾

列表中可以有N (1<N<10^5)个项目。 当前光标位置是,cursor-&gt; B,如果我们像数组那样思考,则为2。 我必须在我的列表上执行以下操作:

  • 在光标位置的列表中插入x个字符并更新 光标。
  • 删除y (y < N)字符 光标位置并更新光标。
  • 将光标移动到列表中的特定位置。

我想在恒定时间内完成所有这些操作。 任何人都可以通过建议任何数据结构模型来帮助吗?

3 个答案:

答案 0 :(得分:3)

没有。搜索/迭代在复杂度上是线性的 - O(n)。如果您想要一个复杂的常量,则需要使用不同的数据结构。由于您使用的是C ++,因此您应该使用Containers library中的一个。

答案 1 :(得分:2)

如果可以对数据进行排序,则可以使用“跳过列表”来加快速度。

原则是额外的指针用于向前跳过。

  

跳过列表是一种数据结构,允许在有序的元素序列中快速搜索。通过维护子序列的链接层次结构,可以快速搜索,每个连续的子序列跳过比前一个更少的元素...

wikipedia

  

因此,利用O(√n)额外空间,我们可以将时间复杂度降低到O(√n)。

Skip-list

答案 2 :(得分:0)

当然不可能使用链表。如前所述,链表具有线性复杂性。

您可以尝试使用更复杂的数据结构(如散列)作为列表中项目的查找容器,其复杂度为-O(n)。存储的项目可以包含显示给下一个项目的指针/索引,而不是存储项目本身。但是你必须记住删除仍然很昂贵,因为当删除一个项目时你必须刷新显示给这个项目的链接,所以项目本身需要知道,如果有任何其他项目指向它。