Análisis de Algoritmos

Documentos relacionados
Análisis y Diseño de Algoritmos

La eficiencia de los programas

Esquema de Dividir y Vencer

Tema 01: Fundamentos del Análisis Asintótico de Algoritmos

Introducción al Análisis del Coste de Algoritmos

Tiempo de Ejecución. Midiendo el Tiempo de Ejecución

Análisis y Diseño de Algoritmos. Complejidad Computacional

Tema 3. Análisis de costes

Análisis de algoritmos.

Introducción al análisis de algoritmos

1. Introducción al análisis de algoritmos

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani

Análisis de la Complejidad de Algoritmos

Notación Asintótica. Programación Avanzada

NOTACIÓN O GRANDE. El análisis de algoritmos estima el consumo de recursos de un algoritmo.

Diseño y Análisis de Algoritmos

Análisis y Diseño de Algoritmos

Introducción y Comportamiento Asintótico

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Capítulo 1 LA COMPLEJIDAD DE LOS ALGORITMOS

Tema 9. Recursividad

Algoritmos: Análisis de Algoritmos

Estructura de Datos. Complejidad de Algoritmos. Algoritmo. Algoritmo. Mauricio Solar Lorna Figueroa

Complejidad de algoritmos recursivos

DEPARTAMENTO DE MATEMATICAS Y FISICA Matemáticas Discreta

Complejidad de los Algoritmos

Algoritmos Secuenciales y Recursivos

UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y

Ordenamiento (Sorting)

Notación Asintótica 2

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande

BORRADOR. Sucesiones y series numéricas Sucesiones. es un conjunto ordenado de números

Multiplicación de matrices simétricas

IN34A - Optimización

EJERCICIO COMPUTACIONAL N o 4. MÉTODOS ITERATIVOS

Muchas de las ecuaciones de recurrencia que vamos a usar en este curso tienen la siguiente forma: ( c n =0 T (n) = a T (b n b.

Complejidad computacional (Análisis de Algoritmos)

OPTIMIZACIÓN VECTORIAL

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

ESTIMACIÓN DE TIEMPO Y COSTO DE PRODUCTOS SOFTWARE

Análisis de algoritmos

TEMARIOS EXAMEN DE ADMISIÓN 2017 EDUCACIÓN BÁSICA Y MEDIA: MATEMÁTICA. Contenido

Estructuras de Datos y Algoritmos

Algoritmos de Ordenación

Apuntes sobre el cálculo de la eficiencia de los algoritmos. Dept. Llenguatges i Sistemes Informàtics

Práctica 2 - Ejercicio 2.8

Tema 06: Recursividad

Formulación del problema de la ruta más corta en programación lineal

Sucesiones y series numéricas

Algebra lineal y conjuntos convexos

Métodos de Ordenamiento. Unidad VI: Estructura de datos

CAPÍTULO 6 PROGRAMACIÓN DINÁMICA. Programación Dinámica

TEMARIOS EXAMEN DE ADMISIÓN 2016 EDUCACIÓN BÁSICA Y MEDIA: MATEMÁTICA

Resolución de Ecuaciones no lineales. Juan Manuel Rodríguez Prieto

Generación de variables aleatorias discretas Método de la Transformada Inversa

COMPLEJIDAD Y EFICIENCIA DE ALGORITMOS

Recursividad Definición

4.6. Interpolación mediante splines (polinomios a trozos) Figura 4.1: Datos de interpolación

METODO DE LA BISECCIÓN Si f : a, b es continua con f a f b 0,el procedimiento de la

TEMARIOS EXAMEN DE ADMISIÓN 2018 ASIGNATURA MATEMÁTICA. Emplear los números para: Identificar Contar Clasificar Sumar y restar Resolución de problemas

Propiedades de números enteros (lista de problemas para examen)

Estructuras de Datos y Algoritmos

7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.

Figura 1: Esquema de las tablas simplex de inicio y general.

Algoritmos y Complejidad

Práctica IV: Métodos de Newton-Raphson y de la secante, para encontrar las raíces de una función.

Dada f : [a, b] R R, continua, se plantea el problema de encontrar ceros de f, es decir raíces de la ecuación

Derivadas de orden superior

ALGORITMICA III Capitulo I ANALISIS DE ALGORITMOS

MANUAL DE PRÁCTICAS DEL TALLER DE PROGRAMACIÒN PRACTICA NO.6

Métodos de gradiente. Métodos de Krylov

ESTRUCTURAS DE CONTROL

Programación (PRG) PRÁCTICA 10. Algoritmos de búsqueda

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Programación Dinámica

Preliminares Interpolación INTERPOLACIÓN Y APROXIMACIÓN POLINOMIAL

2. Obtener, por ensayo y error, una aproximación del entero más grande. Sugerencia: leer n y escribir n y n+1. (Puede ser muy largo el ensayo).

C a l ses P P y y NP C a l se P C a l se N P N P [No N n o -De D te t rmin i i n s i ti t c i Polynomial-tim i e]

1 Método de la bisección. 1.1 Teorema de Bolzano Teorema 1.1 (Bolzano) Contenido

(2) X(3I + A) = B 2I (3) X(3I + A)(3I + A) 1 = (B 2I)(3I + A) 1 (5) X = (B 2I)(3I + A) 1

Complejidad de Algoritmos

Algorítmica y Lenguajes de Programación. Ordenación (ii) En la lección anterior se vieron dos métodos de ordenación:

Algoritmos glotones. mat-151

Introducción a la Programación Dinámica. El Problema de la Mochila

Algoritmos y Estructuras de Datos

Tema: Programación Dinámica.

84 Tema 3. Dualidad. todas las restricciones son del tipo, todas las variables son no negativas.

Transcripción:

Análisis de Algoritmos Amalia Duch Barcelona, marzo de 2007 Índice 1. Costes en tiempo y en espacio 1 2. Coste en los casos mejor, promedio y peor 3 3. Notación asintótica 4 4. Coste de los algoritmos iterativos 6 5. Coste de los algoritmos recursivos, teoremas maestros 6 1. Costes en tiempo y en espacio La característica básica que debe tener un algoritmo es que sea correcto, es decir, que produzca el resultado deseado en tiempo finito. Adicionalmente puede interesarnos que sea claro, que esté bien estructurado, que sea fácil de usar, que sea fácil de implementar y que sea eficiente. Entendemos por eficiencia de un algoritmo la cantidad de recursos de cómputo que requiere; es decir, cuál es su tiempo de ejecución y qué cantidad de memoria utiliza. A la cantidad de tiempo que requiere la ejecución de un cierto algoritmo se le suele llamar coste en tiempo mientras que a la cantidad de memoria que requiere se le suele llamar coste en espacio. Es evidente que conviene buscar algoritmos correctos que mantengan tan bajo como sea posible el consumo de recursos que hacen del sistema, es decir, que sean lo más eficientes posible. Cabe hacer notar que el concepto de eficiencia de un algoritmo es un concepto relativo, esto quiere decir que ante dos algoritmos correctos que resuelven el mismo problema, uno es más eficiente que otro si consume menos recursos. Por tanto, podemos observar que el concepto de eficiencia y en consecuencia el concepto de coste nos permitirá comparar distintos algoritmos entre ellos. Si consideramos los algoritmos elementales de ordenación por selección y por inserción cómo podríamos elegir cuál de ellos utilizar en una aplicación dada? 1

Veremos más adelante que para efectos prácticos ambos algoritmos son similares y que son eficientes sólo para ordenar secuencias con un número pequeño de elementos. Sin embargo hay varias comparaciones que se pueden hacer entre ellos. Tamaño del vector Num. Comparaciones Num. Intercambios Selección n n(n 1)/2 0 (min.) n 1 (max.) n 1 (min.) 0 (min.) Inserción n prop. n 2 /4 (prom.) prop. n 2 /4 (prom.) prop. n 2 /2 (max.) prop. n 2 /2 De la tabla anterior podemos inferir que para ordenar secuencias cuyos elementos sean difíciles de comparar (las comparaciones son caras) es más conveniente utilizar el método de ordenación por inserción, y que este método es más eficiente mientras más ordenada esté la secuencia de entrada. Si por el contrario queremos ordenar secuencias de elementos que son fáciles de comparar (o que tienen claves asociadas fáciles de comparar) y en cambio los intercambios son caros sería más conveniente utilizar el algoritmo de ordenación por selección. En general, cómo podemos elegir entre un algoritmo y otro si ambos resuelven el mismo problema? Una posibilidad es hacerlo mediante pruebas empíricas. En este caso habría que traducir ambos algoritmos a un lenguaje de programación, realizar medidas del tiempo de ejecución de los programas cuando se aplican a un conjunto de muestras de entrada y a partir de estas medidas intentar inferir el rendimiento de los programas. Pero este método tiene varios inconvenientes ya que los resultados dependen: del subconjunto de pruebas escogidas del ordenador en el que se realicen las pruebas del lenguaje de programación utilizado o del compilador, entre otros factores. Además, no siempre es fácil implementar un algoritmo (algunos pueden ser muy largos o complicados), por tanto, en muchas ocasiones puede ser muy útil poder predecir cómo va a comportarse un algoritmo sin tenerlo que implementar. Para ello es conveniente analizar un algoritmo matemáticamente. Ejemplo. Análisis de la función pos min, que encuentra la posición del elemento mínimo en un vector de enteros. El coste en tiempo de un algoritmo depende del tipo de operaciones que realiza y del coste especiífico de estas operaciones. Este coste suele calcularse 2

únicamente en función del tamaño de las entradas para que sea independiente del tipo de máquina, lenguaje de programación, compilador, etc. en que se implementa el algoritmo. Definición 1.1 Dado un algoritmo A cuyo conjunto de entradas es A, su eficiencia o coste (en tiempo, en espacio, en número de operaciones de entrada/salida, etc.) es una función T tal que: T : A R + α T (α) 2. Coste en los casos mejor, promedio y peor Utilizando la definición anterior caracterizar a la función T puede ser complicado. Por ello se definen tres funciones que dependen exclusivamente del tamaño de las entradas y describen resumidamente las características de la función T. Definición 2.1 Sea A n el conjunto de las entradas de tamaño n y T n : A n R la función T restringida a A n. Los costes en caso mejor, promedio y peor se definen como sigue: Coste en caso mejor : T mejor (n) = mín{t n (α) α A n } Coste en caso promedio : T prom (n) = α A n P r(α).t n (α), donde P r(α) es la probabilidad de ocurrencia de la entrada α. Coste en caso peor : T peor (n) = máx{t n (α) α A n } Por lo general en este curso estudiaremos el coste en caso peor de los algoritmos por dos razones: 1. Proporciona garantías sobre el coste del algoritmo ya que en ningún caso excederá el coste en caso peor. 2. Es más fácil de calcular que el coste en el caso promedio. Una característica esencial del coste de un algoritmo en cualquiera de los casos descritos anteriormente es su tasa de crecimiento o dicho de otra manera su orden de magnitud. La tasa de crecimiento de una función marca una diferencia importante con las funciones que tengan un tasa de crecimiento distinta. Ejemplos. Tablas y curvas de diversas funciones que aparecen frecuentemente en el análisis de algoritmos. A partir de los ejemplos anteriores puede observarse la conveniencia de omitir los factores constantes, ya que son poco relevantes para comparar tasas de crecimiento (una función cuadrática superará a una lineal más tarde o más temprano). Por este motivo se introduce la notación asintótica. 3

3. Notación asintótica En este curso veremos tres clases diferentes de funciones que son: O, Ω y Θ. Definición 3.1 Dada una función f : N R + la clase O (f) (que se lee o grande de f) se define por: O (f) = {g : N R + c R +, n 0 N : n n 0, g(n) cf(n)} Intuitivamente, la definición anterior refleja el hecho de que el crecimiento asintótico de las funciones g es como mucho proporcional al de la función f. Informalmente puede decirse que la tasa de crecimiento de la función f es una cota superior para las tasas de crecimiento de las funciones g. Ejemplos y ejercicios. Abuso de notación. Aunque O (f) es una clase de funciones por tradición se escribe g = O (f) en vez de g O (f). Cabe observar que escribir O (f) = g no tiene sentido. Propiedades básicas de la notación O g(n) 1. Si lím n f(n) < entonces g = O (f). 2. f : N R +, f = O (f) (reflexividad). 3. Si f = O (g) y g = O (h) entonces f = O (h) (transitividad). 4. c > 0, O (f) = O (cf). La úlltima propiedad justifica la preferencia por omitir factores constantes. En el caso de la función log se omite la base porque log c (x) = log b (x) log b (c). Definición 3.2 Dada una función f : N R + la clase Ω(f) (que se lee omega de f) se define por: Ω(f) = {g : N R + c R +, n 0 N : n n 0, g(n) cf(n)} Intuitivamente, la definición anterior refleja el hecho de que el crecimiento asintótico de las funciones g es más rápido que el de la función f. Informalmente la tasa de crecimiento de la función f puede verse en este caso como una cota inferior para las tasas de crecimiento de las funciones g. Ejemplos y ejercicios. 4

Propiedades básicas de la notación Ω g(n) 1. Si lím n f(n) > 0 entonces g = Ω(f). 2. f : N R +, f = Ω(f) (reflexividad). 3. Si f = Ω(g) y g = Ω(h) entonces f = Ω(h) (transitividad). 4. Si f = O (g) entonces g = Ω(f) y viceversa. Definición 3.3 Dada una función f : N R + la clase Θ(f) = O (f) Ω(f) (esta clase se lee zita de f). Intuitivamente, la definición anterior refleja el hecho de que el crecimiento asintótico de las funciones g es similar al de la función f. Ejemplos y ejercicios. Propiedades básicas de la notación Θ 1. f : N R +, f = Θ(f) (reflexividad). 2. Si f = Θ(g) y g = Θ(h) entonces f = Θ(h) (transitividad). 3. f = Θ(g) g = Θ(f) (simetría). g(n) 4. Si lim n f(n) = c, 0 < c <, entonces g = Θ(f). Otras propiedades de las notaciones asintóticas 1. Para cualesquiera constantes positivas α < β, si f es una función creciente entonces O (f α ) O (f β ). 2. Para cualesquiera constantes a y b mayores que cero, si f es una función creciente entonces O (log f a ) O (f b ). 3. Para cualquier constante c > 0, si f es una función creciente, O (f) O (c f ). Reglas útiles Regla de las sumas: Regla del producto:: Θ(f) + Θ(g) = Θ(f + g) = Θ(máx{f, g}). Θ(f)Θ(g) = Θ(f g). 5

4. Coste de los algoritmos iterativos Las siguientes reglas facilitan el cálculo o el análisis del coste de los algoritmos iterativos en el caso peor. 1. El coste de una operación elemental es Θ(1). 2. Si el coste de un fragmento F 1 es f 1 y el de un fragmento F 2 es f 2 entonces el coste en caso peor del fragmento: F 1 ; F 2 es: f 1 + f 2 3. Si el coste de F 1 es f 1 y el de F 2 es f 2 y el de evaluar B es g entonces el coste en caso peor del fragmento: if(b) F 1 ; else F 2 es: g + máx{f 1, f 2 } 4. Si el coste de F durante la i-ésima iteración es f i y el coste de evaluar B es g i y el número de iteraciones es h, entonces el coste en le caso peor del fragmento: es: while (B) F ; h(n) T (n) = f i (n) + g i (n) i=0 Si f = máx{f i + g i } entonces T = O (hf). 5. Coste de los algoritmos recursivos, teoremas maestros El coste T (n) (en caso peor, medio o mejor) de un algoritmo recursivo, satisface una ecuación recurrente. Esto quiere decir que T (n) dependerá del valor de T para valores más pequeños de n. Con frecuencia la recurrencia adopta una de las formas siguientes: 1. T (n) = at (n c) + g(n), con a y c constantes tales que a > 0 y c > 1. 6

2. T (n) = at (n/b) + g(n), con a y b constantes tales que a > 0 y b > 1. La primera recurrencia (llamada recurrencia sustractora) corresponde a algoritmos que tienen una parte no recursiva con coste g(n) y hacen a llamadas recursivas con problemas de tamaño n c. La segunda (llamada recurrencia divisora) corresponde a algoritmos que tienen una parte no recursiva con coste g(n) y hacen a llamadas recursivas con subproblemas de tamaño aproximado n/b. Los siguientes teoremas (llamados teoremas maestros) proporcionan un mecanismo para calcular el coste de algoritmos recursivos que se expresen mediante recurrencias sustractoras o divisoras respectivamente. Teorema 5.1 Sea T (n) el coste (en el caso peor, medio o mejor) de un algoritmo recursivo que satisface la recurrencia: { f(n) si 0 n < n0 T (n) = at (n c) + g(n) si n n 0 donde n 0 es un número natural, c 1 es una constante, f(n) es una función arbitraria y g(n) = Θ(n k ) para una constante k 0, entonces: Θ(n k ) si a < 1 T (n) = Θ(n k+1 ) si a = 1 Θ(a n/c ) si a > 1 Teorema 5.2 Sea T (n) el coste (en el caso peor, medio o mejor) de un algoritmo recursivo que satisface la recurrencia: { f(n) si 0 n < n0 T (n) = at (n/b) + g(n) si n n 0 donde n 0 es un número natural, b > 1 es una constante, f(n) es una función arbitraria y g(n) = Θ(n k ) para una constante k 0. Sea α = log b (a). Entonces: Θ(n k ) si α < k T (n) = Θ(n k log n) si α = k Θ(n α ) si α > k 7