【问题标题】:the REAL use of the linked list in TODAY'S world [duplicate]当今世界中链表的真正用途[重复]
【发布时间】: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


【解决方案1】:

我不会评论您的具体情况,但是是的,在“现实”世界中,在“当今”硬件上,有很多实例可以使用链表。

一个例子:mallocfree 的实现(即动态内存分配器)通常使用链表跟踪可用内存块。 每个内存块中包含一些额外的字节,用于链表指针。这样,空闲块本身可以链接在一起,而无需在其他地方分配任何额外的内存来跟踪它们(正如向量所要求的那样)。

这意味着分配器只需要一个常量的内存来保存它自己的内部记录。否则,您的动态分配器本身将需要使用动态分配器来增加其空闲列表(实际上是“空闲向量”)。

Linux 内核(可能还有其他操作系统内核)在很多事情上都使用链表。我猜如果它使用向量,当它必须增长向量时可能会导致不希望的延迟峰值(如果它发生在持有一些重要的锁或屏蔽中断等时会非常糟糕)。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2023-04-04
    • 2010-10-14
    • 2014-11-22
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多