Algoritmos de Ordenamiento

Anuncio
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).
Descargar