fbpx
Wikipedia

Cola de prioridades

Una cola de prioridades es un tipo de dato abstracto similar a una cola en la que los elementos tienen adicionalmente, una prioridad asignada.[1][2]​ En una cola de prioridades un elemento con mayor prioridad será desencolado antes que un elemento de menor prioridad. Si dos elementos tienen la misma prioridad, se desencolarán siguiendo el orden de cola.

Operaciones

Una cola de prioridad ha de soportar al menos las siguientes dos operaciones:

  • Añadir con prioridad: se añade un elemento a la cola, con su correspondiente prioridad.
  • Eliminar elemento de mayor prioridad: se devuelve y elimina el elemento con mayor prioridad más antiguo que no haya sido desencolado de la cola.

Además suele implementarse una función frente (que habitualmente aquí se denomina encontrar-máximo o encontrar-mínimo), y que habitualmente se ejecuta en tiempo O(1). Esta operación y su rendimiento en tiempo es crucial en ciertas aplicaciones de las colas de prioridades.

Ciertas implementaciones avanzadas pueden incluir operaciones más complejas para la inspección de los elementos de mayor o menor prioridad, borrar la cola o ciertos subconjuntos de la cola, realizar inserciones en masa, la fusión de dos colas en una, aumentar la prioridad de los elementos, etc.

Características generales

Podrían verse a las colas de prioridades como colas modificadas, en las que en lugar de obtener el siguiente elemento de la cola, se obtiene elemento de mayor prioridad en la cola. De hecho, pilas y colas pueden ser vistas como tipos particulares de colas de prioridad. Para facilitar la lectura, se resume aquí el comportamiento de pilas y colas:

  • en una pila los elementos son recuperados en orden LIFO (lo último en entrar es lo primero en salir)
  • en una cola los elementos son recuperados en orden FIFO (lo primero en entrar es lo primero en salir)

Una pila podría verse como una cola de prioridades en la que los elementos son insertados en orden monótono creciente; y por tanto el último elemento insertado es siempre el primero en ser recuperado (ya que tendrá la máxima prioridad hasta el momento). En una cola, la prioridad de cada elemento insertado es monótona decreciente; y por tanto el primer elemento insertado es siempre el primero en ser recuperado (pues todos los elementos subsiguientes tendrán prioridades inferiores).

Un símil con la vida real podría ser la atención de enfermos en la sala de urgencias de un hospital. Podría verse la asignación de enfermos a la cola de enfermos por atender como una cola de prioridades, en las que son atendidos por orden de llegada y a la vez en función de la gravedad de su enfermedad. Aquí, el triaje sería la operación que permitiría conocer la prioridad con la que introducir al enfermo en la cola.

Implementación

Como con cualquier tipo de dato abstracto, una cola de prioridades puede tener múltiples implementaciones, siempre que cumplan las restricciones y el modelo formalizado. A continuación se distinguen implementaciones sencillas frente a otras más especializadas y, también, más habituales para las estructuras de datos que modelen colas de prioridad.

Implementaciones ingenuas

Hay muchas formas de implementar de forma sencilla, aunque a menudo ineficientemente, una cola de prioridades. A pesar de su ineficiencia, pueden ser muy útiles para observar la analogía con la realidad y comprender el funcionamiento abstracto de una cola de prioridades. Por ejemplo, una implementación posible sería mantener todos los elementos en una lista no ordenada. Cuando se pida el elemento con mayor prioridad, se buscan todos los elementos hasta encontrar el de mayor prioridad (la complejidad de esta estructura tendría, según la notación O grande complejidad computacional de   en inserción, y de   para el desencolado, ya que es la complejidad mínima para buscar en una lista no ordenada).

Implementación habitual

Para mejorar el rendimiento, las colas de prioridades suelen implementarse utilizando un montículo como estructura de datos subyacente, y obteniendo así un rendimiento de   para inserciones y borrados, y de   para la construcción inicial. Existen ciertos tipos especializados de montículos, como los montículos de Fibonacci, que pueden ofrecer mejores cotas asintóticas para algunas operaciones.

En lugar de un montículo, puede utilizarse un árbol binario de búsqueda auto-balanceable, en cuyo caso la inserción y borrado siguen teniendo un coste de  , mientras que la construcción de árboles a partir de secuencias de elementos ya existentes pasaría a tener un coste de  .

Desde el punto de vista de la complejidad computacional, las colas de prioridades son congruentes con los algoritmos de búsqueda.

Montículos especializados

Existen diversos tipos de montículos especializados que, o bien permiten operaciones adicionales, o bien tienen un rendimiento mejor que otros montículos para ciertos tipos de claves (representando la prioridad), y específicamente cuando las prioridades son números enteros.

  • Cuando el conjunto de claves es el conjunto conocido y finito  , y solo se necesitan las funciones de insertar, encontrar-mínimo, y extraer-mínimo, puede construirse una cola de prioridades de altura limitada implementada como un vector de   listas enlazadas junto con un entero apuntando a la lista superior, inicialmente  . La inserción de un elemento de clave   introduce el elemento en la  -ésima lista, y establece  , ambos en tiempo constante. Extraer-mínimo borra y devuelve el primer elemento de la lista de la prioridad establecida por el índice superior, que es incrementado hasta que apunte a una lista no vacía de nuevo, lo que lleva   tiempo en el peor caso. Puede verse un caso útil de este tipo de colas para la ordenación de vértices de un grafo en función de su grado.
  • Para el mismo conjunto  , un árbol de van Emde Boas podría admitir las operaciones de mínimo, máximo, insertar, eliminar, buscar, extraer-mínimo, extraer-máximo, predecesor y sucesor con un coste de  , aunque tiene un coste espacial para colas pequeñas de un  , para m número de bits de prioridad posibles.

Para aplicaciones que realicen una gran cantidad de operaciones de encontrar-mínimo por cada operación de extraer-mínimo, la complejidad temporal de las acciones de encontrar-mínimo puede reducirse a O(1) en todas las implementaciones de árboles y montículos, almacenando en la estructura el elemento con mayor prioridad después de cada inserción y borrado (a modo de caché). Para la inserción, esto tendrá un coste a lo sumo constante, ya que cada elemento nuevo insertado solo ha de compararse con el actual mínimo (ya cacheado). Para el borrado, esto añade como máximo el coste de encontrar-mínimo que, en general, es menos costoso que el propio borrado, por lo que el comportamiento temporal asintótico no se ve afectado, y el rendimiento práctico tampoco lo hará en general.

Equivalencia entre colas de prioridad y algoritmos de ordenación

Una cola de prioridad como sistema de ordenación

La semántica operacional de las colas de prioridades sugieren un mecanismo natural de ordenación: insertar todos los elementos en la cola de prioridad, y eliminarlos uno a uno: serán devueltos en orden. En realidad, este procedimiento es utilizado por diversos algoritmos de ordenamiento, una vez se elimina la abstracción de la cola de prioridades. Este método de ordenación es equivalente a los siguientes algoritmos de ordenación:

Algoritmo de ordenamiento Implementación cola de prioridades Mejor Media Peor
Heapsort Montículo      
Smoothsort Montículo de Leonardo      
Ordenamiento por selección Array sin ordenar      
Ordenamiento por inserción Array ordenado      
Ordenamiento con árbol binario Árbol binario de búsqueda auto-balanceable      

Un algoritmo de ordenación como cola de prioridades

Un algoritmo de ordenamiento también puede ser utilizado para implementar una cola de prioridades. Respecto a esto Throup publicó un artículo en 2007 en el que presentó una reducción de la representación de las colas de prioridades a la ordenación mediante una implicación por la cual si pueden ordenarse   claves en tiempo   por clave, entonces existe una cola de prioridades que soporta extraer-mínimo e insertar en tiempo  , y encontrar-mínimo en tiempo constante.[3]

Esto es, si hay un algoritmo que permita ordenar con coste   por cada clave, donde   es una función de  , existe un procedimiento para crear una cola de prioridad en la que se obtenga el elemento de mayor prioridad en  , y se inserten nuevos elementos (y se retiren elementos en el orden de su prioridad) en tiempo  . Por ejemplo, si para un cierto conjunto de claves tuviésemos un algoritmo de ordenación con coste   para la ordenación de una estructura, podría crearse una cola de prioridades con coste   para obtener el elemento de mayor prioridad y con coste   para la inserción y borrado en orden.

Implementación en Maude

Para la implementación de las colas de prioridad el elemento a insertar tiene que ser de un tipo que soporte un orden total y eso lo conseguimos creando una teoría, que será la siguiente:

***( Vamos a manejar explicitamente las prioridades dentro de la cola, por lo que precisamos que el tipo base proporcione operaciones para acceder a la prioridad, y para compararlas. Se asume que p1 > p2, donde p1 y p2 son prioridades, significa que p1 es preferente frente a p2, esto es, un elemento con prioridad p1 es más prioritario que otro con prioridad p2. ) fth ELEMENTO-PRIORIDAD is protecting BOOL . sorts Elt Prioridad . *** operaciones op prioridad : Elt -> Prioridad . op _>_ : Prioridad Prioridad -> Bool. endfth 

Una vez que tenemos la teoría procedemos a la implementación de la cola de prioridad:

fmod COLA-PRIORIDAD {X :: ELEMENTO-PRIORIDAD} is sorts Cola PrioNV{X} ColaPrio{X} . subsort Cola PrioNV{X} < ColaPrio{X} . *** operaciones op crear : -> Cola PrioNV{X} . op encolar : X$Elt Cola Prio{X} -> Cola PrioNV{X} [ctor] . *** constructores op desencolar : Cola Prio{X} -> Cola {X} . *** selectores op frente : Cola PrioNV{X} -> X$Elt . *** variables var C : Cola PrioNV{X} . var E : X$Elt . *** ecuaciones eq desencolar(crear) = crear . eq desencolar(encolar(E,crear)) = crear . eq desencolar(encolar(E,C)) = if prioridad(E) > prioridad(frente(C)) then C else encolar(E,desencolar(C)) fi . eq frente(encolar(E,crear)) = E . eq frente(encolar(E,C)) = if prioridad(E) > prioridad(frente(C)) then E else frente(C) fi . endfm 

Posible instanciación

***( Usamos pares de naturales, en la que el primer valor es un dato, y el segundo su prioridad. Suponemos que un valor natural más pequeño indica mayor prioridad. ) fmod PAR-NAT is protecting NAT . sort ParNat . op <_:_> : Nat Nat -> ParNat . op info : ParNat -> Nat . op clave : ParNat -> Nat . vars E C : Nat . vars P1 P2 : ParNat . eq info(< E : C >) = E . eq clave(< E : C >) = C . endfm *** Realizamos la vista correspondiente view VParNat from ELEMENTO-PRIORIDAD to PAR-NAT is sort Elt to ParNat . sort Prioridad to Nat . op prioridad to clave . op _>_ to _<_ . endv *** Procedemos a la instanciación fmod COLA-PAR-NAT is protecting COLA-PRIORIDAD{VParNat} . endfm 

Ejemplo Cola Prioridad en Maude

 COLA-MEDIEVAL es un ejemplo de colas de prioridad en la que los elemento de la cola son plebeyos y nobles, en la cual la prioridad la tienen los nobles. 
 fth MEDIEVAL is sort Elt . op esNoble?: Elt --> Bool . endfth fmod COLA-MEDIEVAL {x::MEDIEVAL} is protecting NAT, BOOL . sort colaM{x} . subsort colaMNV{x} < colaM{x} . op crear: --> colaM{x} [ctor] . op insertar: x$Elt colaM{x} --> colaMNV{x} [ctor] . op extraer: colaM{x} --> colaM{x} . op frente: colaMNV{x} --> x$Elt . op NNobles: colaM{x} --> Nat . op NPlebleyos: colaM{x} --> Nat . var C: colaMNV{x} . var E: x$Elt . eq extraer(crear) = crear . eq extraer(insertar(E,crear)) = crear . eq extraer(insertar(E,C)) = if NOT(esNoble?(frente(c))) AND esNoble?(E) then c else insertar(E,extraer(c)) fi . eq frente(insertar(E,crear)) = E . eq frente(insertar(E,C)) = if (esNoble?(E)) AND (esNoble?(frente(C))) then E else frente(C) fi . eq NNobles(crear) = 0 . eq NNobles(insertar(E,C)) = if esNobles?(E) then 1 + NNobles(C) else NNobles(C) fi . eq NPlebleyos(crear) = 0 . eq NPlebleyos(insertar(E,C)) = if NOT(esNobles?(E)) then 1 + NPlebeyos(C) else NPlebeyos(C) fi . endfm 

Implementación en Java

Partimos a partir de la implementación en Java utilizando clases.

package colaPrioridadSimpleEnlazada; import colaException.*; public class ColaPrioridad<T> implements colaPrioridadInterface.ColaPrioridad { class Celda<T> { T elemento; int prioridad; Celda sig; } private Celda cola; public ColaPrioridad() { cola = new Celda(); cola.sig = null; } public boolean vacia() { return (cola.sig==null); } public <T> primero() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException(); return cola.sig.elemento; } public int primero_prioridad() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException(); return cola.sig.prioridad; } public void inserta(T elemento, int prioridad) { Celda<T> p,q; boolean encontrado = false; p = cola; while((p.sig!=null)&&(!encontrado)) { if (p.sig.prioridad<prioridad) encontrado = true; else p = p.sig; } q = p.sig; p.sig = new Celda(); p = p.sig; p.elemento = elemento; p.prioridad = prioridad; p.sig = q; } public void suprime() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException(); cola = cola.sig; } } // fin clase ColaPrioridad 

Referencias

  1. Introduction to Algorithms, 3rd Edition (en inglés) (3rd edition edición). The MIT Press. 31 de julio de 2009. ISBN 9780262033848. Consultado el 9 de enero de 2016. 
  2. The Algorithm Design Manual (en inglés) (2nd edition edición). Springer. 26 de julio de 2008. ISBN 9781848000698. Consultado el 9 de enero de 2016. 
  3. Thorup, Mikkel (1 de diciembre de 2007). «Equivalence Between Priority Queues and Sorting». J. ACM 54 (6). ISSN 0004-5411. doi:10.1145/1314690.1314692. Consultado el 9 de enero de 2016. 

Véase también

Enlaces externos

  • Descripción de Lee Killough
  •   Datos: Q629283

cola, prioridades, cola, prioridades, tipo, dato, abstracto, similar, cola, elementos, tienen, adicionalmente, prioridad, asignada, cola, prioridades, elemento, mayor, prioridad, será, desencolado, antes, elemento, menor, prioridad, elementos, tienen, misma, p. Una cola de prioridades es un tipo de dato abstracto similar a una cola en la que los elementos tienen adicionalmente una prioridad asignada 1 2 En una cola de prioridades un elemento con mayor prioridad sera desencolado antes que un elemento de menor prioridad Si dos elementos tienen la misma prioridad se desencolaran siguiendo el orden de cola Indice 1 Operaciones 2 Caracteristicas generales 3 Implementacion 3 1 Implementaciones ingenuas 3 2 Implementacion habitual 3 3 Monticulos especializados 4 Equivalencia entre colas de prioridad y algoritmos de ordenacion 4 1 Una cola de prioridad como sistema de ordenacion 4 2 Un algoritmo de ordenacion como cola de prioridades 5 Implementacion en Maude 5 1 Posible instanciacion 5 2 Ejemplo Cola Prioridad en Maude 6 Implementacion en Java 7 Referencias 8 Vease tambien 9 Enlaces externosOperaciones EditarUna cola de prioridad ha de soportar al menos las siguientes dos operaciones Anadir con prioridad se anade un elemento a la cola con su correspondiente prioridad Eliminar elemento de mayor prioridad se devuelve y elimina el elemento con mayor prioridad mas antiguo que no haya sido desencolado de la cola Ademas suele implementarse una funcion frente que habitualmente aqui se denomina encontrar maximo o encontrar minimo y que habitualmente se ejecuta en tiempo O 1 Esta operacion y su rendimiento en tiempo es crucial en ciertas aplicaciones de las colas de prioridades Ciertas implementaciones avanzadas pueden incluir operaciones mas complejas para la inspeccion de los elementos de mayor o menor prioridad borrar la cola o ciertos subconjuntos de la cola realizar inserciones en masa la fusion de dos colas en una aumentar la prioridad de los elementos etc Caracteristicas generales EditarPodrian verse a las colas de prioridades como colas modificadas en las que en lugar de obtener el siguiente elemento de la cola se obtiene elemento de mayor prioridad en la cola De hecho pilas y colas pueden ser vistas como tipos particulares de colas de prioridad Para facilitar la lectura se resume aqui el comportamiento de pilas y colas en una pila los elementos son recuperados en orden LIFO lo ultimo en entrar es lo primero en salir en una cola los elementos son recuperados en orden FIFO lo primero en entrar es lo primero en salir Una pila podria verse como una cola de prioridades en la que los elementos son insertados en orden monotono creciente y por tanto el ultimo elemento insertado es siempre el primero en ser recuperado ya que tendra la maxima prioridad hasta el momento En una cola la prioridad de cada elemento insertado es monotona decreciente y por tanto el primer elemento insertado es siempre el primero en ser recuperado pues todos los elementos subsiguientes tendran prioridades inferiores Un simil con la vida real podria ser la atencion de enfermos en la sala de urgencias de un hospital Podria verse la asignacion de enfermos a la cola de enfermos por atender como una cola de prioridades en las que son atendidos por orden de llegada y a la vez en funcion de la gravedad de su enfermedad Aqui el triaje seria la operacion que permitiria conocer la prioridad con la que introducir al enfermo en la cola Implementacion EditarComo con cualquier tipo de dato abstracto una cola de prioridades puede tener multiples implementaciones siempre que cumplan las restricciones y el modelo formalizado A continuacion se distinguen implementaciones sencillas frente a otras mas especializadas y tambien mas habituales para las estructuras de datos que modelen colas de prioridad Implementaciones ingenuas Editar Hay muchas formas de implementar de forma sencilla aunque a menudo ineficientemente una cola de prioridades A pesar de su ineficiencia pueden ser muy utiles para observar la analogia con la realidad y comprender el funcionamiento abstracto de una cola de prioridades Por ejemplo una implementacion posible seria mantener todos los elementos en una lista no ordenada Cuando se pida el elemento con mayor prioridad se buscan todos los elementos hasta encontrar el de mayor prioridad la complejidad de esta estructura tendria segun la notacion O grande complejidad computacional de O 1 displaystyle O 1 en insercion y de O n displaystyle O n para el desencolado ya que es la complejidad minima para buscar en una lista no ordenada Implementacion habitual Editar Para mejorar el rendimiento las colas de prioridades suelen implementarse utilizando un monticulo como estructura de datos subyacente y obteniendo asi un rendimiento de O log n textstyle O log n para inserciones y borrados y de O n displaystyle O n para la construccion inicial Existen ciertos tipos especializados de monticulos como los monticulos de Fibonacci que pueden ofrecer mejores cotas asintoticas para algunas operaciones En lugar de un monticulo puede utilizarse un arbol binario de busqueda auto balanceable en cuyo caso la insercion y borrado siguen teniendo un coste de O log n textstyle O log n mientras que la construccion de arboles a partir de secuencias de elementos ya existentes pasaria a tener un coste de O n log n textstyle O n log n Desde el punto de vista de la complejidad computacional las colas de prioridades son congruentes con los algoritmos de busqueda Monticulos especializados Editar Existen diversos tipos de monticulos especializados que o bien permiten operaciones adicionales o bien tienen un rendimiento mejor que otros monticulos para ciertos tipos de claves representando la prioridad y especificamente cuando las prioridades son numeros enteros Cuando el conjunto de claves es el conjunto conocido y finito 1 2 C displaystyle 1 2 ldots C y solo se necesitan las funciones de insertar encontrar minimo y extraer minimo puede construirse una cola de prioridades de altura limitada implementada como un vector de C displaystyle C listas enlazadas junto con un entero apuntando a la lista superior inicialmente C displaystyle C La insercion de un elemento de clave k displaystyle k introduce el elemento en la k displaystyle k esima lista y establece s u p e r i o r min s u p e r i o r k displaystyle mathrm superior leftarrow min mathrm superior k ambos en tiempo constante Extraer minimo borra y devuelve el primer elemento de la lista de la prioridad establecida por el indice superior que es incrementado hasta que apunte a una lista no vacia de nuevo lo que lleva O C displaystyle O C tiempo en el peor caso Puede verse un caso util de este tipo de colas para la ordenacion de vertices de un grafo en funcion de su grado Para el mismo conjunto 1 2 C displaystyle 1 2 ldots C un arbol de van Emde Boas podria admitir las operaciones de minimo maximo insertar eliminar buscar extraer minimo extraer maximo predecesor y sucesor con un coste de O log log C displaystyle O log log C aunque tiene un coste espacial para colas pequenas de un O 2 m 2 displaystyle O 2 m 2 para m numero de bits de prioridad posibles Para aplicaciones que realicen una gran cantidad de operaciones de encontrar minimo por cada operacion de extraer minimo la complejidad temporal de las acciones de encontrar minimo puede reducirse a O 1 en todas las implementaciones de arboles y monticulos almacenando en la estructura el elemento con mayor prioridad despues de cada insercion y borrado a modo de cache Para la insercion esto tendra un coste a lo sumo constante ya que cada elemento nuevo insertado solo ha de compararse con el actual minimo ya cacheado Para el borrado esto anade como maximo el coste de encontrar minimo que en general es menos costoso que el propio borrado por lo que el comportamiento temporal asintotico no se ve afectado y el rendimiento practico tampoco lo hara en general Equivalencia entre colas de prioridad y algoritmos de ordenacion EditarUna cola de prioridad como sistema de ordenacion Editar La semantica operacional de las colas de prioridades sugieren un mecanismo natural de ordenacion insertar todos los elementos en la cola de prioridad y eliminarlos uno a uno seran devueltos en orden En realidad este procedimiento es utilizado por diversos algoritmos de ordenamiento una vez se elimina la abstraccion de la cola de prioridades Este metodo de ordenacion es equivalente a los siguientes algoritmos de ordenacion Algoritmo de ordenamiento Implementacion cola de prioridades Mejor Media PeorHeapsort Monticulo n log n displaystyle n log n n log n displaystyle n log n n log n displaystyle n log n Smoothsort Monticulo de Leonardo n displaystyle n n log n displaystyle n log n n log n displaystyle n log n Ordenamiento por seleccion Array sin ordenar n 2 displaystyle n 2 n 2 displaystyle n 2 n 2 displaystyle n 2 Ordenamiento por insercion Array ordenado n displaystyle n n 2 displaystyle n 2 n 2 displaystyle n 2 Ordenamiento con arbol binario Arbol binario de busqueda auto balanceable n log n displaystyle n log n n log n displaystyle n log n n log n displaystyle n log n Un algoritmo de ordenacion como cola de prioridades Editar Un algoritmo de ordenamiento tambien puede ser utilizado para implementar una cola de prioridades Respecto a esto Throup publico un articulo en 2007 en el que presento una reduccion de la representacion de las colas de prioridades a la ordenacion mediante una implicacion por la cual si pueden ordenarse n displaystyle n claves en tiempo S n displaystyle S n por clave entonces existe una cola de prioridades que soporta extraer minimo e insertar en tiempo O S n displaystyle O S n y encontrar minimo en tiempo constante 3 Esto es si hay un algoritmo que permita ordenar con coste O S displaystyle O S por cada clave donde S displaystyle S es una funcion de n displaystyle n existe un procedimiento para crear una cola de prioridad en la que se obtenga el elemento de mayor prioridad en O 1 displaystyle O 1 y se inserten nuevos elementos y se retiren elementos en el orden de su prioridad en tiempo O S displaystyle O S Por ejemplo si para un cierto conjunto de claves tuviesemos un algoritmo de ordenacion con coste O n log log n displaystyle O n log log n para la ordenacion de una estructura podria crearse una cola de prioridades con coste O 1 displaystyle O 1 para obtener el elemento de mayor prioridad y con coste O log log n displaystyle O log log n para la insercion y borrado en orden Implementacion en Maude Editar En este articulo sobre informatica se detectaron varios problemas Por favor editalo para mejorarlo Necesita ser wikificado conforme a las convenciones de estilo de Wikipedia Carece de fuentes o referencias que aparezcan en una fuente acreditada Este aviso fue puesto el 8 de enero de 2016 Para la implementacion de las colas de prioridad el elemento a insertar tiene que ser de un tipo que soporte un orden total y eso lo conseguimos creando una teoria que sera la siguiente Vamos a manejar explicitamente las prioridades dentro de la cola por lo que precisamos que el tipo base proporcione operaciones para acceder a la prioridad y para compararlas Se asume que p1 gt p2 donde p1 y p2 son prioridades significa que p1 es preferente frente a p2 esto es un elemento con prioridad p1 es mas prioritario que otro con prioridad p2 fth ELEMENTO PRIORIDAD is protecting BOOL sorts Elt Prioridad operaciones op prioridad Elt gt Prioridad op gt Prioridad Prioridad gt Bool endfth Una vez que tenemos la teoria procedemos a la implementacion de la cola de prioridad fmod COLA PRIORIDAD X ELEMENTO PRIORIDAD is sorts Cola PrioNV X ColaPrio X subsort Cola PrioNV X lt ColaPrio X operaciones op crear gt Cola PrioNV X op encolar X Elt Cola Prio X gt Cola PrioNV X ctor constructores op desencolar Cola Prio X gt Cola X selectores op frente Cola PrioNV X gt X Elt variables var C Cola PrioNV X var E X Elt ecuaciones eq desencolar crear crear eq desencolar encolar E crear crear eq desencolar encolar E C if prioridad E gt prioridad frente C then C else encolar E desencolar C fi eq frente encolar E crear E eq frente encolar E C if prioridad E gt prioridad frente C then E else frente C fi endfm Posible instanciacion Editar Usamos pares de naturales en la que el primer valor es un dato y el segundo su prioridad Suponemos que un valor natural mas pequeno indica mayor prioridad fmod PAR NAT is protecting NAT sort ParNat op lt gt Nat Nat gt ParNat op info ParNat gt Nat op clave ParNat gt Nat vars E C Nat vars P1 P2 ParNat eq info lt E C gt E eq clave lt E C gt C endfm Realizamos la vista correspondiente view VParNat from ELEMENTO PRIORIDAD to PAR NAT is sort Elt to ParNat sort Prioridad to Nat op prioridad to clave op gt to lt endv Procedemos a la instanciacion fmod COLA PAR NAT is protecting COLA PRIORIDAD VParNat endfm Ejemplo Cola Prioridad en Maude Editar COLA MEDIEVAL es un ejemplo de colas de prioridad en la que los elemento de la cola son plebeyos y nobles en la cual la prioridad la tienen los nobles fth MEDIEVAL is sort Elt op esNoble Elt gt Bool endfth fmod COLA MEDIEVAL x MEDIEVAL is protecting NAT BOOL sort colaM x subsort colaMNV x lt colaM x op crear gt colaM x ctor op insertar x Elt colaM x gt colaMNV x ctor op extraer colaM x gt colaM x op frente colaMNV x gt x Elt op NNobles colaM x gt Nat op NPlebleyos colaM x gt Nat var C colaMNV x var E x Elt eq extraer crear crear eq extraer insertar E crear crear eq extraer insertar E C if NOT esNoble frente c AND esNoble E then c else insertar E extraer c fi eq frente insertar E crear E eq frente insertar E C if esNoble E AND esNoble frente C then E else frente C fi eq NNobles crear 0 eq NNobles insertar E C if esNobles E then 1 NNobles C else NNobles C fi eq NPlebleyos crear 0 eq NPlebleyos insertar E C if NOT esNobles E then 1 NPlebeyos C else NPlebeyos C fi endfmImplementacion en Java Editar En este articulo sobre informatica se detectaron varios problemas Por favor editalo para mejorarlo Necesita ser wikificado conforme a las convenciones de estilo de Wikipedia Carece de fuentes o referencias que aparezcan en una fuente acreditada Este aviso fue puesto el 8 de enero de 2016 Partimos a partir de la implementacion en Java utilizando clases package colaPrioridadSimpleEnlazada import colaException public class ColaPrioridad lt T gt implements colaPrioridadInterface ColaPrioridad class Celda lt T gt T elemento int prioridad Celda sig private Celda cola public ColaPrioridad cola new Celda cola sig null public boolean vacia return cola sig null public lt T gt primero throws ColaVaciaException if vacia throw new ColaVaciaException return cola sig elemento public int primero prioridad throws ColaVaciaException if vacia throw new ColaVaciaException return cola sig prioridad public void inserta T elemento int prioridad Celda lt T gt p q boolean encontrado false p cola while p sig null amp amp encontrado if p sig prioridad lt prioridad encontrado true else p p sig q p sig p sig new Celda p p sig p elemento elemento p prioridad prioridad p sig q public void suprime throws ColaVaciaException if vacia throw new ColaVaciaException cola cola sig fin clase ColaPrioridadReferencias Editar Introduction to Algorithms 3rd Edition en ingles 3rd edition edicion The MIT Press 31 de julio de 2009 ISBN 9780262033848 Consultado el 9 de enero de 2016 The Algorithm Design Manual en ingles 2nd edition edicion Springer 26 de julio de 2008 ISBN 9781848000698 Consultado el 9 de enero de 2016 Thorup Mikkel 1 de diciembre de 2007 Equivalence Between Priority Queues and Sorting J ACM 54 6 ISSN 0004 5411 doi 10 1145 1314690 1314692 Consultado el 9 de enero de 2016 Vease tambien EditarCola Colas circulares anillos BicolasEnlaces externos EditarDescripcion de Lee Killough Datos Q629283 Obtenido de https es wikipedia org w index php title Cola de prioridades amp oldid 125315747, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos