我曾尝试使用这段代码
https://code.msdn.microsoft.com/windowsdesktop/Net-Implementation-of-a-d3ac7b9d
实现 Prim 算法的基于堆的实现,以解决无向连通图中的最小生成树 (MST) 问题。
经过几次迭代,我发现堆/优先级队列不再得到很好的维护。
即 PriorityQueue 的头部没有堆中最低的 Key。
PQ 0 [-7230, 309]
...
PQ 146 [-7277, 308]
有没有人使用过这个代码并遇到过类似的问题?
如果有人会看,我可以在 GitHub 上发布链接
我需要一个支持删除中间元素的堆数据结构。看起来 Fsharpx.collections 没有这样的数据结构。
有没有人知道某个地方有一个很好的实现?
谢谢
最佳答案
最近,我将 MaxHeap 从 PLINQ 移植到 F# here 并使其成为 MinHeap。它是基于数组的,并且比任何“纯函数”替代方案的性能都要好得多。
然而,经过大量的基准测试,我发现 SortedDeque 仅基于一个简单的排序循环缓冲区在 most use cases 上表现明显更好,即使我需要在中间添加或删除。
关于F# 优先级队列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36193322/