树:链接列表与数组(效率)

时间:2010-02-08 08:06:27

标签: arrays tree performance linked-list theory

这是一个分配问题,我在回答问题时遇到了问题。

“假设一棵树每个节点最多可以有k个子节点。设v是每个节点的平均子节点数。对于v的值,存储子节点的效率(使用空间方面)更高链表中的节点与数组中的存储?为什么?“

我相信我能回答“为什么?”或多或少用简单的英语 - 使用链表更有效率,因为而不是拥有一堆空节点(如果你的平均值低于最大值,数组中的空索引)占用内存你只需要分配空间当您实际填写值时,对于链接列表中的节点。

因此,如果在最大值为200时平均有6个子节点,则在创建树时,阵列将为每个节点的所有200个子节点创建空间,但链接列表将仅为节点分配空间如所须。因此,使用链表,使用的空间大约是(?)平均值;对于数组,使用的间隔将是最大值

......我不知道何时使用该阵列会更有效率。这是一个棘手的问题吗?我是否必须考虑到数组在创建时需要对节点总数进行限制这一事实?

5 个答案:

答案 0 :(得分:5)

  

......我不知道何时使用该阵列会更有效率。这是一个棘手的问题吗?

这不是一个技巧问题。想一想链表有的内存开销。如何实现链表(与数组相比)?

另外(虽然这超出了问题的范围!),空间消耗并不是实践中唯一的决定因素。缓存在现代CPU中起着重要作用,将各个子节点存储在数组而不是链表中可以大大改善缓存局部性(从而提高树的性能)。

答案 1 :(得分:5)

对于许多常用语言,该阵列将需要分配存储 k 存储器地址(数据)。单链表将需要每个节点2个地址(数据和下一个)。双链表将需要每个节点3个地址。

n 为特定节点 A 的实际子节点数:

  • 该阵列使用 k 内存地址
  • 单链表使用2 地址
  • 双向链表使用3 地址

k 允许您确定2 n 或3 地址是否会平均到增益或损失,而不是简单地存储数组中的地址。

答案 2 :(得分:3)

数组必须预先分配空间,但我们可以使用它们来快速访问任何条目 列表在创建新节点时分配内存,这并不理想,因为
cpu时间内存分配成本。

提示:如果您愿意,可以一次分配整个数组,但通常我们会分配 比方说,4个条目,我们通过在需要更多空间时将尺寸加倍来调整大小。

答案 3 :(得分:1)

我可以想象,如果一个人使用的数据项无论如何都具有前一个和下一个项的内在逻辑,那么在许多场景中使用LinkedList可能是一个非常好的想法并且非常有效,例如{{1}或者某种与时间有关的东西。这些应该实现一个接口,因此TimeTableItem实现可以利用它,而不必将项目包装到自己的节点对象中。插入和删除比使用内部处理数组的LinkedList实现更有效。

答案 4 :(得分:1)

您假设无法动态重新分配数组。如果可以,则数组获胜,因为它不需要大于k项(加上常量开销),并且因为它不需要指针的每项存储。