使用链接列表

时间:2018-01-31 04:49:12

标签: algorithm data-structures heap

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

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

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

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

1 个答案:

答案 0 :(得分:0)

你提到的Stackoverflow网址只是某人的主张(至少在我写这篇文章的时候)所以基于这里的假设是我的答案。大多数人提到“时间复杂度”时,它们意味着无症状分析,并找出算法所占用的时间随着输入大小的增加而忽略所有常数的比例。

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

所以现在归结为通过增加输入大小来分析时间比例对此功能的影响。现在您可以想象,为了修复(堆积)一个节点,您可能需要遍历3次最大值(1.找出要交换的哪一个需要一个遍历来比较两个可能的子节点中的一个,2。回到父节点进行交换3回到刚交换过的那个。现在即使看起来你正在进行3次最大n / 2次遍历;对于无症状分析,这恰好等于'n'。现在,你必须为log n执行此操作,就像对数组所做的一样。因此,时间复杂度为O(n log n)。在维基百科时间复杂度表中,用于堆网址https://en.wikipedia.org/wiki/Binary_heap#Summary_of_running_times