Introduccin ALGORITMOS Estudia Diseo de algoritmos esquemas para
















- Slides: 16
Introducción: ALGORITMOS • Estudia: Diseño de algoritmos: esquemas para resolver problemas. Divide y vencerás, avance rápido, programación dinámica, Backtracking, Branch & Bound, y otros. Análisis de algoritmos: recursos necesarios para resolver el problema con el algoritmo elegido. Ocupación de memoria, tiempo de ejecución. De manera que se pueda decidir qué algoritmo es mejor para nuestro problema y entrada.
Introducción: ALGORITMO • Conjunto de reglas para resolver un problema. Debe ser: Definible. En seudocódigo, pero pueda dar lugar a un programa. De un conjunto de datos de entrada producir unos datos de salida, en un número finito de pasos (tiempo de ejecución finito). Además debemos diseñar algoritmos eficientes: que el tiempo para acabar sea “razonable”. Determinista si para la misma entrada produce siempre la misma salida. No determinista en caso contrario (redondeos, probabilistas, paralelos, …)
Introducción: PROGRAMACIÓN modelización Problema real Estructura de datos Modelo matemático Algoritmo en lenguaje natural algorítmica programación Tipo abstracto de datos Estructura de datos Programa en seudolenguaje Programa ejecutable
Estudio de algoritmos • Se trata de diseñar algoritmos eficientes: que usan pocos recursos: -memoria -tiempo -otros (memoria secundaria, tiempo de programación, …) • Para decidir: -qué algoritmo programar -qué algoritmo utilizar en resolver un problema para una cierta entrada -detectar fallo en programa que no funciona bien
Tiempo de ejecución • Se intenta obtener el tiempo de ejecución para un cierto tamaño de entrada, t(n) • Influyen factores externos al algoritmo: compilador, máquina, programador, …; por lo que normalmente se estudia la forma en que crece t(n), y se utilizan notaciones asintóticas: , O, , o • Se cuenta el número de operaciones, o las de un cierto tipo, o cada operación afectada de un coste diferente • Se estudian: Caso más favorable tm(n) Caso más desfavorable t. M(n) Tiempo promedio tp(n)
Ej: Cálculo del factorial fact(n): si n=1 devolver 1 en otro caso devolver (fact(n-1)*n) • tiempo: t(n)=t(n-1)+a=t(n-2)+2*a=. . . =t(1)+(n-1)*c • memoria: m(n)=m(n-1)+c=m(n-2)+2*c=. . . =m(1)+(n-1)*c
Ej: Torres de Hanoi(origen, destino, pivote, discos): si discos=1 moveruno(origen, destino) en otro caso Hanoi(origen, pivote, destino, discos-1) moveruno(origen, destino) Hanoi(pivote, destino, origen, discos-1)
Ej: Torres de Hanoi Número de movimientos: t(1)=1 t(n)=2 t(n-1)+1, si n>1 Expandiendo la recurrencia: t(n) = 2 t(n-1) +1 = 2 (2 t(n-2)+1) +1 = 22 t(n-2) +1+2 = 22 (2 t(n-3)+1) +1+2 = 23 t(n-3)+1+2+22 …. 2 n-1 t(1)+1+2+…+ 2 n-2 = 2 n-1
Tiempo promedio • tp(n) = S(n) t( ) * p( ) • Conteo de instrucciones afectadas por probabilidad: Ej: búsqueda secuencial con centinela i=0 a[n+1]=x repetir i=i+1 hasta a[i]=x tp(n)=2+2*p/n+4*p/n+. . . +2*n*p/n+(2*n+2)*(1 -p)= 2 n+4 -p(n+1)
Ej: Algoritmo de Euclides Calcular m. c. d(m, n), con m>n repetir r = resto(m/n) m=n n=r hasta r =0 mcd = m t(m, n) = a , si m múltiplo de n t(m, n) = b+t(n, resto(m/n)) , si m no es múltiplo de n
Algoritmos - Estructuras Grafo 1 2 4 3 Matriz de adyacencia 1 2 3 4 1 0 1 1 0 2 0 0 1 0 3 0 0 4 1 0 Listas de adyacencia 1 2 3 N 3 N 4 1 3 N Memoria n 2 n+a Inicialización n 2 n+a Grado salida n gs(nodo) Grado entrada n n+a
Comparación de algoritmos 1. 1 1. 2 1. 3 1. 4 1. 5 1. 6 1. 7 fin=false mientras no fin=true para i=1, 2, …n-1 si xi>xi+1 cambiar fin=false 2. 1 2. 2 2. 3 2. 4 para i=1, 2, …, n-1 para j=i+1, …, n si xi>xj cambiar
1. 1 1. 2 1. 3 1. 4 1. 5 1. 6 1. 7 fin=false mientras no fin=true para i=1, 2, …n-1 si xi>xi+1 cambiar fin=false Caso más favorable: • Entrada 1, 2, 3, 4: 1. 1 , 1. 2, 1. 3 , 1. 4 (i=1) , 1. 5 1. 4 (i=2) , 1. 5 1. 4 (i=3) , 1. 5 1. 4 (sale) 1. 2 (sale) Total 11 instrucciones • Entrada 1, 2, …, n: 1. 1 , 1. 2, 1. 3 , 1. 4 (i=1) , 1. 5 1. 4 (i=2) , 1. 5 … 1. 4 (i=n-1) , 1. 5 1. 4 (sale) 1. 2 (sale) Total 2 n+3 instrucciones
2. 1 2. 2 2. 3 2. 4 para i=1, 2, …, n-1 para j=i+1, …, n si xi>xj cambiar Caso más favorable: • Entrada 1, 2, 3, 4: 2. 1 (i=1), 2. 2 (j=2), 2. 3 2. 2 (j=3), 2. 3 2. 2 (j=4), 2. 3 2. 2 (sale) 2. 1 (i=2), 2. 2 (j=3), 2. 3 2. 2 (j=4), 2. 3 2. 2 (sale) 2. 1 (i=3), 2. 2 (j=4), 2. 3 2. 2 (sale) 2. 1 (sale) Total 19 instrucciones • Entrada 1, 2, …, n: 2. 1 (i=1), 2. 2 (j=2), 2. 3 … 2. 2 (j=n), 2. 3 2. 2 (sale) 2. 1 (i=2), 2. 2 (j=3), 2. 3 … 2. 2 (j=n), 2. 3 2. 2 (sale) … 2. 1 (i=n-1), 2. 2 (j=n), 2. 3 2. 2 (sale) 2. 1 (sale) Total n 2+n-1 instrucciones
1. 1 1. 2 1. 3 1. 4 1. 5 1. 6 1. 7 fin=false mientras no fin=true para i=1, 2, …n-1 si xi>xi+1 cambiar fin=false Caso más desfavorable: • Entrada 4, 3, 2, 1: 1. 1 , 1. 2 , 1. 3 , 1. 4 (i=1) , 1. 5 , 1. 6 (3421) , 1. 7 1. 4 (i=2) , 1. 5 , 1. 6 (3241) , 1. 7 1. 4 (i=3) , 1. 5 , 1. 6 (3214) , 1. 7 1. 4 (sale) 1. 2 , 1. 3 , 1. 4 (i=1) , 1. 5 , 1. 6 (2314) , 1. 7 1. 4 (i=2) , 1. 5 , 1. 6 (2134) , 1. 7 1. 4 (i=3) , 1. 5 1. 4 (sale) … ¿instrucciones?
2. 1 2. 2 2. 3 2. 4 para i=1, 2, …, n-1 para j=i+1, …, n si xi>xj cambiar Caso más desfavorable: • Entrada 4, 3, 2, 1: 2. 1 (i=1), 2. 2 (j=2), 2. 3 , 2. 4 (3421) 2. 2 (j=3), 2. 3 , 2. 4 (2431) 2. 2 (j=4), 2. 3 , 2. 4 (1432) 2. 2 (sale) 2. 1 (i=2), 2. 2 (j=3), 2. 3 , 2. 4 (1342) 2. 2 (j=4), 2. 3 , 2. 4 (1243) 2. 2 (sale) 2. 1 (i=3), 2. 2 (j=4), 2. 3 , 2. 4 (1234) 2. 2 (sale) 2. 1 (sale) ¿instrucciones?
















