为什么双向链表的加载前运行时间是O(1)?

时间:2017-07-26 19:12:07

标签: list linked-list doubly-linked-list

在数据结构中,我们说在单链表中的节点之前推送一个元素是O(n)操作!因为没有后向指针,所以我们必须一直遍历元素以获取我们要在新元素之前添加的键。因此,它具有线性运行时间。 然后,当我们引入双向链表时,我们说问题已经解决,现在因为我们在两个方向上都有指针推进之前变为恒定时间操作O(1)。 我理解逻辑,但仍然有些让我感到困惑!由于我们没有时间访问列表的元素,为了找到我们想要添加的元素,我们必须遍历前面的元素才能到达那里!确实,在双向链表中,实现add-before命令现在更快,但是,找到感兴趣的键的动作仍然是O(n)!那么为什么我们用双链表来说加之前的运算变为O(1)?

谢谢,

1 个答案:

答案 0 :(得分:0)

在C ++中,std :: list :: insert()函数使用迭代器来指示插入的位置。这意味着调用者已经有了这个迭代器,并且插入操作进行搜索,因此在恒定时间内运行。

然而,find()算法是线性的,并且是搜索列表元素的常规方法。如果需要查找+ insert,则组合为O(n)。

但是,在插入之前不需要进行搜索。例如,如果您有一个缓存(有效)迭代器,则可以在常量时间内插入(或删除)与其对应的元素。