因此,常规的二进制堆具有操作extract_min,这是O(log(n))最坏的时间。假设extract_min的摊销成本为O(1)。令n为堆的大小
所以一个序列,我们执行了n次extract_min操作,并且最初包含n个元素。这是否意味着由于每个操作都是O(1),所以整个序列将在O(n)时间内处理?
答案 0 :(得分:0)
让我们先解决这个问题:通过extract_min
操作删除堆中的所有元素需要 O(N log N)时间。
这是事实,因此当您问“固定的摊销时间extract_min
是否暗示着删除所有元素的线性时间?”时,您真正要问的是“ extract_min
是否可以采用固定的摊销时间?即使提取所有元素需要 O(N log N)时间?”
答案实际上取决于堆支持的操作。
如果堆仅支持add
和extract_min
操作,则每个(恒定时间)未失败的extract_min
必须对应于先前的add
。然后我们可以说add
需摊销 O(log N)时间,而extract_min
需摊销 O(1)时间,因为我们可以将其所有非恒定成本分配给先前的add
。
但是,如果堆支持 O(N)次make_heap
操作(是否摊销),则可以执行 N {{1 }}的操作,而无需执行其他任何操作,这些操作总计会花费 O(N log N)个时间。然后必须将整个 O(N log N)成本分配给 N extract_min
个操作,而我们不声称extract_min
需要摊销固定时间。