Algoritmos de Ordenamiento Límite inferior y Alg. Lineales Andrés Becerra Sandoval Ponticia Universidad Javeriana 14 de julio de 2007 Lenguajes III Introducción Algoritmo Bubble(burbuja) InsertionSort ShellSort MergeSort QuickSort HeapSort CountingSort RadixSort BucketSort Complejidad Θ(n2 ) O (n2 ), aunque es Θ(n) en el mejor caso Θ(n log2 n) Θ(n log n) Θ(n log n) en promedio, pero O (n2 ) Θ(n log n) Θ(n) Pero asume que A[i]<k! Θ(n) Pero asume dígitos Θ(n) Pero asume una dist. normal! Contenido ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort ComparisonSorts Algoritmo Bubble(burbuja) InsertionSort ShellSort MergeSort QuickSort HeapSort CountingSort RadixSort BucketSort Complejidad Θ(n2 ) O (n2 ), aunque es Θ(n) en el mejor caso Θ(n log2 n) Θ(n log n) Θ(n log n) en promedio, pero O (n2 ) Θ(n log n) Θ(n) Pero asume que A[i]<k! Θ(n) Pero asume dígitos Θ(n) Pero asume una dist. normal! Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort Modelo de comparaciones I Solo vamos a contar la complejidad en términos del número de comparaciones que se hacen I Ignoraremos las otras instrucciones I Usaremos un árbol que abstrae las comparaciones que hace un algoritmo para una entrada de un tamaño determinado. Arbol de decisión I Cada nodo interno se etiqueta por posiciones originales de elementos del arreglo I Cada hoja es una permutación de las posiciones del arreglo Árbol de decisión I Debe tener mas de n! hojas porque cada permutación debe ser considerada I Para cualquier algoritmo comparisonSort: I I hay un árbol de decisión para cada n el árbol modela todas las posibles trazas de ejecución Lema I Un árbol binario completo de altura h tiene 2h hojas (recuerda el repaso de mat. discretas?) I Cualquier árbol binario de altura h tiene menos de 2h hojas I l ≤ 2h (número de hojas) Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort Teorema I Todo algoritmo comparisonsort tiene una complejidad T (n) = Ω(n lg n) I Esto implica que mergesort y heapsort, son asintóticamente óptimos Demostración I l ≥ n! I Por el lema anterior, I I lg 2h ≥ lg n! h ≥ lg (n!) n! ≤ l ≤ 2h lo que implica 2h ≥ n! I La aproximación de Stirling (1730) dice que I h n ≥ lg ( )n e n = n lg ( ) e = n lg n − n lg e = Ω(n lg n) n! > ( ne )n Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort CountingSort 1 2 3 4 5 6 7 8 A 2 5 3 0 2 3 0 3 1 2 3 4 5 6 7 8 A 2 5 3 0 2 3 0 3 0 1 2 3 4 5 C 2 0 2 3 0 1 0 1 2 3 4 5 C 2 2 4 7 7 8 0 1 2 3 4 5 C 2 2 4 7 7 8 B 1 2 3 4 5 6 7 8 3 0 1 2 3 4 5 C 2 2 4 6 7 8 Algoritmo de Counting Sort Counting-Sort( A, B, k) 1 2 3 4 5 6 7 i ← 0 to k do C [i ] ← 0 for j ← 1 to length[A] do C [A[j ]] ← C [A[j ]] + 1 for j ← legnth[A] to 1 do B [C [A[j ]]] = A[j ] C [A[j ]] = C [A[j ]] − 1 for La complejidad del algorítmo es Θ(k + n): Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort Radix Sort - Ejemplo 329 720 720 329 457 355 329 355 657 839 457 436 436 436 → → 839 → 457 436 657 355 657 720 329 457 720 355 839 657 839 Algoritmo de Radix-Sort Radix-Sort( A, d ) 1 for i = 1 to d 2 Use un método de ordenamiento estable para ordenar el arreglo A por el dígito i Un algoritmo de ordenamiento estable hace que números con el mismo valor aparezcan en el arreglo ordenado en el mismo orden que tenían en el arreglo original. Dado números dígito puede de n tomar dígitos hasta k en los que posibles cada valores, Radix-Sort ordena correctamente estos números en Θ(d (n + k )) Dados r ≤ n b, números de b bits, y un entero positivo Radix-Sort ordena dichos números en un r tiempo de Θ(( / )( + 2 )). br n Por aqui vamos... ¾Que tan rápido podemos ordenar? ComparisonSorts Modelo de comparaciones Límite inferior para comparisonSorts Ordenamiento en tiempo Lineal CountingSort Radix-Sort Bucket-Sort Bucket-Sort I Funciona con números en el intervalo [0..1). I Se supone que la distribución de los números es uniforme. n subintervalos del mismo tamaño (llamados buckets) y distribuir los n I La idea es dividir el intervalo [0..1) en números en los buckets. Para producir la salida, se ordenan los numeros de cada bucket y se mezclan los elementos de todos los buckets. Bucket-Sort( A ) n ← length[A] for i ← 1 to n for do inserte A[ i ] en la lista B[ nA[i] ] do ordene la lista B[i] con Insertion-Sort i ← 1 to n Concatene las listas B[0], ... , B[n-1] de forma ordenada Ejemplo de Bucket-Sort A B 1 .78 0 2 .17 1 .12 .17 3 .39 2 .21 .23 4 .26 3 .39 5 .72 4 6 .94 5 7 .21 6 .68 8 .12 7 .72 9 .23 8 10 .68 9 .94 .78 .26 Algoritmo de Bucket-Sort La ecuación de recurrencia que describe el algoritmo es: T (n) = Θ(n) + , n −1 X i =0 O (ni2 ) y la complejidad de Bucket-Sort es Θ(n).