我正在尝试了解使用堆进行k合并的时间复杂性,尽管上面有大量文献可用,但我找不到能分解分析以使我能够理解的文献
此Wikipedia article声称“在O(k)预处理步骤中,堆是使用标准的heapify过程创建的”。但是,堆插入为O(log(n))
,find-min为O(1)
。我们首先将每个数组的第一个元素插入堆中。这需要∑log(i)
时间,
i = 0 to k - 1
或O(klog(k))
时间,这驳斥了Wikipedia的复杂性分析。 (实际上是O(log(k!))
)
然后我们删除min元素,并从数组中插入下一个元素
min元素最初来自何处。这需要O(1) + O(log(k))
时间,我们需要重复n - 1
次。
总时间:
O(klog(k)) + O(n - 1) + O((n - 1)log(k)) ≅ O(klog(k)) + O(n) + O(nlog(k))
维基百科声称:“总运行时间为O(n log k)”。怎么样?