链表与向量
Linked Lists vs Vector
关于链表与向量的问题,关于效率。
我知道链表插入/删除是恒定时间,而与向量的相同操作是线性的。但是,考虑到您必须对链表执行线性搜索才能插入/删除,这最终不会成为线性操作吗?
插入/删除操作本身是恒定的,但由于您无法在不遍历链表的情况下插入/删除,因此最终会得到线性操作。 搜索 + 插入/删除 = 线性。
所以我不明白这比矢量更有优势。对我来说,这是一样的。两者都(最终(需要线性操作才能插入/删除。
我在这里错过了什么?
插入:当我们插入向量时(假设不在末尾(,我们需要在插入 O(n( 的位置之后洗牌所有元素,而在 linkedlist 中,我们只需将前一个节点指向新节点,将新节点指向旧的下一个节点 O(1(。
到达:在到达向量中的插入位置时,我们只需转到索引 O(1(,而在 linkedlist 中,当我们从起点漫步到该位置时,它需要 O(n(。
因此,两者都有优点和缺点,因此,这取决于应用程序。
如果在随机位置有很多插入,一次又一次地打乱元素将是低效的,linkedlist 是一个更好的解决方案。在处理向量/链表中的复杂对象时,这一点得到了巩固。
如果插入操作次数很少,并且也是在固定位置(特别是在系列结束时(,则矢量将是更好的选择。
通常,容器的复杂性因操作而异。这些事情有很多资源。我觉得这一点已经足够清楚了。
还要考虑的一件事是内存分配样式。
矢量连续存储数据,防止缓存未命中,这可以大大加快您的应用程序速度。这样做的缺点是指向存储在向量中的数据的指针在执行常见操作时失效。有一些解决方法,例如在初始化期间保留内存,但问题仍然存在。
另一方面,链表的内存分散开来。可能存在大量缓存未命中,但指针通过插入和删除有效。
研究每个容器并选择最适合您需求的容器!
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 在 c++ 中具有向量的双向链表构造函数
- 使用向量初始化C++中的链表
- 创建对链表向量时 Gnu 编译器的错误:无效使用"::"
- 链表与向量
- 链表:无法访问另一个结构中的结构向量
- 链表与动态数组用于使用向量类实现堆栈
- 如何访问链表的私有向量
- C++ 链表的向量
- C++:制作链表的向量
- 如何在 C/C++ 中的向量中保存链表
- 从向量到链表C++
- 如何在C++中创建一个链表向量
- 双链表指针的双链表向量
- 带有向量的链表
- 如何在c++中转换指针向量到链表