Я пытаюсь реализовать алгоритм Дейкстры в Haskell. Я уже реализовал двоичную кучу, используя дерево. В алгоритме соседние ключи текущей вершины должны быть обновлены в куче. Как я могу эмулировать указатель на значение в куче в Haskell? Как я могу получить быстрый доступ к элементам в куче, а куча меняется после каждой операции?Как я могу эмулировать указатели в Haskell?
ответ
Ознакомьтесь с пакетами Data.IORef и Data.STRef, которые предоставят вам доступ к изменяемым ссылкам. Используйте IORefs, если вам также нужно выполнить IO и STRef, если вы этого не сделаете.
Однако мое подозрение заключается в том, что вы, вероятно, ошибаетесь. Вполне возможно реализовать алгоритм Дейкстры без изменчивого состояния (хотя вам нужно быть немного осторожным, так как вы можете легко привести к тому, что асимптотическое время работы взорвется, если вы постоянно перекомпонуете оценки функций, которые можно кэшировать).
Возможно, вы ищете Data.Vector.Mutable из пакета vector, который вы можете комбинировать с ST или IO monad.
Вы можете использовать Data.FingerTree.PSQueue, который поддерживает операцию adjust для обновления кучи. В этом случае вам не нужны указатели на значения в куче, потому что вы обновляете их через свои ключи.
- 1. Как я могу эмулировать деструктурирование в C++?
- 2. Низкоуровневые указатели в haskell
- 3. Как я могу эмулировать триггер jQuery()?
- 4. Указатели на ADT в Haskell
- 5. Haskell - FFI и указатели
- 6. Могу ли я эмулировать компас на Android
- 7. Как я могу обнаружить нефункциональные события-указатели?
- 8. Как я могу эмулировать функциональность переключателя в jQuery?
- 9. Как я могу эмулировать поиск Vim * в GNU Emacs?
- 10. Как я могу эмулировать запрос HTTPS в WebTest?
- 11. Как я могу правильно эмулировать DateDiff TSQL в C#
- 12. Как я могу эмулировать ErrorProvider в .NET Compact Framework?
- 13. Как я могу эмулировать конечное дерево процессов в C# /. Net
- 14. Как я могу эмулировать сеть 4G (LTE) в Android SDK
- 15. Как я могу правильно эмулировать предыдущие/следующие кнопки в slick.js?
- 16. Как я могу читать файлы в haskell?
- 17. Как я могу вернуть null в haskell?
- 18. Как я могу построить график в Haskell?
- 19. как я могу считать префиксы в haskell?
- 20. Как я могу отделить кортежи в Haskell?
- 21. Как я могу разделить «\ n» в haskell?
- 22. Как я могу упростить это в Haskell?
- 23. Есть ли у Haskell указатели?
- 24. Как я могу эмулировать эту кнопку без использования фонового изображения?
- 25. Как я могу эмулировать HTTP-запрос веб-браузера из кода?
- 26. Как я могу эмулировать модули/инсталляторы/реестры с простым инжектором
- 27. Как я могу эмулировать устройство видеозахвата и предоставлять динамический видеоконтент?
- 28. Как я могу эмулировать гамма-коррекцию с помощью фильтров CSS3?
- 29. Как я могу (или эмулировать) ViewPager внутри DialogFragment?
- 30. Как я могу эмулировать «typeof (T)», используя API System.Linq.Expressions?
FWIW, есть отличные очереди приоритетов при взломе, а спаривание куч легче реализовать, чем двоичные кучи, но, тем не менее, пакет довольно ударил. Что касается мутации: не надо. Вероятно, есть способ обойти его, и хотя существует изменчивая память, использующая его крайне уродливо, чтобы напомнить вам, что вы не должны этого делать;) – delnan
Вероятно, вы получите более качественные ответы, если спросите, как быстро выполнить Dijkstra в Haskell (который кажется вашей реальной проблемой), а не одно из возможных решений. – Pubby
@ ElectricHedgehog существует множество асимптотически оптимальных очередей приоритетов, которые могут быть реализованы функционально, в первую очередь биномиальные очереди. Проверьте пакеты, например [pqueue] (http://hackage.haskell.org/package/pqueue). –