Académique Documents
Professionnel Documents
Culture Documents
Análisis y Diseño de
Algoritmos
1
Capítulo 1
2
Parte 1
• El curso
– Información general
• Introducción a los algoritmos
• Conceptos básicos de análisis de algoritmos
• Notación asintótica
El curso
• Contraseña: E6eJ2u
Normas del curso
• Celulares en silencio.
• Durante la clase Teórica no salir de la clase, a menos que sea una
emergencia.
• Participación constante del alumno (habrán puntos complementarios
por participación activa en los exámenes o prácticas calificadas).
• Pasión por aprender, responsabilidad, trabajo en equipo y respeto.
• Toda tarea será entregada a través del Aula Virtual.
• Las tareas presentadas con retraso tendrán una penalidad del 15%
por día de retraso (Máximo 3 días).
• Las fechas de examen por unidad están programadas y publicadas
en el Aula Virtual.
6
Calificación
Software Música
Programación Composición
Objetivos básicos para un algoritmo
• Siempre correcto
• Siempre termina
• En esta clase: performance (rendimiento)
– El performance (rendimiento) a menudo traza la línea entre lo que es
posible y lo que es imposible.
Análisis vs. Diseño
Ejemplo:
Entrada: 8 2 4 9 3 6
Salida: 2 3 4 6 8 9
Ordenamiento por inserción
30 10 40 20 i = j = key =
A[j] = A[j+1] =
1 2 3 4
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
3101 3.0A
Lecture 1 - 24
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Un ejemplo: Ordenamiento de inserción
InsertionSort(A, n)
for i ← 2 to n
do key ← A[i]
j ← i - 1
while j > 0 and A[j] > key
do A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Listo!
Ejemplo de Ordenamiento de inserción
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
2 3 4 8 9 6
2 3 4 6 8 9 done
Tipos de análisis
n
T = t2 + t 3 + … + t n =
while para la iesima
i 2 ti
donde t es el número de evaluaciones de la expresión
iteración del bucle for.
i
Analizando el ordenamiento de inserción
• T(n) = c1n + c2(n-1) + c3(n-1) + c4T + c5(T - (n-1)) + c6(T - (n-1)) + c7(n-1)
= c8T + c9n + c10
• ¿Qué puede ser T?
– Mejor caso – cuerpo de bucle interno que nunca se ejecuta
• ti = 1 T(n) es una función lineal
– Peor caso – cuerpo de bucle interno ejecutado para todos los elementos
previos
• ti = i T(n) es una función cuadrática
– Caso promedio
• ???
Análisis
• Simplificaciones
– Ignorar los costos de declaración reales y abstractos
– El orden de crecimiento es una medida interesante:
• El término de orden más alto es lo que cuenta
– Recuerde, estamos haciendo un análisis asintótico
– A medida que el tamaño de entrada crece, es el término de mayor orden el que
domina
Parte 3
• Q, O, W, o, w
• Definido en términos de funciones cuyo dominio es
el conjunto de números naturales.
– Ej: f(n) = Q(n2).
– Describes como crece f(n) en comparación a n2.
• Determina el conjunto de funciones, en la práctica,
se usa para comparar dos tamaños de función.
• Las notaciones difieren en la relación de tasa de
crecimiento que describen entre la función de
definición y el conjunto definido de funciones.
Notación Q
• Prueba
– Suponga que el tiempo de ejecución es an2 + bn + c
• Si alguno de a, b, y c son menores que 0 reemplace la constante con su valor
absoluto
an2 + bn + c (a + b + c)n2 + (a + b + c)n + (a + b + c)
3(a + b + c)n2 para n 1
Sea c’ = 3(a + b + c) y sea n0 = 1
• Pregunta
– InsertionSort es O(n3)?
– InsertionSort es O(n)?
O grande
i
n
n ai k k
n k
a
i cn k
n
Notación de límite inferior
• Teorema
– f(n) es Q(g(n)) si f(n) es ambos O(g(n)) y W(g(n))
Complejidad práctica
250
f(n) = n
f(n) = log(n)
f(n) = n log(n)
f(n) = n^2
f(n) = n^3
f(n) = 2^n
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Complejidad práctica
500
f(n) = n
f(n) = log(n)
f(n) = n log(n)
f(n) = n^2
f(n) = n^3
f(n) = 2^n
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Complejidad práctica
1000
f(n) = n
f(n) = log(n)
f(n) = n log(n)
f(n) = n^2
f(n) = n^3
f(n) = 2^n
0
1 3 5 7 9 11 13 15 17 19
Complejidad práctica
5000
4000
f(n) = n
f(n) = log(n)
3000
f(n) = n log(n)
f(n) = n^2
2000 f(n) = n^3
f(n) = 2^n
1000
0
1 3 5 7 9 11 13 15 17 19
Otras anotaciones asintóticas
• Suponga que
– S(k) es verdadero para constante fija k
• A menudo k = 0
– S(n) S(n+1) para todos los n >= k
• Entonces S(n) es verdad para todos los n >= k
Prueba por inducción