Estoy tratando de implementar el algoritmo de Dijkstra en Haskell. Ya he implementado un montón binario usando un árbol. En el algoritmo, las claves vecinas del vértice actual deberían actualizarse en el montón. ¿Cómo puedo emular el puntero al valor en el montón en Haskell? ¿Cómo puedo tener acceso rápido a los elementos en el montón, mientras que el montón está cambiando después de cada operación?¿Cómo puedo emular punteros en Haskell?
Respuesta
Consulte los paquetes Data.IORef y Data.STRef que le dan acceso a referencias mutables. Use IORefs si también necesita realizar IO, y STRefs si no lo hace.
Sin embargo, mi sospecha es que probablemente lo estés haciendo mal. Es totalmente posible implementar el algoritmo de Dijkstra sin estado mutable (aunque es necesario tener un poco de cuidado, ya que puede hacer que el tiempo de funcionamiento asintótico explote fácilmente si continuamente está recalculando las evaluaciones de funciones que podrían almacenarse en caché).
Probablemente esté buscando Data.Vector.Mutable del paquete vector, que es posible que desee combinar con ST o IO mónada.
Puede usar Data.FingerTree.PSQueue que admite una operación adjust para actualizar el montón. En este caso, no necesita punteros a los valores en el montón porque los actualiza a través de sus claves.
- 1. ¿Haskell tiene punteros?
- 2. ¿Cómo emular/suplantar evento de pulsación de tecla en Haskell?
- 3. Cómo emular la pereza
- 4. ¿Cómo puedo emular ": contiene" usando BeautifulSoup?
- 5. ¿cómo puedo emular el navegador del iPad en Windows
- 6. ¿Cómo puedo emular la búsqueda de Vim * en GNU Emacs?
- 7. Cómo emular CUDA en Windows
- 8. Cómo emular onLowMemory()?
- 9. Cómo emular Event.timeStamp
- 10. ¿Puedo emular svn: externals usando mercurial?
- 11. ¿Cómo puedo combinar Handles en Haskell?
- 12. ¿Cómo puedo emular Módulos/Instaladores/Registros con Simple Injector
- 13. ¿Cómo puedo emular PUT/DELETE para Rails y GWT?
- 14. ¿Cómo puedo emular la API de Jquery UI?
- 15. Cómo emular E/S mapeadas en memoria
- 16. ¿Cómo emular 'git stash' en fósil, bzr?
- 17. ¿Cómo puedo cambiar de forma atómica dos punteros en Windows?
- 18. Cómo emular C# as-operator en Java
- 19. Cómo emular el ancho mínimo en IE8
- 20. Cómo emular a los cierres en c
- 21. ¿Cómo codigo un árbol de objetos en Haskell con punteros a padres e hijos?
- 22. ¿Emular una PC vieja?
- 23. Void punteros a struct punteros en C
- 24. C++ Punteros a punteros en Java
- 25. Emular Nexus 7
- 26. Emular/Simular iOS en Linux
- 27. ¿Puedo hacer aritmética en punteros void * en C?
- 28. SECCOMP: ¿Cómo emular malloc, realloc y gratis?
- 29. ¿Cómo puedo usar tipos de retorno covariantes con punteros inteligentes?
- 30. Punteros en Lisp?
FWIW, existen excelentes colas de prioridad en hackage, y los montones de emparejamiento son más fáciles de implementar que los montones binarios, pero sin embargo son un buen golpe. En cuanto a la mutación: No. Probablemente haya una forma de evitarlo, y aunque exista una memoria mutable, usarla extremadamente feo para recordarle que no debe hacerlo;) – delnan
Probablemente obtendrá mejores respuestas si pregunta cómo hacer Dijkstra rápidamente en Haskell (que parece ser su problema real) en lugar de una posible solución. – Pubby
@ElectricHedgehog, hay muchas colas de prioridad asintóticamente óptimas que pueden implementarse funcionalmente, en particular las colas binomiales. Consulte paquetes como [pqueue] (http://hackage.haskell.org/package/pqueue). –