2009-04-10 10 views
6

¿Por qué la mayoría de las colas de prioridad/montón se implementan como 0 siendo la prioridad más alta? Estoy asumiendo que estoy perdiendo algún principio matemático clave. Como estaba implementando mi propia cola de prioridad recientemente, me pareció más fácil escribir la función de inserción si la prioridad aumentaba con el valor entero, pero aparentemente las personas más inteligentes que yo creen que debería ir en la dirección opuesta.¿Por qué las colas de prioridad usan principalmente 0 como la prioridad más importante?

¿Alguna idea?

Respuesta

13

La mayoría de las colas de prioridad se implementan como fibonacci heap o algo similar. Esa estructura de datos admite extraer el mínimo en tiempo constante, lo que hace que sea natural hacer que 0 sea la prioridad más alta, y sacar elementos de la cola extrayendo el mínimo.

+0

Aprendí algo nuevo. ¡Gracias! –

+0

Esto es engañoso: todos los montoncitos que escuché sobre soporte * determinando * el mínimo en tiempo constante; pero * eliminar * el elemento mínimo (lo que hace que el segundo elemento más pequeño se convierta en el nuevo mínimo) siempre requiere el tiempo 'O (log (n))'. Esto es bastante fundamental; de lo contrario, podría usar ese montón para hacer un algoritmo de clasificación 'O (n)'. Las ventajas de rendimiento de un montón de fibonacci (sobre el montón binario simple) se encuentran en otras operaciones, no en estas dos operaciones estándar. –

+1

¡Además, esta respuesta ni siquiera aborda la pregunta! Los montones de Fibonnacci también pueden ayudar a extraer el máximo en tiempo constante; es solo una convención. –

2

No creo que haya ningún motivo de diseño para ello. Probablemente sea solo porque la mayoría de los programadores están acostumbrados a pensar en 0 como el primer elemento. Otra razón podría ser porque los enumeradores comienzan en 0, por lo que el primer valor entero enum "Más alto" será 0.

6

Si alguna vez aumenta, ¿cómo podría establecer algo con la máxima prioridad? (+1 para la respuesta de rossfab :)

2

Como contraejemplo, en lo que es sin duda uno de los más fácilmente disponible (si no se utiliza) implementaciones cola de prioridad, a saber, de std::priority_queue STL, el elemento top() es el que numéricamente más alto según operator<. Por supuesto, todo el mundo está acostumbrado a la convención de orden jerárquico más bajo, por lo que esto atrapa a muchas personas la primera vez que lo usan.

4

La razón por la que a menudo sucede es que las colas de prioridad se utilizan para implementar algoritmos como Dijkstra y A *, donde la prioridad es la distancia al nodo y primero desea procesar nodos más cercanos.

0

No hay nada de inherente en una cola de prioridad que haga de 0 una mejor opción para la máxima prioridad. Sin embargo, para alguien que escribe una implementación reutilizable, tendrá que elegir algo, y 0 está bien definido, sin importar qué tipo de valor de coma flotante o integral use para su prioridad.

Incluso al escribir una implementación privada, si decide que solo necesita 256 niveles de prioridad y usa un carácter sin signo como prioridad y tiene 255 como prioridad principal, deberá revisar cuidadosamente todo su código si decide que necesitas más niveles

Cuestiones relacionadas