【问题标题】:Heapsort and building heaps using linked list使用链表进行堆排序和构建堆
【发布时间】:2018-07-10 02:54:46
【问题描述】:

我知道链表不是构建堆的合适数据结构。

这里的一个答案 (https://stackoverflow.com/a/14584517/5841727) 说堆排序可以使用与数组相同的链表在 O(nlogn) 中完成。

我认为 heapify 操作会在链表中花费 O(n) 时间,我们需要 (n/2) 次 heapify 操作导致 O(n^2) 的时间复杂度。

有人能告诉我如何使用链表实现 O(nlogn) 复杂度(用于堆排序)吗?

【问题讨论】:

  • 如果你解释一下使用链表构建堆是什么意思,那么这个问题也许会有意义。

标签: algorithm data-structures heap


【解决方案1】:

您提到的 Stackoverflow URL 只是某人的声明(至少在我写这篇文章时),所以基于假设这里是我的答案。大多数情况下,当人们提到“时间复杂度”时,他们的意思是无症状分析,并找出算法所花费的时间随着输入大小的增加而增加的比例,而忽略所有常数。

为了证明链表的时间复杂度,我们假设有一个函数返回给定索引的值(我知道链表不按索引返回)。为了提高此功能的效率,您还需要传入 level,但我们现在可以忽略它,因为它对时间复杂度没有任何影响。

所以现在归结为随着输入大小的增加分析时间比例对该函数的影响。现在您可以想象,为了修复(堆积)一个节点,您可能必须最多遍历 3 次(1. 找出要交换的节点需要一次遍历来比较两个可能的子节点之一,2. 回到父节点进行交换 3 . 回到你刚刚交换的那个)。现在,即使您似乎正在进行 3 次 max n/2 遍历;对于无症状分析,这仅等于“n”。现在您必须对 log n 执行此操作,其方式与您对数组执行的操作完全相同。因此时间复杂度为 O(n log n)。关于堆 URL https://en.wikipedia.org/wiki/Binary_heap#Summary_of_running_times 的维基百科时间复杂度表

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 2011-12-26
    • 2020-06-27
    • 2013-12-18
    • 2013-01-13
    • 2013-05-13
    • 1970-01-01
    • 2015-01-14
    • 2021-09-03
    相关资源
    最近更新 更多