使用阵列Vs实现堆(ADT)。链表

时间:2016-04-15 12:32:03

标签: arrays linked-list heap time-complexity abstract-data-type

在我的数据结构课程中,我需要实现具有以下时间的二进制堆 - 复杂性要求:

  • 查找最大值 - O(1)
  • 插入 - O(lg n)
  • 删除Max - O(lg n)

现在我想用以下方式使用数组来实现它:堆的根位于Arr [1](第一个索引)中。 Arr [i]的孩子在Arr [2i]和Arr [2i + 1](2个孩子)。 通过这个实现,我将在O(1)中获取Find Max,在O(n)中删除Max并在O(lg n)中插入异常 - 如果我需要在数组已满时插入,我将不得不调整数组的大小并将"成本" me O(n)因此所有边缘情况的插入总成本将根据需要为O(n)而不是O(log n)。

是否有其他实施方法可以满足所有复杂的要求? 我想也许尝试使用LinkedList而不是数组来实现,但insert仍然是O(n)。任何有关实施的建议都将受到欢迎。

1 个答案:

答案 0 :(得分:1)

您的实施可以满足要求。我假设当你说删除max将取O(n)时,你认为你需要将整个数组移动到一个位置?在这种情况下你真正需要做的是拥有下一个最大元素' swim'正如他们所说的那样。这只需要O(lgn)时间。

此外,调整大小不会经常发生,因此摊销的运行时仍为O(lgn)。 See here