Algoritmos de ordenamiento

Anuncio
Introducción a la Computación
Algoritmos de Ordenamiento II
Esteban E. Mocskos ([email protected])
Facultad de Ciencias Exactas y Naturales, UBA
CONICET
23/04/2013
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
1 / 15
Introducción
Outline
1
Introducción
2
Bubble Sort
El programa
3
Merge Sort
4
Tarea
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
2 / 15
Introducción
Ordenamiento de una secuencia
Tenemos una secuencia de elementos de un tipo T .
Queremos modificar la secuencia tal que:
sus elementos queden en orden creciente
vamos a hacerlo permutando elementos
Ejemplo
Si al comienzo tuviéramos la secuencia a == [2, 1, 2, 1],
debo terminar con a0 == [1, 1, 2, 2].
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
3 / 15
Introducción
Describiendo qué hace
Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las
ambigüedades que tiene el lenguaje natural.
Usamos ≤ para denotar una relación de orden entre elementos de T .
Debo decir qué va a hacer mi algoritmo:
problema sort(a : [T]){
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
4 / 15
Introducción
Describiendo qué hace
Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las
ambigüedades que tiene el lenguaje natural.
Usamos ≤ para denotar una relación de orden entre elementos de T .
Debo decir qué va a hacer mi algoritmo:
problema sort(a : [T]){
devuelvo una secuencia a0 que cumpla:
mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1
}
Con a0 denotamos el valor que contiene la variable a a la salida.
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
4 / 15
Introducción
Describiendo qué hace
Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las
ambigüedades que tiene el lenguaje natural.
Usamos ≤ para denotar una relación de orden entre elementos de T .
Debo decir qué va a hacer mi algoritmo:
problema sort(a : [T]){
devuelvo una secuencia a0 que cumpla:
mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1
}
Con a0 denotamos el valor que contiene la variable a a la salida.
mismosElementos(a, b : [T]) : Bool =len(a) ==len(b) and
(∀x ∈ a) cuenta(x, a) == cuenta(x, b)
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
4 / 15
Introducción
Describiendo qué hace
Vamos a plantear cómo describirlo con un poquito más de formalidad de manera de evitar las
ambigüedades que tiene el lenguaje natural.
Usamos ≤ para denotar una relación de orden entre elementos de T .
Debo decir qué va a hacer mi algoritmo:
problema sort(a : [T]){
devuelvo una secuencia a0 que cumpla:
mismosElementos(a, a0 ) and (∀j ∈ [0..len(a) − 1)) a0j ≤ a0j+1
}
Con a0 denotamos el valor que contiene la variable a a la salida.
mismosElementos(a, b : [T]) : Bool =len(a) ==len(b) and
(∀x ∈ a) cuenta(x, a) == cuenta(x, b)
cuenta(x : T, a : [T]) : Int =len( [y | y ∈ a, y == x] )
|
{z
}
todas las apariciones de x
que es una manera de contar la cantidad de apariciones del elemento x en la secuencia a.
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
4 / 15
Bubble Sort
Outline
1
Introducción
2
Bubble Sort
El programa
3
Merge Sort
4
Tarea
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
5 / 15
Bubble Sort
El algoritmo de burbujeo (Bubble Sort)
La operación básica es el intercambio o swap entre elementos adyacentes.
El procedimiento consiste en realizar una serie de pasadas sobre los datos a
ordenar.
Las pasadas comienzan en uno de los extremos de la secuencia y avanzan hacia
el otro.
Se revisa cada par de elementos y se los invierte si están desordenados entre
ellos.
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
6 / 15
Bubble Sort
Ejemplo de Bubble Sort
Vamos a ordenar la secuencia a:
50 30 40 80 70 10 90 60
len(a) = 8
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
7 / 15
Bubble Sort
El programa
El programa
Esto es una propuesta de un programa que implementa el algoritmo de bubble sort,
a que no saben las cosas que no me gustan de esta propuesta?:
def b u b b l e S o r t ( a ) :
f o r i i n range ( 0 , l e n ( a ) ) :
f o r j i n range ( 0 , l e n ( a ) − 1):
i f a [ j ] > a [ j +1]:
swap ( a , j , j +1)
return a
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
8 / 15
Bubble Sort
El programa
El programa
Esto es una propuesta de un programa que implementa el algoritmo de bubble sort,
a que no saben las cosas que no me gustan de esta propuesta?:
def b u b b l e S o r t ( a ) :
f o r i i n range ( 0 , l e n ( a ) ) :
f o r j i n range ( 0 , l e n ( a ) − 1):
i f a [ j ] > a [ j +1]:
swap ( a , j , j +1)
return a
problema swap(a : [Int], x, y : Int){
requiere 0 ≤ x ≤ len(a) − 1 and 0 ≤ y ≤ len(a) − 1
modifica a
asegura a0 [x] == a[y] and a0 [y] == a[x]
}
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
8 / 15
Bubble Sort
El programa
El programa
Esto es una propuesta de un programa que implementa el algoritmo de bubble sort,
a que no saben las cosas que no me gustan de esta propuesta?:
def b u b b l e S o r t ( a ) :
f o r i i n range ( 0 , l e n ( a ) ) :
f o r j i n range ( 0 , l e n ( a ) − 1):
i f a [ j ] > a [ j +1]:
swap ( a , j , j +1)
return a
problema swap(a : [Int], x, y : Int){
requiere 0 ≤ x ≤ len(a) − 1 and 0 ≤ y ≤ len(a) − 1
modifica a
asegura a0 [x] == a[y] and a0 [y] == a[x]
}
Los elementos más grandes se van moviendo o burbujeando hacia el extremo de la
secuencia.
Si no hay intercambios realizados después de una iteración completa es que la secuencia
está ordenada y el proceso termina.
La especificación del ciclo es muy parecida al upsort, pero no es igual... ¡van a tener que
adaptarla!
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
8 / 15
Bubble Sort
El programa
Complejidad de Bubble Sort
el ciclo externo de Bubble Sort itera n veces
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
9 / 15
Bubble Sort
El programa
Complejidad de Bubble Sort
el ciclo externo de Bubble Sort itera n veces
en cada iteración se hace una pasada llevando un elemento hacia el extremo (una
burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez?
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
9 / 15
Bubble Sort
El programa
Complejidad de Bubble Sort
el ciclo externo de Bubble Sort itera n veces
en cada iteración se hace una pasada llevando un elemento hacia el extremo (una
burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez?
el total de pasos es O(n + (n − 1) + . . . + 2) = O(n ∗ (n + 1)/2 − 1) = O(n2 )
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
9 / 15
Bubble Sort
El programa
Complejidad de Bubble Sort
el ciclo externo de Bubble Sort itera n veces
en cada iteración se hace una pasada llevando un elemento hacia el extremo (una
burbuja que sube). ¿Cuántos pasos hace el ciclo interno cada vez?
el total de pasos es O(n + (n − 1) + . . . + 2) = O(n ∗ (n + 1)/2 − 1) = O(n2 )
Ya vimos que los mejores algoritmos de ordenamiento son O(n log n)
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
9 / 15
Merge Sort
Outline
1
Introducción
2
Bubble Sort
El programa
3
Merge Sort
4
Tarea
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
10 / 15
Merge Sort
Merge Sort
Se basa en la idea de que se pueden secuencias ordenadas se pueden unir (o
hacerles un merge) en tiempo lineal.
Se van separando los arreglos hasta llegar a pedazos de longitud 2, que se
pueden ordenar fácilmente.
Luego se van ordenando los pedazos cada vez más grandes.
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
11 / 15
Merge Sort
Recursión
El mecanismo de recursión surge naturalmente en muchos casos. Los dos casos más
conocidos son:
1
La función factorial: factorial(n)=n*factorial(n-1)
2
La sucesión de Fibonnacci: Fibonnacci(n) = Fibonnacci(n-1)*Fibonnacci(n-2)
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
12 / 15
Merge Sort
Recursión
El mecanismo de recursión surge naturalmente en muchos casos. Los dos casos más
conocidos son:
Sı́, faltan los casos bases, sino esto nunca termina:
1
La función factorial: factorial(n)=n*factorial(n-1), factorial(0)=1
2
La sucesión de Fibonnacci: Fibonnacci(n) = Fibonnacci(n-1)*Fibonnacci(n-2),
Fibonnacci(0) = 1, Fibonnacci(1) = 1.
Este mecanismo suele ser muy elegante para implementar algoritmos, pero en los
lenguajes imperativos, es costoso desde el punto de vista computacional y no es
lo natural para hacer (recordar que el mecanismo habitual es la iteración).
Sin embargo, el algoritmo de merge sort, es uno de esos casos en el que la
implementación por medio de la recursión va muy bien.
En Python, una función recursiva es simplemente aquella que se llama a
sı́ misma, ni más ni menos.
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
12 / 15
Merge Sort
Merge Sort, implementación
La idea del algorirtmo mergeSort para ordenar una secuencia a es:
Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada).
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
13 / 15
Merge Sort
Merge Sort, implementación
La idea del algorirtmo mergeSort para ordenar una secuencia a es:
Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada).
Sea a1 la subsecuencia con los primeros n/2 elementos de a
Sea a2 la subsecuencia con los últimos n/2 elementos de a
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
13 / 15
Merge Sort
Merge Sort, implementación
La idea del algorirtmo mergeSort para ordenar una secuencia a es:
Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada).
Sea a1 la subsecuencia con los primeros n/2 elementos de a
Sea a2 la subsecuencia con los últimos n/2 elementos de a
Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 .
Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 .
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
13 / 15
Merge Sort
Merge Sort, implementación
La idea del algorirtmo mergeSort para ordenar una secuencia a es:
Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada).
Sea a1 la subsecuencia con los primeros n/2 elementos de a
Sea a2 la subsecuencia con los últimos n/2 elementos de a
Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 .
Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 .
Devolver el resultado de unir (merge) a01 y a02 .
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
13 / 15
Merge Sort
Merge Sort, implementación
La idea del algorirtmo mergeSort para ordenar una secuencia a es:
Si la longitud de la secuencia es 1 o 2, devolver la secuencia (ordenada).
Sea a1 la subsecuencia con los primeros n/2 elementos de a
Sea a2 la subsecuencia con los últimos n/2 elementos de a
Llamar (recursivamente) a mergeSort(a1 ), me devuelve a01 .
Llamar (recursivamente) a mergeSort(a2 ), me devuelve a02 .
Devolver el resultado de unir (merge) a01 y a02 .
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
13 / 15
Tarea
Outline
1
Introducción
2
Bubble Sort
El programa
3
Merge Sort
4
Tarea
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
14 / 15
Tarea
Ejercicios
Hoy también venimos tranqui:
1
Deben modificar la implementación dada en clase del algoritmo de burbujeo para
que termine en cuanto se detecte que la secuencia está ordenada. Se debe
proponer un invariante y mostrar un esquema que muestre que la propuesta tiene
sentido en el funcionamiento del algoritmo, también se debe mencionar cuál serı́a
la función variante.
2
Se debe implementar el algoritmo de merge sort. En este no les vamos a insistir
con los invariantes, bastante ya tienen con la recursión!
E. Mocskos (UBA–CONICET)
Clase 7: Algoritmos de Ordenamiento II
23/04/2013
15 / 15
Descargar