Parece haber varias implementaciones de cola de prioridad disponibles para Haskell. Por ejemplo, hay:Comparación de implementaciones de cola de prioridad en Haskell
- Data.PriorityQueue.FingerTree (en fingertree-0.0.1.0 en hackage)
- Data.PurePriorityQueue (en pure-priority-queue-0.14 en hackage)
ambos de los cuales parece ser pura cola de prioridad de los datos estructuras. El primero se basa en árboles de dedo, una estructura de datos con la que no estoy familiarizado; el último es un contenedor alrededor de Data.Map. También hay
- Data.Heap (de heap-1.0.0 en hackage)
que define estructuras datos montón puramente funcional de la que uno trivialmente puede hacer colas de prioridad. . También hay
- Data.Heap (en heaps-0.2 en hackage)
- Data.MeldableHeap (en meldable-heap-2.0.3 en hackage)
la que tanto implementar montones meldable puramente funcionales utilizando los datos Brodal/Okasaki estructura, que creo que es análoga a la estructura de datos de montón binomial en tierra funcional no pura.
(Ah, y también hay
- Data.PriorityQueue (en prioridad-cola-0.2.2 en hackage)
cuya función es claro para mí, pero que parece estar relacionado crear colas de prioridad adjuntas a una mónada, y que parece construirse encima de Data.Map de todos modos. En esta pregunta, me preocupan las colas de prioridad puramente funcionales, así que creo que el paquete priority-queue-0.2.2 es irrelevante . ¡Pero corríjame si estoy equivocado!)
Necesito una estructura de datos de cola de prioridad pura y funcional para un proyecto que estoy construyendo. Me preguntaba si alguien podría dar algunas palabras de sabiduría cuando decida entre el embarrassment of riches proporcionado por hackage. Específicamente:
- Supongamos que quiero hacer funciones aparte de las operaciones tradicionales de inserción de cola y extracción-mínimo, en una presentación puramente funcional/inmutable. ¿Cuáles son los pros y los contras de los paquetes mencionados anteriormente? ¿Alguien tiene experiencia en usar cualquiera de ellos 'enojado'? ¿Cuáles son las compensaciones en el rendimiento? ¿Confiabilidad? ¿Cuáles son usados más ampliamente por otros? (Usar esos puede hacer que mi código sea más fácil de leer para otros, ya que es más probable que estén familiarizados con la biblioteca). ¿Hay alguna otra cosa que deba saber antes de tomar una decisión entre ellos?
- Si también quiero una fusión eficiente de las colas de prioridad, ¿entonces qué? (No lo hago para este proyecto, pero pensé en agregar esto pero haría que la pregunta SO sea más útil para futuros lectores.)
- ¿Hay algún otro paquete de cola de prioridad por ahí que me haya perdido?
"finger trees, una estructura de datos con la que no estoy familiarizado" Le recomiendo leer el artículo http://www.soi.city.ac.uk/~ross/papers/FingerTree.html: es muy claramente escrito y la estructura de datos es ampliamente útil. La cola de prioridad se analiza específicamente, entre otras aplicaciones. –
Soy el autor de 'priority-queue-0.2.2' - fue uno de mis primeros intentos en Haskell y aunque nunca he encontrado o me han notificado problemas con esa versión, es casi seguro que no como bien pensado como los demás. Su propósito es de hecho para su uso principalmente con IORef, STRef, et al. Se podría usar en State/StateT para una interfaz "pura", pero realmente no vale la pena hacerlo cuando hay tantas otras opciones (incluso simplemente "Mapa", que tiene "minView" y "maxView"). 'funciones). – mokus