链表插入/删除效率

时间:2017-10-10 14:18:32

标签: arrays data-structures linked-list

传统上,当我们想要在随机位置执行插入/删除时,建议使用链接列表。这是因为在使用链表(单链表)时,我们只需要更改next和{{ 1}}相邻节点的指针。在数组中,我们必须推出许多元素来为新元素腾出空间(如果是插入的话)。

然而,与数组(随机访问)相比,在链表的情况下找到插入/删除位置的过程非常昂贵(顺序搜索),特别是当我们有大数据时。

此因素是否会显着降低链接列表中数组插入/删除的效率?或者,如果数组比顺序访问更大的问题,是否需要推送元素的时间?

2 个答案:

答案 0 :(得分:1)

  

然而,找到插入/删除位置的过程   与之相比,链表的情况非常昂贵(顺序搜索)   数组(随机访问),特别是当我们有大数据时。

如果你正在搜索一个元素并且不知道它在哪里,随机访问没有任何帮助,如果你确实知道它在哪里并且有一个指针或索引,那么就不再需要搜索了访问元素,无论您使用的是链接列表还是数组。只有在这种情况下随机访问有帮助的情况是数组是否排序,在这种情况下随机访问启用二进制搜索。

  

这个因素是否会显着降低效率   在数组的链表中插入/删除?或者是时候   如果数组出现更大的问题,需要推送元素   顺序访问?

通常至少对于无序序列,因为同样,数组和链表都需要线性时间搜索来查找元素。如果人们需要经常在关键路径中搜索非平凡的输入大小,通常人们会使用哈希表或平衡二叉树或尝试或类似的东西。

由于与算法复杂性无关的原因,在许多性能关键字段中,数组通常优于链表。这是因为数组保证连续存储它们的元素。这为顺序处理提供了非常好的参考局部性。

还有一些方法可以在固定时间内从数组中删除。作为一个示例,如果要在常量时间从数组中删除第n个元素,只需将其与数组中的最后一个元素交换,并在常量时间中删除最后一个元素。如果允许对元素重新排序,则不一定要将所有元素混洗以缩小间隙。

链接列表可能会也可能不会连续存储其节点。它们通常在性能关键的上下文中变得更有用,就像它们将节点存储在一个数组中一样(通过基于数组的容器或分配器)。否则,遍历它们可能会导致缓存未命中,并且每个被访问的节点都可能出现缓存未命中。

答案 1 :(得分:0)

  

与数组(随机访问)相比,在链接列表的情况下查找插入/删除位置的过程非常昂贵(顺序搜索)

比较错误,因为您正在比较插入/删除操作的效率。而是比较这两个因素:

  1. 在时间复杂度为O(n)的链接列表中进行连续搜索

  2. 复制数组元素以便推送。可能需要复制最多n个数组元素。

  3. 在数组中:如果基础类型是POD,它只能realloc,但如果不是,则必须使用对象的operator=移动它们。

    所以你可以看到并非所有东西都支持 array 用法。 链接列表无需一次又一次地复制相同的数据。

      

    ,特别是当我们有大量数据时。

    这意味着在推送时要复制更多数组元素。