Análisis de Algoritmo

Download Report

Transcript Análisis de Algoritmo

Análisis de Algoritmo
Cecilia Laborde González
[email protected]
Objetivos
1. Profundizar en la aplicación de técnicas para el análisis de la eficiencia en
tiempo y espacio de un algoritmo.
2. Aplicar técnicas para el análisis de eficiencia de algoritmos recursivos.
3. Aplicar una técnica de diseño de algoritmos adecuada al problema a
resolver.
4. Establecer las bases teóricas que permitan comprender una tipificación de
problemas clásicos en las ciencias de la computación y la ingeniería
informática.
5. Conocer acerca de la existencia de problemas intratables e insolubles.
Contenidos
Unidad I EFICIENCIA DE ALGORITMOS (16)
1. Eficiencia de los algoritmos
2. Medidas de eficiencia
• Medidas de eficiencia de algoritmos.
• Medidas simplificadas de eficiencia
3. Costos de un algoritmo
4. Orden de magnitud
5. Análisis de “peor caso”, “caso medio” y “mejor caso”.
Contenidos
Unidad II COMPLEJIDAD COMPUTACIONAL (8)
1. Algoritmos y complejidad
2. Introducción a la NP-completitud
• Las clases P y NP
• Problemas NP-completos
• Problemas NP-difíciles
3. Problemas de decisión y optimización
Contenidos
Unidad III ANALISIS de ALGORITMO (20)
1. Tiempo de ejecución
2. Notación asintótica
• Notación “orden de”: notación O
• Órdenes de complejidad
• Operaciones sobre notación asintótica
3. Análisis de algoritmos
• Análisis de algoritmos no recursivos
• Análisis de algoritmos recursivos
• Algoritmos recursivos y ecuaciones de recurrencia
Contenidos
Unidad III ANALISIS de ALGORITMO (20)
4.
Ecuaciones de recurrencia
• Recurrencias homogéneas y no homogéneas
• Resolución de recurrencias
• Cambios de variable
• Teorema maestro de recurrencias del tipo divide y conquista
5.
Algoritmos de búsqueda
• Búsqueda secuencial
• Búsqueda por árboles binarios
6.
Algoritmos de ordenamiento
• Ordenamiento por mezcla
• Ordenamiento quicksort
Contenidos
Unidad IV TÉCNICAS CLÁSICAS DE CONSTRUCCIÓN DE ALGORITMOS(28)
1. Fundamentos para la construcción de algoritmos
2. Algoritmos voraces (Greedy)
3. Características generales de los algoritmos voraces
• El problema de la mochila
• El problema de cambio de mone
• Aplicaciones en grafos
4.
Divide y conquista
• Algunos esquemas basados en divide y conquista
• Multiplicación de enteros grandes
• Multiplicación de matrices (algoritmo de Strassen)
• Otras aplicaciones del esquema divide y conquista
Contenidos
Unidad IV TÉCNICAS CLÁSICAS E CONSTRUCCIÓN DE ALGORITMOS(28)
5.
Programación dinámica
• Características generales de la programación dinámica
• Ejemplos sencillos de programación dinámica
4.
Exploración de grafos
• Backtraking
• Branco and Bound
5.
Algoritmos heurísticos
• Heurística
• Algoritmos heurísticos
Evaluaciones
28 Septiembre, primera evaluación.
09 Noviembre, segunda evaluación
07 Diciembre, Tercera evaluación, entrega de trabajo
¿ QUE ES UN ALGORITMO?
Podríamos definirlo como un:
CONJUNTO ORDENADO Y FINITO DE INSTRUCCIONES QUE PERMITEN ENCONTRAR LA
SOLUCION DE UN DETERMINADO PROBLEMA
CARACTERISTICAS DE
UN ALGORITMO
Un algoritmo debe ser:
PRECISO
Es decir, cada
instrucción debe
indicar claramente lo
que se tiene que hacer.
FINITO
Es decir, debe tener un
número limitado de
pasos.
DEFINIDO
Es decir, debe producir
los mismos resultados
para las mismas
condiciones de
entrada.
¿COMO REPRESENTAMOS LOS
ALGORITMOS ?
Se pueden representar mediante DIAGRAMAS o TEXTO
LOS DIAGRAMAS
Representan GRAFICAMENTE las ACTIVIDADES
que conforman un PROCESO.
Los diagramas son la representación de la SOLUCIÓN
de un PROBLEMA.
inicio
Proceso1
Proceso2
Proceso3
fin
TEXTO
Los algoritmos se pueden representar mediante FRASES que
representan los PROCEDIMIENTOS que dan la SOLUCIÓN al
PROBLEMA.
EJEMPLO DE
DIAGRAMAS DE FLUJO
inicio
Proceso1
Proceso2
Proceso3
fin
Símbolos
• LINEAS DE FLUJO O FLECHAS
Muestran la dirección del flujo de datos o
secuencia de las instrucciones.
Start
End/Stop/Exit
• TERMINAL / ECLIPSE
Indican el comienzo o final de cada
módulo.
Símbolos
• RECTANGULO / PROCESO
Indica procesamiento como cálculos y abrir y cerrar
archivos.
• PARALELOGRAMO
Indica input y output de la memoria del
computador.
• IMPRESION DE DOCUMENTO
Representa la impresión de datos
(Normalmente de respuesta)
Símbolos
• DIAMANTE
Indica decisión. Tiene dos salidas
dependiendo si la decisión es
cierta o falsa.
• PROCESO DE UN
MODULO
Implica que se hará un proceso
externo o subtarea.
Símbolos
• POLIGONO / PREPARACION
Counter
A
B
S
Representa las condiciones de un
grupo de procesos que se repiten
automáticamente utilizando un
contador.
A es el valor inicial del contador Counter.
S es el incremento del contador.
B es el límite hasta donde debe llegar el contador.
Símbolos
• CONECTOR EN LA PAGINA
Se utiliza para conectar secciones del diagrama
de flujo en una misma página.
• CONECTOR FUERA DE LA PAGINA
Conector que une dos partes de diagrama que no
caben en una sola página.
• Ambos deben utilizarse lo menos posible.
REGLAS PARA DIBUJAR
DIAGRAMAS DE FLUJO
 Las instrucciones deben ser escritas dentro de los símbolos.
 Si tiene que hacer alguna anotación o comentario, hágalo al lado del símbolo.
 Un diagrama de flujo siempre comienza arriba en la página y fluye hacia abajo.
 Si necesita más de una página dibuje por columnas y utilice conectores.
 Utilice algún tipo de software para dibujar un DDF.
 Haga los símbolos lo suficientemente grandes como para que lo que escriba en
ellos sea fácil de leer.
EJEMPLO PRACTICO
Freir un Huevo
Descripción:
Este diagrama de flujo
describe detalladamente
como freir un huevo.
Inicio
1
Huevo, fósforo
cocina, paila, aceite
Abrir huevo
Encender Fósforo
Encender cocina
con fósforo
Vertir huevo
en la paila
Colocar paila
sobre cocina
Esperar a que
se fría
Agregar aceite
a la paila
1
fin
Áreas de estudio
 ¿Cómo construir algoritmos?
Técnicas de diseño
 ¿Cómo expresar algoritmos?
Enfoques de los lenguajes de programación
 ¿Cómo validar algoritmos?
Verificación formal
 ¿Cómo analizar algoritmos?
Complejidad computacional,
usabilidad, etc...
eficiencia,
legibilidad,
Análisis de algoritmos
Si se tuvieran 2 programas que hacen lo mismo, ¿cómo se podrían
comparar?
1. Eficiencia:
• Tiempo de ejecución
• Uso de espacios de memoria
2. Facilidad de lectura, mantenimiento, rapidez para
codificarlo.
Análisis de algoritmos
Ejemplo, tiempo
1. Aplicaciones informáticas que trabajan “en tiempo real”:
requieren que los cálculos se realicen en el menor tiempo
posible.
2. Aplicaciones que manejan un gran volumen de información: si
no se tratan adecuadamente pueden necesitar tiempos
impracticables.
Análisis de algoritmos
Una Leyenda
Mucho tiempo atrás, el visir Sissa Ben Dahir inventó el juego del ajedrez para el
rey Shirham de la India. El rey ofreció a Sissa la posibilidad de elegir su propia
recompensa. Sissa le dijo al rey que podía recompensarle en trigo, con una
cantidad equivalente a la cosecha de trigo en su reino de dos años, o bien con
una cantidad de trigo que se calcularía de la siguiente forma:
• un grano de trigo en la primera casilla de un tablero de ajedrez,
• más dos granos de trigo en la segunda casilla,
• más cuatro granos de trigo en la tercera casilla,
• y así sucesivamente, duplicando el número de granos en cada casilla, hasta
llegar a la última casilla.
El rey pensó que la primera posibilidad era demasiado cara mientras que la
segunda medida, además en simples granos de trigo, daba la impresión de
serle claramente favorable.
Análisis de algoritmos
Una Leyenda
Así que sin pensárselo dos veces pidió que trajeran un saco de trigo para hacer la
cuenta sobre el tablero de ajedrez y recompensar inmediatamente al visir.
El número de granos en la primera fila resultó ser:
20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 = 255
La cantidad de granos en las dos primeras filas es:
15
2
𝑖=0 2
= 216 − 1 = 65.535
Análisis de algoritmos
Una Leyenda
Al llegar a la tercera fila el rey empezó a pensar que su elección no había sido
acertada, pues para llenar las tres filas necesitaba:
23
𝑖
𝑖=0 2
= 224 - 1 = 16.777.216
granos, que pesan alrededor de 600 kilos . . .
En efecto, para rellenar las 64 casillas del tablero hacen falta :
63
𝑖
𝑖=0 2
= 264 - 1 = 18446744073709551615 ≈ 1,84 × 1019
Granos, una cantidad muy grande.
Análisis de algoritmos
Una Leyenda
 La función 2𝑛 − 1 representa el número de granos adeudados en función
del número n de casillas a rellenar. Toma valores desmesurados aunque el
número de casillas sea pequeño.
 El coste en tiempo de algunos algoritmos expresado en función del tamaño
de los datos de entrada es también exponencial. Por ello es importante
estudiar el coste de los algoritmos y ser capaces de comparar los costes de
algoritmos que resuelven un mismo problema.
Análisis de algoritmos
 La técnica que se utilizaba en los primeros años de la programación para
comparar la eficiencia de distintos algoritmos consistía en ejecutarlos para
datos diferentes y medir el tiempo consumido.
 Dado que las máquinas y los lenguajes eran dispares, y que el tiempo de
ejecución depende no solo del tamaño sino también del contenido de los
datos, resultaba muy difícil comparar tales resultados.
 El primer estudio serio sobre la eficiencia de los algoritmos se lo debemos a
Daniel Goldenberg del MIT. En 1952 realizó un análisis matemático del
número de comparaciones necesarias, en el mejor y en el peor caso, de
cinco algoritmos distintos de ordenación.
 La tesis doctoral de Howard B. Demuth de la Universidad de Stanford
estableció en 1956 las bases de lo que hoy llamamos análisis de la
complejidad de los algoritmos.
Análisis de algoritmos
 La técnica que se utilizaba en los primeros años de la programación para
comparar la eficiencia de distintos algoritmos consistía en ejecutarlos para
datos diferentes y medir el tiempo consumido.
 Dado que las máquinas y los lenguajes eran dispares, y que el tiempo de
ejecución depende no solo del tamaño sino también del contenido de los
datos, resultaba muy difícil comparar tales resultados.
 El primer estudio serio sobre la eficiencia de los algoritmos se lo debemos a
Daniel Goldenberg del MIT. En 1952 realizó un análisis matemático del
número de comparaciones necesarias, en el mejor y en el peor caso, de
cinco algoritmos distintos de ordenación.
 La tesis doctoral de Howard B. Demuth de la Universidad de Stanford
estableció en 1956 las bases de lo que hoy llamamos análisis de la
complejidad de los algoritmos.