Digamos que estoy escribiendo Dijkstra's Algorithm, y tengo una cola de prioridad que mantiene el nodo de distancia más corta en la parte superior. Sin embargo, mientras recorro el gráfico, actualizaré la distancia a ese vértice. He colocado referencias a todos los vértices en la cola de prioridad que están contenidos en la estructura de datos. Ahora, al actualizar los vértices en la estructura de datos, me gustaría que los datos en la cola de prioridad se adapten a esos cambios, de modo que el nodo más cercano siempre esté en la parte superior. Sin embargo, después de recorrer mi aplicación con el depurador, noté que la cola de prioridad no se actualiza. ¿Cómo lo hago para hacer esto, sin volver a insertar todos los vértices?Actualizar cola de prioridad STL al modificar referencias a datos internos
5
A
Respuesta
4
STL priority_queue supone que solo utiliza los métodos push() y pop() para modificar la estructura de datos. No realiza un seguimiento de los cambios en la estructura de datos.
Después de modificar el interior del contenedor subyacente de priority_queue, necesita llamar a make_heap() en el contenedor para restaurar la propiedad del montón. STL priority_queue no proporciona iteradores en el contenedor subyacente. En su lugar, debe administrar manualmente un deque o un vector como cola de prioridad y llamar a make_heap(), push_heap() y pop_heap() según sea necesario.
Cuestiones relacionadas
- 1. Cola de prioridad STL con claves duplicadas: ¿es posible?
- 2. Cola de prioridad de STL en la clase personalizada
- 3. cola de prioridad de STL - eliminar un elemento
- 4. C# cola de prioridad
- 5. ¿Estructura de cola de prioridad utilizada?
- 6. Java: cola de prioridad
- 7. Par dentro de la cola de prioridad
- 8. Base de datos de la Cola de prioridad
- 9. Cambiar la prioridad en una cola de prioridad personalizada
- 10. ¿Cómo hacer una actualización de prioridad eficiente en STL priority_queue?
- 11. cola de prioridad STL de C++ de los indicadores de nodo
- 12. Cola de prioridad de doble terminación
- 13. Cola de prioridad eliminar tiempo de complejidad
- 14. Implementación de cola de prioridad de Brodal
- 15. método de limpieza de cola de prioridad
- 16. STL: almacena referencias o valores?
- 17. Implementación de cola de prioridad en C
- 18. Cola de prioridad concurrente en .NET 4.0
- 19. Servicio con cola de prioridad en Android
- 20. Cola de prioridad de Java con un comparador anónimo personalizado
- 21. Comparación de implementaciones de cola de prioridad en Haskell
- 22. Actualizar git confirmar fecha de autor al modificar
- 23. Mapa de STL - insertar o actualizar
- 24. mapa STL contiene referencias no se compila
- 25. ¿Una cola de prioridad que permite una actualización de prioridad eficiente?
- 26. Cola de prioridad con prioridades de elementos dinámicos
- 27. Repriorización de la cola de prioridad (manera eficiente)
- 28. Reheapify java.util.PriorityQueue después de actualizar los elementos
- 29. Entity Framework: cómo actualizar la base de datos al modificar el modelo
- 30. Eliminación de un elemento arbitrario de la cola de prioridad
O escriba esto o escriba su propia implementación, ya que sabe qué elementos cambiaron, y make_heap() no. –
@MtnViewJohn ¿tiene una muestra de trabajo? ¿O un fragmento de código? No es necesario nada, solo un ejemplo muy pequeño –
Aquí hay un [enlace] [1] a la implementación de SGI de prioridad_cola. Puede copiar esto y extenderlo para incluir un método de reparación que llame a make_heap() para arreglar el montón después de cambiar su contenido. La sugerencia de @NathanS también es muy buena: a medida que modifiques cada nodo, realiza inmediatamente las operaciones de rotación de montón necesarias para mantener la propiedad de montón. [1] http://www.sgi.com/tech/stl/stl_queue.h – MtnViewJohn