Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (i)

Documentos relacionados
La eficiencia de los programas

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

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

Análisis y Diseño de Algoritmos

Análisis de Algoritmos

Complejidad de los Algoritmos

Notación Asintótica 2

Estructuras de Datos y Algoritmos

Análisis de la Complejidad de Algoritmos

Estructuras de Datos y Algoritmos

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

AMPLIACIÓN DE MATEMÁTICAS. a = qm + r

Una matriz es un arreglo rectangular de números. Los números en el arreglo se llaman elementos de la matriz. ) ( + ( ) ( )

Tema 3. Análisis de costes

COMPLEJIDAD Y EFICIENCIA DE ALGORITMOS

Contenido. 2 Operatoria con matrices. 3 Determinantes. 4 Matrices elementales. 1 Definición y tipos de matrices

Clase 8 Matrices Álgebra Lineal

Estructuras de control

Introducción al análisis de algoritmos

Complejidad de Algoritmos

Matrices. Observación: Es usual designar una matriz por letras mayúsculas: A, B, C,... 3 B =

Una forma fácil de recordar esta suma (regla de Sarrus): Primero vamos a estudiar algunas propiedades de los determinantes.

Conjuntos y matrices. Sistemas de ecuaciones lineales

Programación dinámica: un último ejemplo

UNIDAD 1: ESTUDIEMOS SUCECIONES ARITMETICAS Y GEOMETRICAS.

Matrices y operaciones con Matrices.

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

Definición: Dos matrices A y B son iguales si tienen el mismo orden y coinciden los elementos que ocupan el mismo lugar.

ESTIMACIÓN DE TIEMPO Y COSTO DE PRODUCTOS SOFTWARE

TEMA 4: ALGORITMOS Y PROGRAMAS

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

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

Algebra lineal y conjuntos convexos

TEMA 2: ALGORITMOS Y PROGRAMAS

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Bases Matemáticas para la Educación Primaria. Guía de Estudio. Tema 3: Números racionales. Parte I: Fracciones y razones Números racionales

Matrices, Determinantes y Sistemas Lineales.

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

Estructuras de Control

LOS NÚMEROS RACIONALES

Método de eliminación de Gauss Utilidad del método. Transformaciones elementales. Teorema Rouché-Frobenius

PAIEP. Sistemas de Ecuaciones Lineales

Multiplicación de matrices simétricas

Matrices y Sistemas Lineales

Lección 2: Funciones vectoriales: límite y. continuidad. Diferenciabilidad de campos

Problemas y Ejercicios Resueltos. Tema 4: Sistemas de ecuaciones lineales.

Calendario Lenguaje Matemática Inglés Hist. Cs.Soc Cs.Nat (1º -8º Básico) 17 de Junio 23 de Junio 28 de Junio 30 de Junio 4 de Julio

1. Números naturales y sistema de numeración decimal

Análisis de algoritmos.

lim lim lim LÍMITES DE FUNCIONES

Degeneración y ciclaje. Método de las dos fases CO-3411 (S08) 30/03/

Análisis y Diseño de Algoritmos

TEMA Nº 1. Conjuntos numéricos

Matrices y Sistemas Lineales

ALGORITMOS DE ORDENAMIENTO COUNTING SORT CHRISTIAN ESTEBAN ALDANA ROZO BRAYAN STIF FORERO CRUZ GIOVANNY GUZMÁN CÉSPEDES JORGE MEJIA

Análisis de algoritmos

INSTITUTO TECNICO MARIA INMACULA ASIGNATURA: MATEMATICAS GRADO: 11 AÑO 2013

Definición 1 Un semigrupo es un conjunto E provisto de una operación binaria asociativa sobre E, se denota por (E, ).

3- Sistemas de Ecuaciones Lineales

Números. Índice del libro. 1. Los números reales. 2. Operaciones con números enteros y racionales. 3. Números decimales

UNIDAD 1: NÚMEROS RACIONALES OBJETIVOS

RESUMEN DEL TEMA 7 VALORES Y VECTORES PROPIOS

Capítulo 13 INSTRUCCIONES DE CONTROL REPETITIVAS. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Se desea estudiar el comportamiento de una función a medida independiente x se aproxima a un valor específico.

ÍNDICE INTRODUCCIÓN...13

Chapter Audio Summary for McDougal Littell Pre-Algebra

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

MATEMÁTICAS APLICADAS A LAS C.C. SOCIALES

TEMA 2. Números racionales. Teoría. Matemáticas

(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

Matrices y sus operaciones

Algoritmo de factorización LU

1. Matrices. Operaciones con matrices

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

" Sabías que se puede nadar 0,83 Km en un minuto?" le pregunta Víctor a Carlos.

Complejidad computacional (Análisis de Algoritmos)

Análisis y Diseño de Algoritmos Tablas de Hash

Tema 2. Divide y vencerás.

Tutorías con Grupos Reducidos (TGR) Parte 1: Evaluación de prestaciones

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

TEMA 1. MATRICES, DETERMINANTES Y APLICACIÓN DE LOS DETERMINANTES. CONCEPTO DE MATRIZ. LA MATRIZ COMO EXPRESIÓN DE TABLAS Y GRAFOS.

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

DETERMINANTES MATRICES EQUIVALENTES POR FILAS RANGO DE UNA MATRIZ. APLICACIONES

UNIDAD II. INTEGRAL DEFINIDA Y LOS MÉTODOS DE INTEGRACIÓN. Tema: LA INTEGRAL DEFINIDA

Matemáticas Discretas TC1003

OBJETIVOS CONTENIDOS PROCEDIMIENTOS

TEMA 5 LÍMITE DE FUNCIONES. CONTINUIDAD

como les va con las practicas?

Análisis y Diseño de Algoritmos

6.1.- Introducción a las estructuras de datos Tipos de datos Arrays unidimensionales: los vectores Operaciones con vectores.

Método de diferencias finitas para ecuaciones diferenciales parciales elípticas. (Parte II)

COLEGIO NUESTRA SEÑORA DEL CARMEN HATILLO, PUERTO RICO

Tema 3. Estructuras de Datos

INFORMÁTICA MATLAB GUÍA 3 Operaciones con Matrices

ERRORES DE REDONDEO Y ARITMÉTICA DE PRECISIÓN FINITA

Lección 5. Punto flotante

CONJUNTOS NUMÉRICOS. La noción de número es tan antigua como el hombre mismo ya que son necesarios para resolver situaciones de la vida diaria.

Introducción al Análisis Sintáctico

UNIDAD 7: MATRICES Y DETERMINANTES

Transcripción:

Algorítmica y Lenguajes de Programación Eficiencia y notación asintótica (i) Eficiencia y notación asintótica. Introducción Para resolver un problema pueden existir varios algoritmos. Por tanto, es lógico elegir el mejor. Si el problema es sencillo o no hay que resolver muchos casos se podría elegir el más fácil. Si el problema es complejo o existen muchos casos habría que elegir el algoritmo que menos recursos utilice. Los recursos más importantes son el tiempo de ejecución y el espacio de almacenamiento. Generalmente, el más importante es el tiempo. Al hablar de la eficiencia de un algoritmo nos referiremos a lo rápido que se ejecuta. La eficiencia de un algoritmo dependerá, en general, del tamaño de los datos de entrada. 2 1

Eficiencia y notación asintótica. Ejemplares y problemas A la hora de estudiar la eficiencia de distintos algoritmos es necesario distinguir problemas de ejemplares. Un problema sería una proposición dirigida a averiguar el modo de obtener un resultado cuando ciertos datos son conocidos. Un ejemplar, en cambio, es un individuo de una especie o género. Ejemplos de problemas serían: multiplicar dos números enteros o resolver una ecuación de segundo grado. Ejemplares de dichos problemas serían: (425,7) o (1,1,2). Es decir: 425 7 y x 2 x2. Un problema dado puede tener un número infinito de ejemplares (multiplicar dos números enteros) o finito (jugar una partida de ajedrez). Un algoritmo que afirma resolver un problema debe resolver todos los ejemplares del mismo. Si hay un solo ejemplar que no sea resuelto por el algoritmo el algoritmo no es correcto. 3 Eficiencia y notación asintótica. Casos mejor, peor y medio No todos los ejemplares de un problema son iguales. En el caso de la multiplicación de dos números enteros no es lo mismo multip (a y b 0) que a 0. Al no ser todos los ejemplares iguales, la eficiencia del algoritmo puede variar en función del ejemplar o del grupo de ejemplares. A la hora de analizar un algoritmo es necesario saber que pueden darse tres tipos de ejemplares o casos: Caso mejor: se trata de aquellos ejemplares del problema en los que el algoritmo es más eficiente; por ejemplo: multiplicar un número por cero, insertar en una lista vacía, ordenar un vector que ya está ordenado, etc. Generalmente no nos interesa. Caso peor: se trata de aquellos ejemplares del problema en los que el algoritmo es menos eficiente (no siempre existe el caso peor). Ejemplos: insertar al final de una lista, ordenar un vector que está ordenado en orden inverso, etc. Nos interesa mucho. Caso medio: se trata del resto de ejemplares del problema. Por ejemplo: multiplicar dos números enteros distintos de cero, insertar en a de una lista que no sea el principio ni el final, ordenar un vector que no está ordenado ni en orden directo ni inverso, etc. Es el caso que más nos debería preocupar puesto que será el más habitual, sin embargo no siempre se puede calcular (habría que saber cuáles son las probabilidades de los distintos ejemplares). 4 2

Eficiencia y notación asintótica. Operaciones elementales Una operación elemental es aquella cuyo tiempo de ejecución tiene una cota superior constante que sólo depende de su implementación (por ejemplo: el ordenador o el lenguaje de programación utilizado). Las operaciones elementales son consideradas de coste unitario. A la hora de analizar un algoritmo importarán, por tanto, el número de operaciones elementales que precisa. La decisión de determinar que una operación determinada es de coste unitario dependerá de los ejemplares del problema que la utilice. Por ejemplo, en la mayor parte de los casos la suma se considera de coste unitario puesto que al operar con los números que se manejan habitualmente en un ordenador los tiempos que emplea la suma son similares; sin embargo, en caso de manejar números muy grandes la suma no tendrá un coste unitario puesto que tardará más cuanto más grandes sean los números a sumar. 5 Eficiencia y notación asintótica. Tamaño de los ejemplares El tamaño de un ejemplar sería el número de bits necesarios para representarlo en el ordenador. Sin embargo, no es necesario llegar a ese nivel de detalle; basta con determinar algún parámetro que nos permita dirimir entre dos ejemplares cuál es el mayor. Por ejemplo: Si tenemos un algoritmo que trabaja con vectores parece obvio que cuantas más componentes tiene un vector mayor será; así pues, en este caso el tamaño será el número de componentes. Si escribimos un algoritmo que permite sumar números de cualquier número de cifras el tamaño de los números dependerá del número de cifras que contengan. Un algoritmo para multiplicar matrices considerará como tamaño al producto del número de filas por el número de columnas. En resumen, para cada problema es necesario analizar la naturaleza de los datos para determinar qué parámetro define el tamaño de los ejemplares. La eficiencia de los algoritmos siempre vendrá dada en función de dichos tamaños: Algoritmos con vectores en función del número de componentes. Algoritmos con matrices en función del número de filas y columnas. Etc. 6 3

Eficiencia y notación asintótica. Midiendo la eficiencia (i) Tenemos que nos interesa saber qué algoritmo utiliza más eficientemente los recursos, en general, el tiempo de ejecución. Esta eficiencia en tiempo depende del tamaño de los datos de entrada que vendrá dado por algún parámetro que define dichos datos (número de componentes, filas y columnas, etc.) La eficiencia además de depender del tamaño de los ejemplares depende de la naturaleza de los mismos: caso mejor, caso peor y caso medio. Para calcular la eficiencia es posible considerar sólo el número de veces que se debe ejecutar una operación elemental pues éstas tendrán un coste unitario. En qué unidad mediremos esta eficiencia? Podríamos pensar en utilizar segundos, sin embargo, el tiempo de ejecución depende del ordenador utilizado... 7 Eficiencia y notación asintótica. Midiendo la eficiencia (ii) La solución está en el principio de invarianza, dicho principio afirma que dos implementaciones distintas del mismo algoritmo no diferirán en su eficiencia más que en una constante multiplicativa. Por ejemplo, si un algoritmo escrito en FORTRAN se compila en un Pentium III 1MHz y en un 486 tendríamos dos implementaciones distintas del mismo algoritmo siendo más eficiente la primera. Si al ejecutar este algoritmo en el Pentium III para un problema dado tarda 3 segundos y en el 486 para el mismo problema tarda 30 segundos, el principio de invarianza nos dice que un problema que en el Pentium III requiera 1 minuto necesitaría en el 486 aproximadamente 10. De esta forma, no habrá unidad para medir la eficiencia, nos limitaremos a decir que el tiempo de ejecución de un algoritmo será t(n), es decir, una función del tamaño de los ejemplares; en unas máquinas el tiempo de ejecución será a t(n) y en otras será b t(n). 8 4

Eficiencia y notación asintótica. Notación O(n) O grande de n (i) Sabemos que podemos definir la eficiencia de un algoritmo como una función t(n). A la hora de analizar un algoritmo nos interesa, principalmente, la forma en que se comporta el algoritmo al aumentar el tamaño de los datos; es decir, cómo aumenta su tiempo de ejecución. Esto se conoce como eficiencia asintótica de un algoritmo y nos permitirá comparar distintos algoritmos puesto que deberíamos elegir aquellos que se comportarán mejor al crecer los datos. La notación asintótica se describe por medio de una función cuyo dominio es el conjunto de números naturales, N. Se describe la notación O o límite asintótico superior como: O( n)) = { f ( n)/ c > 0, n0 > 0,0 f ( n) c n) n n0} f ( n) : Z n) : Z R R 9 Eficiencia y notación asintótica. Notación O(n) O grande de n (ii) O n)) = { f ( n)/ c > 0, n f ( n) : Z n) : Z R R > 0,0 f ( n) c n) n n } ( 0 0 La notación anterior básicamente nos dice que si tenemos un algoritmo cuyo tiempo de ejecución es f(n) podemos encontrar otra función de n, n), y un tamaño de problema n 0 de tal forma que n) acota superiormente al tiempo de ejecución para todos los problemas de tamaño superior a n 0. Esta notación, como veremos a continuación, facilitará en las comparaciones de eficiencia entre algoritmos diferentes. 10 5

Eficiencia y notación asintótica. Notación O(n) O grande de n (iii) Tiempo de ejecución Comparación de eficiencias asintóticas Tamaño del problema O(n) O(n 2 ) O(a n ) lon) n! En la gráfica se puede ver distintos órdenes de complejidad típicos. O(lon)) crece de manera imperceptible mientras que O(n!), O(a n ) y O(n a ) crecen muy rápidamente. La mayor parte de algoritmos son O(n a ), los algoritmos más eficientes son O(lon)); es muy difícil lograr algoritmos O(1) tiempo constante-. 11 Eficiencia y notación asintótica. Notación O(n) O grande de n (iv) El orden de complejidad se define como una función que domina la ecuación que expresa en forma exacta el tiempo de ejecución del algoritmo. x) domina a f(x), si dada una constante C cualquiera, C x) f ( x) x x) domina asintóticamente a f(x), si x) domina a f(x) para valores muy grandes de x. Por ejemplo, si f(n)=n 2 5n 100 y n)= n 2 entonces n) domina a f(n). 12 6

Eficiencia y notación asintótica. Notación O(n) O grande de n (v) En próximas lecciones se verá la forma de calcular complejidades de algoritmos. Sin embargo, podemos adelantar algunas reglas: O(C g) = O(g), C es una constante. O(f g) = O(f) O(g), y viceversa. O(f / g) = O(f) / O(g), y viceversa. O(fg) = función dominante entre O(f) y O(g) n log 2 n domina a log 2 n b n domina a c n si b>=c n k domina a n m si k>=m log a n domina a log b n si b>=a>=1 n! domina a b n b n domina a n a si a>=0 n domina a log a n si a>=1 log a n domina a 1 si a>=1 13 Eficiencia y notación asintótica. Notación O(n) O grande de n (vi) Paso 1 Por ejemplo, el orden de complejidad del algoritmo siguiente... para i de 1 a n para j de 1 a n escribir ij Se calcularía como se muestra a la derecha llegándose a la conclusión de que su complejidad es O(n 2 ). Esto quiere decir, por ejemplo, que si el tamaño de los datos aumenta en un orden de magnitud (se multiplica por 10), el tiempo de ejecución aumentaría (en realidad estaría acotado superiormente) en dos órdenes de magnitud (se multiplicaría por 100). para i de 1 a n para j de 1 a n escribir ij O(1) Paso 2 para i de 1 a n para j de 1 a n escribir ij O(n 1) = O(n) Paso 3 para i de 1 a n para j de 1 a n escribir ij O(n n) = O(n 2 ) La complejidad de esta sentencia es constante La complejidad del bucle es el producto del número de ejecuciones por la complejidad de la/s sentencia/s ejecutada/s. La complejidad del bucle es el producto del número de ejecuciones por la complejidad de la/s sentencia/s ejecutada/s. 14 7

Eficiencia y notación asintótica. Resumen (i) Para resolver un problema pueden existir varios algoritmos. Por tanto, es lógico elegir aquel que use menos recursos (tiempo o espacio). Al hablar de la eficiencia en tiempo de ejecución de un algoritmo nos referiremos a lo rápido que se ejecuta. La eficiencia de un algoritmo dependerá, en general, del tamaño datos de entrada. El tamaño de un ejemplar sería el número de bits necesarios para representarlo en el ordenador. Sin embargo, basta con determinar algún parámetro que nos permita dirimir entre dos ejemplares cuál es e (número de componentes, filas y columnas, etc.) Ejemplos de problemas serían: multiplicar dos números enteros o resolver una ecuación de segundo grado. Ejemplares de dichos problemas serían: (425,7) o (1,1,2). Es decir: 425 7 y x 2 x2. Un problema dado puede tener un número infinito de ejemplares (multiplicar dos números enteros) o finito (jugar una partida de ajedrez). Un algoritmo que afirma resolver un problema debe resolver todos los ejemplares del mismo. Si hay un solo ejemplar que no sea resuelto por el algoritmo el algoritmo no es correcto. 15 Eficiencia y notación asintótica. Resumen (ii) No todos los ejemplares de un problema son iguales. Por ello, la eficiencia del algoritmo puede variar en función del ejemplar o del grupo de ejemplares. A la hora de analizar un algoritmo es necesario saber que pueden darse tres tipos de ejemplares o casos: caso mejor, caso peor y caso medio. Una operación elemental es aquella cuyo tiempo de ejecución tiene una cota superior constante que sólo depende de su implementación. Se considera que son de coste unitario. La eficiencia no tiene unidades de medida, se usa la notación O(n). La notación anterior básicamente nos dice que si tenemos un algoritmo cuyo tiempo de ejecución es f(n) podemos encontrar otra función de n, n), y un tamaño de problema n 0 de tal forma que n) acota superiormente al tiempo de ejecución para todos los problemas de tamaño superior a n 0. Esta notación, como veremos a continuación, facilitará en las comparaciones de eficiencia entre algoritmos diferentes. Existen reglas y métodos para calcular el orden de complejidad de nuestros algoritmos para poder compararlos. 16 8