Upload
vuongdieu
View
216
Download
0
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
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
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
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
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
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
� 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