对于k smallest in unsorted array这类问题,我们会用一个heap(PriorityQueue),不停地向里面插入element。假如连续插入n个,那么总的时间复杂度是多少呢?
| Heap Size | Operations |
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| n | logn + 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)