向一个空heap连续插入n个element的时间复杂度

对于k smallest in unsorted array这类问题,我们会用一个heap(PriorityQueue),不停地向里面插入element。假如连续插入n个,那么总的时间复杂度是多少呢?

Heap SizeOperations
01
11
22
32
43
nlogn + 1

所以总时间1 + (log1 + 1) + (log2 + 1) + (log3 + 1) + … +(logn + 1)
= (log1 + log2 + … + logn) + n + 1
= log(n!) + n + 1

我们可以分别确定log(n!)的上限和下限
log(n!) = log1 + log2 + … + logn
log1 + log2 + … + logn <= nlogn
log1 + log2 + … + logn >= log(n/2) + log(n/2 + 1) + log(n/2 + 2) + … + log(n) >= (n/2)(log(n/2))
O(nlogn) <= O(log(n!)) <= O((n/2)(log(n/2)) = O(nlogn)

Conclusion:
O(log(n!)) = O(nlogn)

回到题目,总的时间复杂度是
O(log(n!) + n + 1) = O(log(n!)) + O(n) + O(1) = O(nlogn)

Leave a comment