【问题标题】:Is time complexity for insertion/deletion in a doubly linked list of order O(n)?在 O(n) 的双向链表中插入/删除的时间复杂度是多少?
【发布时间】:2011-04-23 09:40:33
【问题描述】:

要在 DLL(双向链表)中插入/删除具有特定值的节点,需要遍历整个列表以找到位置,因此这些操作应该是 O(n)。

如果是这样,那么 STL 列表(最有可能使用 DLL 实现)如何能够在恒定时间内提供这些操作?

感谢大家向我解释清楚。

【问题讨论】:

    标签: c++ linked-list complexity-theory


    【解决方案1】:

    不是。 STL 方法将迭代器带到要发生插入的位置,所以严格来说,它们是O(1),因为你给了它们位置。但是,您仍然需要自己在O(n) 中找到职位。

    【讨论】:

      【解决方案2】:

      删除任意值(而不是节点)确实是 O(n),因为它需要找到该值。删除一个节点(即当您开始知道该节点时)是 O(1)。

      根据值插入 - 例如插入 排序 列表 - 将是 O(n)。如果您在现有已知节点之后或之前插入,则为 O(1)。

      插入列表的头部或尾部总是 O(1) - 因为这些只是上述情况的特例。

      【讨论】:

        【解决方案3】:

        在已知位置插入和删除是O(1)。但是,找到该位置是 O(n),除非它是列表的头部或尾部。

        当我们谈论插入和删除复杂性时,我们通常假设我们已经知道这将发生在哪里。

        【讨论】:

        • +1 - 除非它是列表的头部或尾部。 - 找到列表中的第二个位置也是 O(1)。第三个位置....
        • 通过归纳,在列表中找到第 n 个位置是 O(1)...嘿等等! :p
        猜你喜欢
        • 2019-10-05
        • 1970-01-01
        • 2014-05-01
        • 2011-09-03
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2014-09-13
        相关资源
        最近更新 更多