gpt4 book ai didi

algorithm - 合并作为排序数组实现的堆

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:31:02 27 4
gpt4 key购买 nike

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

我自己的想法是,我会将元素数量较少的堆的元素插入到元素数量较多的堆中:

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

有没有其他想法可以更快地工作并且有更好的最坏时间?

最佳答案

您可以轻松地在 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();
}

关于algorithm - 合并作为排序数组实现的堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com