链表与向量

Linked Lists vs Vector

本文关键字:向量 链表      更新时间:2023-10-16

关于链表与向量的问题,关于效率。

我知道链表插入/删除是恒定时间,而与向量的相同操作是线性的。但是,考虑到您必须对链表执行线性搜索才能插入/删除,这最终不会成为线性操作吗?

插入/删除操作

本身是恒定的,但由于您无法在不遍历链表的情况下插入/删除,因此最终会得到线性操作。 搜索 + 插入/删除 = 线性。

所以我不明白这比矢量更有优势。对我来说,这是一样的。两者都(最终(需要线性操作才能插入/删除。

我在这里错过了什么?

插入:当我们插入向量时(假设不在末尾(,我们需要在插入 O(n( 的位置之后洗牌所有元素,而在 linkedlist 中,我们只需将前一个节点指向新节点,将新节点指向旧的下一个节点 O(1(。

到达

:在到达向量中的插入位置时,我们只需转到索引 O(1(,而在 linkedlist 中,当我们从起点漫步到该位置时,它需要 O(n(。

因此,

两者都有优点和缺点,因此,这取决于应用程序。

如果在随机位置有很多插入,一次又一次地打乱元素将是低效的,linkedlist 是一个更好的解决方案。在处理向量/链表中的复杂对象时,这一点得到了巩固。

如果插入操作次数很少,并且也是在固定位置(特别是在系列结束时(,则矢量将是更好的选择。

通常,容器的复杂性因操作而异。这些事情有很多资源。我觉得这一点已经足够清楚了。

还要考虑的一件事是内存分配样式。

矢量连续存储数据,防止缓存未命中,这可以大大加快您的应用程序速度。这样做的缺点是指向存储在向量中的数据的指针在执行常见操作时失效。有一些解决方法,例如在初始化期间保留内存,但问题仍然存在。

另一方面,链表的内存分散开来。可能存在大量缓存未命中,但指针通过插入和删除有效。

研究每个容器并选择最适合您需求的容器!