我正在尝试在Haskell中实现Dijkstra的算法。我已经使用树实现了二进制堆。在算法中,应该在堆中更新当前顶点的邻居键。如何在Haskell中模拟堆中值的指针?如何在每次操作后堆都在变化时,如何快速访问堆中的元素?
答案 0 :(得分:12)
查看可以访问可变引用的包Data.IORef和Data.STRef。如果你还需要执行IO,请使用IORef,如果不需要,则使用STRef。
然而,我怀疑你可能做错了。完全可以在没有可变状态的情况下实现Dijkstra算法(尽管你需要小心一点,因为如果你不断重新计算可以缓存的函数评估,你很容易导致渐近运行时间爆炸)。
答案 1 :(得分:0)
您可能正在寻找Data.Vector.Mutable包中的vector,您可能希望将其与ST或IO monad结合使用。
答案 2 :(得分:0)
您可以使用支持Data.FingerTree.PSQueue操作的adjust来更新堆。在这种情况下,您不需要指向堆中值的指针,因为您通过其键更新它们。