16
COLAS DE PRIORIDAD

Arboles y Colas de Prioridad en Java

Embed Size (px)

Citation preview

Page 1: Arboles y Colas de Prioridad en Java

COLAS DE PRIORIDAD

Page 2: Arboles y Colas de Prioridad en Java

Es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen.

Una cola de prioridad soporta acceso y eliminación del elemento de mayor prioridad: primero() y suprimir(). Puede implementarse como una lista ordenada por prioridad, cuya complejidad para el caso peor en la operación insertar es O(N), un árbol binario de búsqueda, con complejidad media en las operaciones primero() y suprimir(): O(log N), o un árbol binario de búsqueda equilibrado.

Page 3: Arboles y Colas de Prioridad en Java

CARACTERÍSTICAS GENERALES:

• Este tipo especial de colas tienen las mismas operaciones que las colas , pero con la condición de que los elementos se atienden en orden de prioridad.

• Ejemplos de la vida diaria serían la sala de urgencias de un hospital, ya que los enfermos se van atendiendo en función de la gravedad de su enfermedad.

• Entendiendo la prioridad como un valor numérico y asignando a altas prioridades valores pequeños, las colas de prioridad nos permiten añadir elementos en cualquier orden y recuperarlos de menor a mayor.

Page 4: Arboles y Colas de Prioridad en Java

IMPLEMENTACIÓN

Hay 2 formas de implementación:

• Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.

• Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.

Page 5: Arboles y Colas de Prioridad en Java

TIPOS

• Colas de prioridades con ordenamiento ascendente: en ellas los elementos se insertan de forma arbitraria, pero a la hora de extraerlos, se extrae el elemento de menor prioridad.

• Colas de prioridades con ordenamiento descendente: son iguales que la colas de prioridad con ordenamiento ascendente, pero al extraer el elemento se extrae el de mayor prioridad.

Page 6: Arboles y Colas de Prioridad en Java

OPERACIONES

Las operaciones de las colas de prioridad son las mismas que las de las colas genéricas:

• Crear: se crea la cola vacía.

• Añadir: se añade un elemento a la cola, con su correspondiente prioridad.

• Eliminar: se elimina el elemento frontal de la cola.

• Frente: se devuelve el elemento frontal de la cola.

• Destruye: elimina la cola de memoria.

Page 7: Arboles y Colas de Prioridad en Java

EJEMPLO EN JAVA

Page 8: Arboles y Colas de Prioridad en Java
Page 9: Arboles y Colas de Prioridad en Java

ARBOLES BINARIOS

Page 10: Arboles y Colas de Prioridad en Java

INTRODUCCION

• Vamos a hablar primero un poco de que son los arboles binarios; nos dice Wikipedia “Un árbol binario es un grafo conexo, acíclico y no dirigido tal que el grado de cada vértice no es mayor a 3″, eso significa que tenemos un grafo donde cada nodo puede tener máximo 2 hijos ( o hojas ) y estas hojas no pueden tener como hijos a cualquier otra hoja anterior como podemos ver en la siguiente imagen:

Page 11: Arboles y Colas de Prioridad en Java

EJEMPLO:

Podemos ver en la imagen como “Raíz” es padre de “Hoja 1″ y “Hoja 2″ y estas a su vez también son la raíz de las “Sub

hojas” y se vuelve un proceso recursivo hasta n cantidad de hojas.

Page 12: Arboles y Colas de Prioridad en Java

¿PARA QUE SIRVE UN ÁRBOL BINARIO?

Como todos sabemos un árbol binario es una estructura de datos, y como todas, este sirve para organizar datos para facilitar su manipulación, ya sea el ingreso, borrado o búsqueda de datos, y precisamente una de las principales ventajas de los árboles binarios es la búsqueda, ya que como en muchos algoritmos de búsqueda necesitamos tener la información ordenada y en nuestros árboles binarios precisamente los datos van ingresando de forma ordenada.

Recorridos con los conocidos métodos recursivos:

• Inorden

• Postorden

• Preorden

Page 13: Arboles y Colas de Prioridad en Java

¿CÓMO SE INGRESA LA INFORMACIÓN?

Como dije anteriormente, la información se ingresa de forma ordenada esto se resuelve de forma muy sencilla con estos pasos:

• Se toma el dato a ingresar X

• Partiendo de la raíz preguntamos: Nodo == null ( o no existe ) ?

• En caso afirmativo X pasa a ocupar el lugar del nodo y ya hemos ingresado nuestro primer dato.

• En caso negativo preguntamos: X < Nodo

• En caso de ser menor pasamos al Nodo de la IZQUIERDA del que acabamos de preguntar y repetimos desde el paso 2 partiendo del Nodo al que acabamos de visitar

• En caso de ser mayor pasamos al Nodo de la DERECHA y tal cual hicimos con el caso anterior repetimos desde el paso 2 partiendo de este nuevo Nodo.

Page 14: Arboles y Colas de Prioridad en Java

• Nos daremos cuenta de que es un proceso RECURSIVO en el cual al final por más grande que sea el árbol el dato a entrar ocupará un lugar, vamos a ejemplificar lo ya mencionado con una imagen:

Page 15: Arboles y Colas de Prioridad en Java
Page 16: Arboles y Colas de Prioridad en Java