33
DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE Análisis y Diseño de Algoritmos Ordenamiento – Heapsort y Quicksort

DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS ... - INAOEjagonzalez/ADA/Ordenamiento-a.pdf · Algoritmo Peor Caso Caso Promedio Mejor Caso Comentarios InsertionSort Θ(n2) Θ(n2) Θ(n)

Embed Size (px)

Citation preview

D R . J E S Ú S A . G O N Z Á L E Z B E R N A L C I E N C I A S C O M P U T A C I O N A L E S

I N A O E

Análisis y Diseño de Algoritmos

Ordenamiento – Heapsort y Quicksort

2

Heaps

�  Un Heap es una estructura de datos binaria ¡  Un arreglo que representa un árbol binario completo

2

3

Heaps

�  Cada nodo es un elemento del arreglo ¡  Almacena el valor en el nodo ¡  Árbol completamente lleno, excepto en el último nivel (tal vez)

�  Arreglo representando el heap ¡  2 atributos

÷ Length[A] à # elementos en el arreglo A ÷ Heap-size[A] à # elementos en el heap almacenados en arreglo A

¡  Heap-size ≤ length[A] ¡  Raíz del árbol A[1]

3

4

Heaps

�  Dado el índice i de un nodo ¡  Parent(i) à return floor(i/2) ¡  Left(i) à return 2i ¡  Right(i) à return (2i + 1)

�  Propiedad Heap ¡  MAX-HEAP: A[PARENT(i)] ≥ A[i] ¡  MIN-HEAP: A[PARENT(i)] ≤ A[i]

�  Altura de un nodo ¡  # arcos de la ruta simple más larga del nodo a una hoja

�  Altura del árbol ¡  Altura de la raíz ¡  Altura del árbol es Θ(lgn)

4

5

Heaps

�  Manipulación de heaps ¡  Entrada

÷ Arreglo A y un índice i ÷ Asume que LEFT(i) y RIGHT(i) son heaps

¢  A[i] puede ser menor que sus hijos •  Viola la propiedad de un heap (MAX-HEAP)

¡  Heapify ÷ Mueve A[i] en el heap

¢  El subárbol con raíz en el índice i se convierte en un heap

5

Heapify

�  Algoritmo Heapify ¡  Llamada recursiva a Heapify para sus i’s subárboles, si no

cumplen con la propiedad del heap

6

7

Heapify

�  Heap-size[A] à 10 �  A[2], i = 2 no cumple con la propiedad de un heap (MAX-HEAP)

7

Heapify 8

9

Heapify

�  Tiempo de ejecución de heapify ¡  En un subárbol de tamaño n, con raíz en el nodo i

÷  Θ(1), relación fija entre A[i], A[LEFT(i)], A[RIGHT(i)] más

÷  Tiempo de ejecución de HEAPIFY en un subárbol con raíz en uno de los hijos de i ¢  Tamaño de los subárboles de los hijos es a lo más

2n/3 ÷  T(n) ≤ T(2n/3) + Θ(1)

¢  Por el caso 2 del método maestro ¢  T(n) = O(lgn)

÷  Alternativa ¢  Caracterizar tiempo de ejecución de HEAPIFY

sobre un nodo de altura h como: O(h)

9

Construcción del Heap

�  Uso de heapify para construir el heap ¡  Los elementos A[(floor(n/2) + 1) … n] son hojas del árbol ¡  Orden en que se procesan los nodos garantiza que los

subárboles con raíz en los hijos del nodo i son heaps antes de que HEAPIFY se ejecute en dicho nodo

10

Construcción del Heap

�  Algoritmo BuildHeap

11

Construcción del Heap 12

13

Análisis BuildHeap

�  Cada llamada a HEAPIFY ß O(lgn), hay O(n) llamadas ¡  Cuando mucho O(nlgn)

÷ Cota superior pero no justa

¡  Propiedad: En el n-elemento de un HEAP hay a lo más nodos de altura h

÷ Tiempo de ejecución de HEAPIFY en nodo altura h à O(h) ÷ Costo de BuildHeap

13

⎡ ⎤12/ +hn

14

Análisis BuildHeap 14

⎣ ⎦ ⎣ ⎦

O(n).2)*1/2*O(n esejecución de tiempoel Entonces

.2/1,2)2/11(

2/12

Entonces

1/2. y x h k caso nuestroEn

.)1(

:obtenemospor x iaequivalenc la de lados ambos ndoMultiplica

.)1(

1 a igual es ,1

1

lados, ambos de derivada La 1. |x| para ,1

1 que Note

22/1*)(

2

BuildHeap deejecución de tiempoel obtenemosanterior resultado Del

20h

20

20

1

0

0k

lg

0

lg

01

=

==−

=

==

−=

−=⎟

⎞⎜⎝

⎛−

=⎟⎠

⎞⎜⎝

<−

=

⎟⎟⎠

⎞⎜⎜⎝

⎛=⎥⎥

⎤⎢⎢

∑∑

∑∑

=

=

=

−∞

=

=

==+

xh

xxkx

xkx

xdxdx

dxd

xx

hnOhOn

h

h

k

k

k

k

k

k

n

hh

n

hh

15

Algoritmo HeapSort 15

16

Algoritmo HeapSort 16

17

Análisis de HeapSort

�  BUILD-HEAP: O(n) �  for loop: n-1 veces �  Intercambio de elementos: O(1) �  MAX-HEAPIFY: O(lgn) �  Total time: O(nlgn) �  Una implementación buena de QuickSort es mejor

que HeapSort

17

18

Colas con Prioridades (Priority Queues)

�  Utilizar heaps para implementar colas con prioridades

�  Priority queue ¡  Estructura de datos para mantener un conjunto S de elementos ¡  Cada elemento tiene un valor asociado llamado à llave ¡  Operaciones

÷  Insert(S,x), inserta x en S, S ß S ∪ {x} ÷ Maximum(S), regresa el elemento de S con llave más alta ÷ Extract-Max(S), remueve y regresa el elemento de S con llave más

alta

19

Aplicaciones de “Priority Queues”

�  Colas para calendarizar trabajos en una computadora compartida ¡  Mantiene la pista de los trabajos y sus prioridades ¡  Cuando termina un trabajo, inicia el trabajo con más alta

prioridad ÷ Extract-Max

¡  Inserta un trabajo en cualquier momento con Insert

19

20

Operaciones para Priority Queues

21

Tiempo de Ejecuciónpara Priority Queues

�  Heap-Extract-MAX ß O(lgn) �  Heap-Insert ß O(lgn) �  Heap-Increase-Key ß O(lgn)

21

22

QuickSort

�  Sigue estrategia divide y conquista ¡  Divide

÷ Particiona A[p…r] en 2 subarreglos, A[p…q] y A[q+1…r]

÷ Cada elemento de A[p…q] ≤ cada elemento de A[q+1…r]

÷ En esta parte se calcula el índice q

¡  Conquista ÷ A[p…q] y A[q+1…r] son recursivamente ordenados

¡  Combina ÷ No se requiere hacer trabajo en esta parte, A[p…r] queda ordenado

23

Algoritmo QuickSort

24

Algoritmo Partition

�  Existen diferentes algoritmos para particionar

24

25

Algoritmo Partition

�  Gris Claro: partición menor �  Gris Oscuro: partición mayor �  Último elemento: pivote �  Blanco: Sin asignar

25

26

Performance de QuickSort

�  Depende de si la partición está o no balanceada ¡  Depende de qué elemento se utilizó para particionar ¡  Partición balanceada

÷ Rápido como MergeSort ¡  Partición no-balanceada

÷ Lento como InsertionSort

26

27

Performance de QuickSort

�  Peor caso en partición (entrada previamente ordenada) ¡  1 región con n-1 elementos y otra con 1 elemento ¡  Asume que esto sucede en cada paso del algoritmo ¡  Costo de particionar Θ(n), T(1) = Θ(1) ¡  Recurrencia T(n) = T(n-1) + Θ(n)

27

)(

)(

2

1

1

n

k

k

n

k

n

k

Θ=

⎟⎠

⎞⎜⎝

⎛Θ=

Θ=

=

=

)(

)1(21

Aritmética Serie

21

n

nnkn

k

Θ=

+=∑=

28

Performance de QuickSort

�  Mejor Caso en Partición ¡  Regiones de tamaño n/2 ¡  Recurrencia T(n) = 2T(n/2) + Θ(n) ¡  Caso 2, teorema maestro ß T(n) = Θ(nlgn)

Performance de QuickSort

�  Particionamiento balanceado ¡  Caso promedio más cerca del mejor caso que del peor ¡  Suponiendo un split en proporción 9-1ß parece muy

desbalanceado ¡  Recurrencia T(n) = T(9n/10) + T(n/10) + n

÷ Vea el árbol de recurrencia en la siguiente lámina

29

Performance de QuickSort

�  Árbol de recurrencia caso de split balanceado

30

Performance de QuickSort

�  Particionamiento balanceado ¡  Cada nivel tiene costo n ¡  Condición frontera a profundidad log10n = Θ(lgn)

÷ Los niveles tienen un costo de cuando mucho n

¡  La recursión termina a profundidad log10/9n = Θ(lgn) ¡  Costo total de QuickSort ß = Θ(nlgn)

÷ Para cada split con proporción constante

31

Performance de QuickSort

�  Intuición para el caso promedio ¡  Partition produce buenos y malos splits

÷ Distribuidos aleatoriamente ÷ Suponga que los buenos y malos alternan (en el árbol)

¢  Bueno à splits del mejor caso ¢  Malo à splits del peor caso

÷ Tiempo de ejecución es todavía Θ(nlgn) ¢  Con una constante más grande escondida por la notación-O

32

Comparación de Algoritmos

Algoritmo Peor Caso

Caso Promedio Mejor Caso Comentarios

InsertionSort Θ(n2) Θ(n2)

Θ(n)

MergeSort Θ(nlgn) Θ(nlgn) Θ(nlgn) Requiere Memoria

HeapSort Θ(nlgn) Θ(nlgn) Θ(nlgn) Constantes Grandes

QuickSort Θ(n2)

Θ(nlgn) Θ(nlgn) Constantes Pequeñas

33