【发布时间】:2011-04-23 09:40:33
【问题描述】:
要在 DLL(双向链表)中插入/删除具有特定值的节点,需要遍历整个列表以找到位置,因此这些操作应该是 O(n)。
如果是这样,那么 STL 列表(最有可能使用 DLL 实现)如何能够在恒定时间内提供这些操作?
感谢大家向我解释清楚。
【问题讨论】:
标签: c++ linked-list complexity-theory
要在 DLL(双向链表)中插入/删除具有特定值的节点,需要遍历整个列表以找到位置,因此这些操作应该是 O(n)。
如果是这样,那么 STL 列表(最有可能使用 DLL 实现)如何能够在恒定时间内提供这些操作?
感谢大家向我解释清楚。
【问题讨论】:
标签: c++ linked-list complexity-theory
不是。 STL 方法将迭代器带到要发生插入的位置,所以严格来说,它们是O(1),因为你给了它们位置。但是,您仍然需要自己在O(n) 中找到职位。
【讨论】:
删除任意值(而不是节点)确实是 O(n),因为它需要找到该值。删除一个节点(即当您开始知道该节点时)是 O(1)。
根据值插入 - 例如插入 排序 列表 - 将是 O(n)。如果您在现有已知节点之后或之前插入,则为 O(1)。
插入列表的头部或尾部总是 O(1) - 因为这些只是上述情况的特例。
【讨论】:
在已知位置插入和删除是O(1)。但是,找到该位置是 O(n),除非它是列表的头部或尾部。
当我们谈论插入和删除复杂性时,我们通常假设我们已经知道这将发生在哪里。
【讨论】: