动态大小的堆插入技术上是O(n)吗?

时间:2012-06-05 13:39:03

标签: data-structures heap

将一个元素插入堆中会将其附加到数组的末尾,然后向上传播直到它位于“正确的位置”并满足堆属性,其操作为O(logn)。

然而,在C中,例如,为了调整新元素的数组大小而调用realloc可能(并且可能会)导致必须将整个数组复制到内存中的另一个位置,在最好和最坏的情况下是O(n),对吧?

C(或任何语言)中的堆通常是以固定的,预先分配的大小完成的,或者复制操作是否足以使动态大小的堆成为可行的选择(例如,二进制堆到保留一个可快速搜索的项目列表)?

1 个答案:

答案 0 :(得分:2)

典型的方案是在房间用完时将尺寸加倍。这种倍增 - 以及随之而来的复制 - 确实需要花费O(n)时间。

但是,请注意,您不必经常执行此加倍。如果你平均计算堆上执行的所有操作的所有加倍的总成本,而不涉及加倍,那么成本确实是无关紧要的。 (这种平均称为amortized analysis。)