【问题标题】:Time Efficiency of mergesort on linked list vs array of pointers链表上合并排序的时间效率与指针数组
【发布时间】:2018-11-01 18:34:24
【问题描述】:

我正在尝试计算链接列表与指针数组上的合并排序的时间效率(不担心我将来将如何使用它,只担心数据排序的速度)。

这样会更快。我想使用指针数组需要额外的内存访问层。 但同时,访问链表会更慢假设我们已经知道链表的长度,mergesort 仍然需要遍历链表,从内存跳转到内存,直到获得指向链表中间节点的指针列表,我认为它比数组更耗时。

有人有什么见解吗?是否更符合要排序的数据?

【问题讨论】:

  • 当您有这样的问题时 - 实现两者并进行比较。这肯定取决于您的实现,而不是“抽象”的实现。
  • 使用array of pointers 实现的效率应该与linked list of pointers 的效率进行比较。无论如何,我真的不认为指针访问会成为这两种数据结构中的任何一种的瓶颈。
  • @EugeneSh。我试图理解总体上的差异,从而理解抽象性。在实现方面,它是指针数组上的标准合并排序算法,例如 *char[] 与带有 ( *char data; struct *next) 的链表结构
  • it is the standard merge sort algorithm on an array of pointers 对于合并排序,您不需要 额外的指针数组。 (因此您可以省略这些步骤)。
  • @wildplasser 请提供参考说明如何在不使用额外指针数组的情况下对指针数组进行合并排序。

标签: c algorithm


【解决方案1】:

实现链表的合并排序与指针数组的主要区别在于,数组最终必须使用辅助数组。算法复杂度相同,O(n * log(n)) 相同,但数组版本使用 O(n) 额外内存。你不需要在链表的情况下使用额外的内存。

在现实世界的实现中,两者的运行时性能应该相差一个常数因子,但不足以偏向于另一个。也就是说,如果您有一个指针数组,您可能不会从将其转换为链表、排序并将其转换回数组中受益。给定一个链表,您也不会从创建一个数组、对其进行排序然后构建一个新数组中受益。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2012-11-19
    • 2020-11-22
    • 2020-09-25
    相关资源
    最近更新 更多