F#优先级队列

时间:2016-03-24 04:30:46

标签: f# heap priority-queue

我试图使用这段代码

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

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

经过几次迭代后,我发现堆/优先级队列不再维护得很好。 这是PriorityQueue的负责人并没有堆中最低的密钥。

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

是否有人使用此代码并遇到类似问题? 如果有人在看它,我可以在GitHub上发布一个链接

我的需求是堆数据结构,它支持删除中间的元素。看起来Fsharpx.collections没有这样的数据结构。

有人知道某个地方有一个很好的实现吗?

感谢

2 个答案:

答案 0 :(得分:7)

最近,我将MaxHeap从PLINQ移植到了F#here并将其设为MinHeap。它基于数组,并且比任何“纯功能”替代方案都表现得更好。

然而,在经过大量的基准测试之后,我发现基于一个简单的排序循环缓冲区的SortedDequemost use cases上表现得更好,即使我需要在中间添加或删除。

答案 1 :(得分:-1)

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

我使用的是另一个库而不是FSharpx.collections,它被称为

Spreads

阅读该页面了解详情和说明。

SortedDeque是我遇到此问题所需的数据结构。 我使用相同的代码,只是从微软博客页面代码更改为库函数,并发现了良好的结果,所以它确实是微软博客页面代码中的一些错误

PS。这个点差库设计用于格式化财务数据以进行定量分析,我很高兴我发现它!看起来这个图书馆看起来很新,这也就是为什么它不在谷歌的搜索之上或在任何其他SO问题中被引用(或者如果我没有看到它)

FSharpx.Collections对于该问题毫无用处,您可以从该讨论中看到heap issue in FSharpx.Collections