合并堆作为排序数组实现

时间:2013-04-17 18:34:08

标签: algorithm data-structures linked-list heap

当我们将两个二进制最小堆实现为双重排序链接链接时,关于将一个堆合并到另一个堆的最坏情况时间的最有效算法是什么,

我虽然自己,但是我会将具有较少数量元素的堆元素插入到具有更多元素的堆中:

如果我有随机访问元素(链表通常不是这种情况),它将在O(m * log(n+m)) m < n中完成,因为我可以将较小堆的每个元素插入到较大的堆中,否则它将是O(m * n),因为我必须将每个元素插入到已经排序的列表中。

还有其他想法可以更快地运行并且有更好的最差时间吗?

1 个答案:

答案 0 :(得分:1)

只要您能够在遍历堆中跟踪正在检查的节点,就可以轻松地在O(m + n)时间内完成此操作。在伪代码中:

Iterator iterDest = largerHeap.getIterator();
Iterator iterSrc = smallerHeap.getIterator();

while (iterSrc.hasMore()) {
    valueSrc = iterSrc.getCurrent();
    valueDest = iterDest.getCurrent();

    if (valueSrc <= valueDest) {
        // Insert elements in their proper place in largerHeap
        iterDest.insertBeforeCurrent(valueSrc);
        iterSrc.moveNext();
    } else {
        if (iterDest.hasMore()) {
            iterDest.moveNext();
        } else {
            break;
        }
    }
}

// Append extra elements to the end of largerHeap
while (iterSrc.hasMore()) {
    largerHeap.append(iterSrc.getCurrent());
    iterSrc.moveNext();
}