Download - Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Transcript
Page 1: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Guillermo Palma

Universidad Simón BolívarDepartamento de Computación y T.I.

CI-2612: Algoritmos y Estructuras de Datos II

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 1 / 27

Plan

1 Heaps

2 Colas de Prioridad

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 2 / 27

Page 2: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Heaps

Definiciones

HeapEs una estructura de árbol binario que almacena una colección declaves y tiene las siguientes dos propiedades:

Todas las hojas en el mismo nivel y todas los nodos internostienen grado 2, excepto posiblemente por el último nivel, el cuales construido de izquierda a derecha.Propiedad del Heap:

I Para un Max-heap la clave de un nodo x es menor o igual a laclave del padre, esto es Parent(x) ≥ x

I Para un Min-heap la clave de un nodo x es mayor o igual a la clavedel padre, esto es Parent(x) ≤ x ,

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 4 / 27

Heaps

Max-heap

Para todos los nodos x , excepto la raíz, se cumple que Parent(x) ≥ x

8

7 4

2 3 1

Figura: Ejemplo de un Max-heap

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 5 / 27

Page 3: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Heaps

Min-heap

Para todos los nodos x , excepto la raíz, se cumple que Parent(x) ≤ x

1

3 8

6 7 9

Figura: Ejemplo de un Min-heap

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 6 / 27

Heaps

Representación de un HeapSe puede representar como un arregloLa raíz es A[1]Padre de A[i] = A[bi/2c] (Parent (i) = bi/2c )Hijo izquierdo de A[i] = A[2i] (LEFT (i) = 2i)Hijo derecho de A[i] = A[2i + 1] (RIGHT (i) = 2i + 1)Altura del heap A ≤ length(A)

Figura: Ejemplo de un Max-heap. Fuente [1]

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 7 / 27

Page 4: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Heaps

MAX-HEAPIFY

Procedimiento que mantiene las propiedades de un HeapSea un nodo i más pequeño que su hijo:

I Los subárboles izquierdo y derecho de i son Max-heapsI Intercambia con el hijo más grandeI Mover la clave hacia bajo del heapI Continuar hasta que no haya ningún nodo sea más pequeño que

su hijo

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 8 / 27

Heaps

Ejemplo de MAX-HEAPIFY6.2 Maintaining the heap property 155

16

4 10

14 7 9

2 8 1(a)

16

14 10

4 7 9 3

2 8 1(b)

16

14 10

8 7 9 3

2 4 1(c)

3

1

3

4 5 6 7

9 10

2

8

1

3

4 5 6 7

9 10

2

8

1

3

4 5 6 7

9 10

2

8

i

i

i

Figure 6.2 The action of MAX-HEAPIFY.A; 2/, where A:heap-size D 10. (a) The initial con-figuration, with AŒ2! at node i D 2 violating the max-heap property since it is not larger thanboth children. The max-heap property is restored for node 2 in (b) by exchanging AŒ2! with AŒ4!,which destroys the max-heap property for node 4. The recursive call MAX-HEAPIFY.A; 4/ nowhas i D 4. After swapping AŒ4! with AŒ9!, as shown in (c), node 4 is fixed up, and the recursive callMAX-HEAPIFY.A; 9/ yields no further change to the data structure.

children to satisfy the max-heap property. The node indexed by largest, however,now has the original value AŒi !, and thus the subtree rooted at largest might violatethe max-heap property. Consequently, we call MAX-HEAPIFY recursively on thatsubtree.

The running time of MAX-HEAPIFY on a subtree of size n rooted at a givennode i is the ‚.1/ time to fix up the relationships among the elements AŒi !,AŒLEFT.i/!, and AŒRIGHT.i/!, plus the time to run MAX-HEAPIFY on a subtreerooted at one of the children of node i (assuming that the recursive call occurs).The children’s subtrees each have size at most 2n=3—the worst case occurs whenthe bottom level of the tree is exactly half full—and therefore we can describe therunning time of MAX-HEAPIFY by the recurrenceT .n/ ! T .2n=3/C‚.1/ :

Figura: Llamada MAX-HEAPIFY(A, 2, 10). a) A[2] viola la propiedad delHeap. b) A[4] viola la propiedad del Heap. c) Se cumple la propiedad delMax-heap. Fuente [1]

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 9 / 27

Page 5: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Heaps

Procedimiento MAX-HEAPIFYProcedimiento MAX-HEAPIFY(A, i, n)inicio

l ← LEFT(i) ;r ← RIGHT(i);si l ≤ n y A[l] > A[i] entonces

largest ← l ;

en otro casolargest ← i ;

si r ≤ n y A[r ] > A[largest ] entonceslargest ← r ;

si largest 6= i entoncesSWAP(A[i],A[largest ]) ;MAX-HEAPIFY(A, largest ,n) ;

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 10 / 27

Heaps

Tiempo del peor caso de MAX-HEAPIFY

Se recorre el camino más largo de la raíz a la hojaEn cada nivel se hace dos comparacionesO(Altura del heap), esto es O(log n)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 11 / 27

Page 6: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Sobre las Colas de PrioridadTipo abstracto de datos que contiene a un conjunto de elementosidentificados con una clave, en donde los elementos sonrequeridos por el orden de sus claves.El elemento con más clave más grande (o pequeña) es requeridoprimeroSoporta las operaciones de insertar, eliminar el máximo (mínimo),obtener el máximo (mínimo), e incrementar clave.Ejemplos de usos de las Colas de Prioridad:

I El planificador de procesos de un OS, tiene una cola de prioridadpara permitir el acceso al CPU al proceso de mayor prioridad

I Se usan en los algoritmos para determinar el árbol mínimo cobertorI Se usan en los algoritmos para determinar caminos de costo

mínimoPosible implementaciones:

I Como un arregloI Como una lista enlazadaI Como un Max-Heap (o Min-Heap)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 13 / 27

Colas de Prioridad

Operaciones de las Colas de Prioridad

Dada una representación de una Cola de Prioridad como unconjunto ordenado S, en donde nos interesa obtener el elementomayor de S se tienen las siguientes operaciones:

I INSERT(S, x): Incluye un elemento con clave x en el conjunto SI MAXIMUM(S): Obtiene el elemento x con la clave más grandeI INCREASE-KEY(S, x , k ): Incrementa la clave del x en el conjunto

S, con la nueva clave kI EXTRACT-MAX(S): Elimina el elemento con la clave más grande

de S

Vamos a suponer que se implementa una Cola de Prioridad comoun Max-Heap.

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 14 / 27

Page 7: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Tarea

Hacer la especificación del TAD Cola de Prioridad

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 15 / 27

Colas de Prioridad

HEAP-MAXIMUM

Función HEAP-MAXIMUM(A)inicio

retornar A[1]

HEAP-MAXIMUM es O(1)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 16 / 27

Page 8: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Ejemplo de HEAP-MAXIMUM

Figura: En este Max-Heap se tiene que HEAP-MAXIMUM retorna 7

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 17 / 27

Colas de Prioridad

HEAP-EXTRACT-MAX

Extrae el elemento con clave más grande del Max-HeapIntercambia el elemento raíz con el último elementoSe decrementa el tamaño del Max-HeapSe llama a MAX-HEAPIFY para arreglar el valor de la nueva raíz

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 18 / 27

Page 9: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Ejemplo de HEAP-EXTRACT-MAX

Figura: Se extrae el elemento 16 del Max-Heap

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 19 / 27

Colas de Prioridad

Función HEAP-EXTRACT-MAX

Función HEAP-EXTRACT-MAX(A)inicio

si A.heapSize < 1 entoncesretornar error heap underflow

max ← A[1] ;A[1]← A[A.heapSize] ;A.heapSize← A.heapSize − 1 ;MAX-HEAPIFY(A,1) ;retornar max

HEAP-EXTRACT-MAX es O(log n)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 20 / 27

Page 10: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

HEAP-INCREASE-KEY

Se incrementa una clave existente en el conjuntoSe chequea si la nueva clave viola las propiedades del heapSi se violan entonces se atraviesa el árbol y se hacenintercambios, hasta encontrar la posición correcta para la nuevaclave

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 21 / 27

Colas de Prioridad

Ejemplo de HEAP-INCREASE-KEY

Figura: Se incrementa la clave 4 a 15 en el Max-Heap

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 22 / 27

Page 11: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Procedimiento HEAP-INCREASE-KEY

Procedimiento HEAP-INCREASE-KEY(A, i, key)inicio

si key < A[i] entonceserror la nueva clave es menor

A[i]← key ;mientras i > 1 ∧ A[PARENT (I)] < A[i] hacer

SWAP(A[i],A[PARENT (i)]) ;i ← PARENT (i) ;

HEAP-INCREASE-KEY es O(log n)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 23 / 27

Colas de Prioridad

MAX-HEAP-INSERT

Se quiere insertar un elemento nuevo en la Cola de PrioridadSe aumenta el tamaño del Max-Heap en una unidadSe agrega al final del Max-Heap una hoja con clave menos infinitoSe usa el procedimiento HEAP-INCREASE-KEY para incrementarla clave con menos infinito, con el valor que se quiere insertar

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 24 / 27

Page 12: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Colas de Prioridad

Ejemplo de MAX-HEAP-INSERT

Figura: Se inserta la clave 15 en el Max-Heap

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 25 / 27

Colas de Prioridad

Procedimiento MAX-HEAP-INSERT

Procedimiento MAX-HEAP-INSERT(A, key)inicio

A.heapSize← A.heapSize + 1 ;A[A.heapSize]← infinitoNegativo ;HEAP-INCREASE-KEY(A, A.heapSize, key )

MAX-HEAP-INSERT es O(log n)

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 26 / 27

Page 13: Colas de Prioridad · 2020. 9. 25. · Colas de Prioridad Sobre las Colas de Prioridad Tipo abstracto de datos que contiene a un conjunto de elementos identificados con una clave,

Referencias

T. Cormen, C. Leirserson, R. Rivest, and C. Stein.Introduction to Algorithms.McGraw Hill, 3ra edition, 2009.

(USB) Colas de Prioridad CI-2612 enero-marzo 2020 27 / 27