【问题标题】:Is there no way to insert to an STL list in O(1) time?有没有办法在 O(1) 时间内插入 STL 列表?
【发布时间】:2023-03-08 03:59:01
【问题描述】:

理论上,您应该能够在 O(1) 时间内将任意位置插入到列表中(在您选择的索引处)。但是,当使用 STL 列表时,您需要在迭代器位置插入,据我了解,迭代器位置必须增加 O(n) 次才能将其设置为所需的索引。我傻眼了,为什么会这样,肯定是我弄错了,有办法更快吗?

【问题讨论】:

  • 列表实际上没有索引。您对列表的理解似乎存在根本缺陷。也许您想要std::vector
  • 一个std::list是一个双链表。像任何其他链表一样,遍历到第 N 个元素是 O(N)。如果你已经有一个迭代器指向你想要插入新元素的位置,那么它就是O(1)
  • 不,你误解了(虽然这是一个常见的误解)。使用链表,您可以在给定的 节点 的位置以恒定的时间插入。确定该节点平均需要线性时间。
  • 如果您尝试使用您想要的插入类型为自己编写一个列表,这可能有助于解决您的困惑。你会在某个时候卡住,而那个确切的点就是你问题的答案。
  • “在链表中插入是一个常数时间操作”似乎是你在职业生涯早期学习的那些口头禅之一,就在忘记它为真的条件之前。你可以找到Stroustrup 最近的一段在线视频,他在视频中分享了他对随机列表插入与向量相比有多慢的惊讶。

标签: c++ list stl


【解决方案1】:

我错了

不,你没看错。

有没有更快的方法?

只有通过捕获先前调用插入的返回值来缓存要插入的位置,才能更快地执行此操作。如果您除了要插入的列表和索引之外没有其他信息,那么O(n) 是您唯一的选择,而n 是您要插入的索引。

【讨论】:

    猜你喜欢
    • 2017-07-30
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2020-07-19
    相关资源
    最近更新 更多