二叉堆的摊销分析

amortized analysis on a binary heap

所以一个普通的二叉堆有一个操作 extract_min 这是 O(log(n)) 最坏的时间。假设 extract_min 的摊销成本为 O(1)。设 n 为堆的大小

所以我们执行了 n extract_min 个操作的序列,它最初包含 n 个元素。这是否意味着整个序列将在 O(n) 时间内处理,因为每个操作都是 O(1)?

让我们先解决这个问题:通过 extract_min 操作删除堆中的所有元素需要 O(N log N) 时间。

这是事实,所以当你问"Does constant amortized time extract_min imply linear time for removing all the elements?"时,你真正问的是"Can extract_min take constant amortized time even though it takes O(N log N) time to extract all the elements?"

这个问题的答案实际上取决于堆支持什么操作。

如果堆仅支持 addextract_min 操作,那么每个 extract_min 没有失败(在恒定时间内)必须对应于前一个 add.然后我们可以说 add 需要摊销 O(log N) 时间,而 extract_min 需要摊销 O(1) 时间,因为我们可以将其所有非常量成本分配给之前的 add.

如果堆支持 O(N) 时间 make_heap 操作(摊销与否),则可以执行 N extract_min 操作而不做任何其他操作,总计 O(N log N) 时间。然后必须将整个 O(N log N) 成本分配给 N extract_min 操作,我们可以 not 声称 extract_min 需要摊销常数时间。