【发布时间】:2016-04-15 12:32:02
【问题描述】:
在我的数据结构课程中,我需要实现一个具有以下时间复杂度要求的二进制堆:
- 求最大值 - O(1)
- 插入 - O(lg n)
- 删除最大值 - O(lg n)
现在我想通过以下方式使用数组来实现这一点:堆的根在 Arr[1](第一个索引)中。 Arr[i] 的孩子在 Arr[2i] 和 Arr[2i+1] 中(2 个孩子)。 通过这个实现,我将在 O(1) 中找到 Max,在 O(n) 中删除 Max 并在 O(lg n) 中插入,但有一个例外 - 如果我需要在数组已满时插入,我将不得不调整数组的大小并且将“花费”我 O(n),因此插入所有边缘情况的总成本将是 O(n) 而不是 O(log n)。
是否有其他实现方式可以满足所有复杂性要求? 我想也许可以尝试使用 LinkedList 而不是数组来实现,但插入仍然是 O(n)。非常欢迎任何有关实施的建议。
【问题讨论】:
标签: arrays linked-list heap time-complexity abstract-data-type