【问题标题】:What are appropriate applications for a linked (doubly as well) list?链接(双重)列表的合适应用是什么?
【发布时间】:2014-03-20 18:20:31
【问题描述】:

我有一个关于数据结构基础的问题。
我知道数组的访问时间比链表快。 O(1)- arrayO(N) -linked list
但是链表在删除元素方面优于数组,因为不需要 O(N)- arrayO(1) -linked list
所以我的理解是,如果对数据的大部分操作都是删除的,那么使用链表是更可取的。
但是如果用例是:

  • 删除元素但不要太频繁
  • 访问所有元素

有明确的赢家吗?在一般情况下,我知道使用列表的缺点是我访问可能位于单独页面上的每个节点,而数组具有更好的局部性。
但这是我应该关注的理论问题还是实际问题?
混合类型,即从数组(使用额外字段)创建链表是个好主意吗?
我的问题也取决于语言吗?我假设数组中的移动元素在所有语言中具有相同的成本(至少渐近)

【问题讨论】:

  • "有明确的赢家吗?"不会。如有疑问,请尝试不同的选项并为它们计时。在链表的情况下,使用一些自定义分配器可能会很有用,可以让你的元素靠在一起
  • @NiklasB.:use some custom allocator that keeps your elements close together我从未听说过这种技术。我怎样才能找到有关此实现的信息?
  • @NiklasB.:但这假设您实际上可以自己分配内存的语言。这种方法是否依赖于语言?对于没有内存管理的语言(解释语言)是否有类似的东西
  • 对于没有指针的语言,您始终可以在某个数组中使用索引而不是指针,所以是的,它是通用的。但是如果没有原始指针,这可能会带来轻微的开销

标签: performance algorithm memory-management data-structures linked-list


【解决方案1】:

单链表非常有用,如果您执行大量插入/删除操作,相对于数组而言,单链表的性能比纯引用更好。

几十年来,我一直没有看到双向链表有很好的用途。 我想有一些。

在性能方面,永远在不了解您的特定情况相对性能的情况下做出决定。 相对而言,人们会问一些类似理发减肥的问题,这是很常见的。

在编写应用程序之前,我首先会问它应该是计算密集型还是 IO 密集型。 如果受 IO 限制,我会尝试通过避免 IO 效率低下并保持处理简单来确保它确实如此。 如果它应该是计算密集型的,那么我会查看它的内部循环可能是什么,并尝试让它变得更快。

无论如何,无论我如何尝试,都会有(有时很大)机会让它更快,找到它们我使用this technique。 无论您做什么,都不要只是尝试想一想或回到课堂笔记。 您的问题与其他人的不同,解决方案也不同。

【讨论】:

  • a lot of insertions/deletions, as opposed to pure referencing. 我假设您的意思是更新列表比访问列表更频繁?
  • @Jim:嗯,有时我不知道在我编写程序之前有多少时间用于修改/增长数组。当我发现它很大as in this example 时,我改变了数据结构。我想我想说的是——当性能诊断表明你应该改变数据结构时,愿意改变数据结构。
【解决方案2】:

列表的问题不仅在于碎片,还在于数据依赖性。如果您访问数组中的每个第 N 个元素,则您没有局部性,但是由于您知道地址,因此访问仍可能并行进入内存。在列表中,它取决于要检索的数据,因此遍历列表有效地序列化了您的内存访问,导致它在实践中要慢得多。这当然与渐近复杂性正交,并且无论大小都会对您造成伤害。

【讨论】:

  • 但是用例中的 (2) 是指访问 ALL 元素而不是 Nth 元素。要清楚地在数组或列表上执行 for(i...size)
  • @Jim,我没有说第 N 个元素,而是 每个 第 N 个元素,举个例子,数组可能变得不连续但仍然更好.遍历整个数组/列表时当然会出现同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 2013-01-31
  • 2011-09-13
  • 2010-10-14
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多