Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 链接(双重)列表的适当应用是什么?_Performance_Algorithm_Memory Management_Data Structures_Linked List - Fatal编程技术网

Performance 链接(双重)列表的适当应用是什么?

Performance 链接(双重)列表的适当应用是什么?,performance,algorithm,memory-management,data-structures,linked-list,Performance,Algorithm,Memory Management,Data Structures,Linked List,我有一个关于数据结构基础知识的问题。 我知道数组的访问时间比链表快O(1)-数组vsO(N)-链表 但是链表在删除元素方面胜过数组,因为不需要移动O(N)-arrayvsO(1)-linked list 因此,我的理解是,如果对数据的大多数操作都是删除操作,则最好使用链表。 但如果用例是: 删除元素,但不要太频繁 访问所有元素 有明确的赢家吗?在一般情况下,我理解使用列表的缺点是,我访问每个节点,这些节点可能位于单独的页面上,而数组具有更好的局部性。 但这是我应该关注的理论问题还是实际问题?

我有一个关于数据结构基础知识的问题。
我知道数组的访问时间比链表快<代码>O(1)-数组vs
O(N)-链表

但是链表在删除元素方面胜过数组,因为不需要移动
O(N)-array
vs
O(1)-linked list

因此,我的理解是,如果对数据的大多数操作都是删除操作,则最好使用链表。
但如果用例是:

  • 删除元素,但不要太频繁
  • 访问所有元素
有明确的赢家吗?在一般情况下,我理解使用列表的缺点是,我访问每个节点,这些节点可能位于单独的页面上,而数组具有更好的局部性。
但这是我应该关注的理论问题还是实际问题?
混合类型,即从数组(使用额外字段)创建链接列表,好主意吗?

我的问题也取决于语言吗?我假设数组中的元素移位在所有语言中都有相同的代价(至少是渐进的)

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

如果您要进行大量插入/删除,而不是纯粹的引用,则单链表非常有用,并且相对于数组,它的性能会更好

我已经几十年没有看到双链接列表的良好用途了。 我想有一些

就绩效而言,在不了解特定情况的相对绩效的情况下,决不要做出决策。 这是相当常见的看到人们问的事情,相对来说,像理发减肥

在编写一个应用程序之前,我首先问它应该是计算绑定还是IO绑定。 如果IO绑定,我会通过避免IO中的低效,并保持处理的简单性来确保它实际上是绑定的。 如果它应该是计算约束的,那么我看看它的内部循环可能是什么,并尝试使其快速

不管怎样,无论我做了多少尝试,都会有(有时是巨大的)机会让它走得更快,并找到我使用的机会。 无论你做什么,不要只是想清楚或者回到你的课堂笔记上。
您的问题与其他人的不同,解决方案也不同。

有明确的赢家吗?没有。如果有疑问,请尝试不同的选项并计时。在链表的情况下,使用一些使元素保持接近的自定义分配器可能很有用together@NiklasB.:
使用一些自定义分配器,使元素保持紧密连接
我从未听说过这种技术。我如何才能找到有关此实现的信息?例如@NiklasB.:但这假设一种语言实际上可以自己分配内存。这种方法是否依赖于语言?对于没有内存管理的语言(解释语言)是否也有类似的情况对于一种没有指针的语言,你总是可以在数组中使用索引,而不是指针,所以是的,它是通用的。但是如果没有原始指针,这可能会引入一些开销,但是用例中的(2)指的是访问所有元素,而不是
n
元素list@Jim,我没有说第N个元素,但是每一个第N个元素,例如,一个数组可以不按顺序排列,但仍具有优越性。当遍历整个数组/列表
大量插入/删除时,当然也会出现同样的问题,与纯粹的引用相反。
我想你的意思是更新列表的频率要比访问列表的频率高很多?@Jim:有时候,在我编写程序之前,我不知道修改/增加数组花费了多少时间。当我发现它很大时,我会改变数据结构。我想我是想说-当性能诊断要求您改变数据结构时,您应该愿意改变数据结构。