我想将实现为大小为m的数组的二进制堆合并到另一个具有n个元素的堆(同类)中。使用重复插入,这需要O(m * log(n))。似乎普遍认为,连接数组然后重建堆的替代方法,采用O(m + n)更有效。
现在我很清楚,对于一些对(m,n),m< n,O(m * log(n))方法会更有效。 According to Wolfram Alpha这是m< (n * log(2))/ log(n / 2)。这种解释是否正确?并且在实践中是否值得实施工作/运行时命中?
答案 0 :(得分:2)
你的间谍错了。当您在第一个堆中逐个插入元素时,它的大小会增加,越接近m+n
,因此每个插入的复杂性将不再是O(log(n))。事实上,逐个插入元素会使O(m * log(m + n))
的顺序复杂化。
这限制了m的值,为了更好地将较小的堆中的值逐一插入,但不能消除它。例如,如果您有一个大小为100000的堆并希望将其与大小为2的堆合并,则最好插入这两个元素。
另请注意,有不同类型的堆支持合并操作,具有更好的复杂性。例如,leftist heap易于实现,并支持O(log(n))
中的合并。