【发布时间】:2015-01-07 16:29:44
【问题描述】:
我已经花了很多时间来回考虑应该使用向量还是链表。我一直在阅读有关该主题的许多完全矛盾的观点,因此我想根据REAL世界中的TODAY'S硬件给出一个严格的答案。
所以有人告诉我,如果您在序列中间进行大量插入和删除,那么链表将是理想的,其复杂性为 O(1)(这本身我并不完全理解,因为无论如何您都必须一直遍历到所需位置),而插入向量显然非常慢,复杂度为O(n)
另一方面,看了 Bjarne Stroustrup https://www.youtube.com/watch?v=YQs6IC-vgmo 的这个讲座后,似乎链表并没有真正的用处,而使用链表是因为会有很多插入而删除实际上只能由一个天真的学生实施。我从中得到的是,本质上,由于链表遍历的性质,它在遍历内存中的不同位置时执行了多次随机访问,而向量执行一次随机访问,将您直接发送到所需的位置。这个解释准确吗?
在我的实现中,序列是为了保持顺序,每帧都会更新每个元素的新值,因此会进行大量删除和插入。
我的问题是: 链表真的还有用吗?就算是为了维持秩序,也不是单纯的勉强过关?
背景信息:
- 该序列用于 2D 扫描和修剪宽相位碰撞检测;
- 序列中元素数量的上限约为 30,000
【问题讨论】:
-
如果您的插入和删除发生在彼此相对的两端(例如队列),并且您不需要访问任意位置的元素。
-
我可以给你一个直截了当的答案,但它会立即受到其他用户的质疑,这毕竟会让它变得不那么直截了当。
-
您对 Bjarne 的解释是正确的,您的评论“这本身我并不完全理解”也是正确的;在链表中的任意位置插入是 O(n),内存局部性比向量差得多。
-
似乎是一项优化/工程任务。为自己做出基于证据的决定,而不是基于“只有傻瓜才会使用那种”的情绪——所以在清晰的 A/B 测试中自己测试一下。您的程序如何使用链表与向量?您将了解情况以及问题对性能的影响有多大——如果性能影响低于 0.1%,这真的很重要吗?
-
@CharlesHetterich:不,我所说的“已知位置”是指一个位置,您有一个迭代器可以准确地告诉您要在链表中去哪里。在这种情况下,插入/移除是恒定的时间。
标签: c++ algorithm sorting vector linked-list