F# 优先级队列

F# Priority Queue

我试过使用这段代码

https://code.msdn.microsoft.com/windowsdesktop/Net-Implementation-of-a-d3ac7b9d

实现 Prim 算法的基于堆的实现,以解决无向连通图中的最小生成树 (MST) 问题。

经过几次迭代,我发现 heap/priority 队列不再得到很好的维护。 那就是 PriorityQueue 的头部没有 Heap 中最低的 Key。

PQ 0 [-7230, 309]
...
PQ 146 [-7277, 308]

有没有人用过这段代码遇到过类似的问题? 我可以 post 在 GitHub 上 link 如果有人会看的话

我需要一个支持删除中间元素的堆数据结构。看起来 Fsharpx.collections 没有这样的数据结构。

有人知道某处可用的良好实施吗?

谢谢

最近,我从PLINQ to F# here移植了一个MaxHeap,并把它变成了MinHeap。它是基于数组的,性能比任何 "pure functional" 替代方案都要好得多。

然而,经过大量的基准测试,我发现 SortedDeque based on just a simple sorted circular buffer performs significantly better on most use cases 即使我需要在中间添加或删除。

我的回答受到 V.B 的启发。但这里是完整的

除了FSharpx.collections,我还用过另一个库,叫做

Spreads

阅读该页面了解详细信息和说明。

SortedDeque 是我解决这个问题所需的数据结构。 我用了同样的代码,只是把微软博客页面的代码改成了库函数,发现效果不错,所以确实是微软博客页面代码中的一些错误

PS。这个点差库旨在格式化财务数据以进行定量分析,我很高兴我找到了它!!!看起来这个库是相当新的,这就是为什么它不在 Google 的搜索之上或在任何其他 SO 问题中被引用(或者如果它是我没有看到它)

FSharpx.Collections 对那个问题没用,你可以从那个讨论中看到 heap issue in FSharpx.Collections