私はHaskellでDijkstraのアルゴリズムを実装しようとしています。私は既にツリーを使ってバイナリヒープを実装しています。近傍のアルゴリズムでは、現在の頂点のキーをヒープ内で更新する必要があります。どのように私はHaskellのヒープの値へのポインタをエミュレートできますか?各操作の後にヒープが変更されている間に、ヒープ内の要素に高速アクセスするにはどうすればよいですか?Haskellでポインタをどのようにエミュレートできますか?
9
A
答えて
12
Data.IORefとData.STRefは、変更可能な参照にアクセスできるパッケージをご覧ください。 IOを実行する必要がある場合はIORefを使用し、そうでない場合はSTRefを使用します。
しかし、私の疑惑はおそらく間違っているということです。 Dijkstraのアルゴリズムを変更可能な状態で実装することは完全に可能です(キャッシング可能な関数評価を継続的に再計算する場合は、漸近的な実行時間を簡単に短くすることができるので、少し注意する必要があります)。
0
vectorパッケージからData.Vector.Mutableを探しているかもしれません。STまたはIOモナドと組み合わせることをお勧めします。
0
adjust操作をサポートするData.FingerTree.PSQueueを使用すると、ヒープを更新できます。この場合、キーを使用してヒープ内の値を更新するため、ヒープ内の値へのポインタは必要ありません。
FWIWでは、ハッキングに優れた優先度キューがあり、ペアリングヒープはバイナリヒープより実装が簡単ですが、かなりのパンチをパックします。突然変異についてはしないでください。おそらくそれの周りに道がありますが、変更可能なメモリが存在するにもかかわらず、非常に醜いことを思い出させるために使用してはならないことを思い出させるために); – delnan
ハスケルで高速Dijkstraを実行する方法を尋ねれば、 1つの可能な解決策ではなく実際の問題と思われます)。 – Pubby
@ElectricHedgehogには、関数的に実装できる漸近的に最適な優先順位キューがあります。特に、2項キューがあります。 [pqueue](http://hackage.haskell.org/package/pqueue)のようなパッケージをチェックしてください。 –