Análisis de Algoritmos

Slides:



Advertisements
Presentaciones similares
Algoritmos y Programas
Advertisements

Complejidad Computacional
Complejidad Computacional
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Complejidad de Algoritmos
Complejidad Algorítmica: Análisis de algoritmos
Lenguajes de programación
UNIDAD II: ALGORITMOS Y LENGUAJES
¿ Que es la complejidad de un algoritmo ?
Resolución de Problemas Algoritmos y Programación
Técnico en programación de Software
Concepto de programa. Directorio Concepto de programa. Analisis del problema. Resolucion del problema. Desarroollo de un programa. Partes constitutivas.
Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid Bloque 1: Introduccion Unidad 1: Consideraciones acerca de la eficiencia.
Unidad 4: Análisis de algoritmos (parte II)
Metodología de la Programación
Programación 1 Introducción
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Estructuras de control
ALGORITMOS 2 DIGITALES II
Arquitectura de Conjunto de Instrucciones (ISA)
¿Qué es un algoritmo? “(del árabe al-Khowârizmî, sobrenombre del célebre matemático árabe Mohámed ben Musa). Conjunto ordenado y finito de operaciones.
Tema 6. Conceptos básicos de programación
Medición y rendimientos de Algoritmos
Programación de Computadores
Lenguaje C.
Proceso de información en la computadora
PRINCIPIOS DE PROGRAMACION ESTRUCTURADA
Programación en Matlab
Análisis y Diseño de Algoritmos. Propiedades : f ( n )  O ( f ( n ) ) a ) O ( f ( n ) )  O ( g ( n ) )  f ( n )  g ( n )
Fundamentos de programación
Análisis de Algoritmos
Introducción al análisis de algoritmos
Pertinencia de la enseñanza del cómputo paralelo en el currículo de las ingenierías. Proyecto PAPIME PE
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Conversión cadena a número
Capítulo 2 – Estructuras de Control
Sesión 5 Sentencias de Selección y repetición Prof:Eridan Otto Programación de Computadores Lenguaje Pascal.
ESTRUCTURA DE DATOS ESD-243
Diseño de algoritmos La computadora puede realizar procesos y darnos resultados, sin que tengamos la noción exacta de las operaciones que realiza. Con.
Fundamentos de programación Organización de una computadora.
Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid Bloque 1: Introduccion Unidad 3: Análisis de algoritmos (parte I)
Teoría – Alejandro Gonzalez
Figure: Algoritmos Conceptos básicos. Programación: 1.Establecer una secuencia de acciones que: puedan ser ejecutadas por el procesador realicen una.
PENSAMIENTO ANALÍTICO SISTÉMICO DAISY KATERINE RODRÍGUEZ DURÁN
Control de Flujo.
Análisis de Algoritmos 2
Unidad 1: FUNDAMENTOS DE COMPUTACIÓN Y PSEUDOLENGUAJE
Capítulo 6. ANÁLISIS DE ALGORITMOS
Análisis de Algoritmos
Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid Bloque 2: Divide y Vencerás Unidad 1: Nociones básicas.
Análisis de algoritmos Generalidades
Representación de Algoritmos
POR: MÓNICA MARÍA RÚA BLANDÓN
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
Términos algoritmo diseñar algoritmo implementar algoritmo
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
ALGORITMOS PRESENTADO POR: FERNANDA LEURO TATIANA CONTRERAS 1004
Algoritmo. Algoritmo Algoritmo Al-Khowarizmi nunca pensó que su nombre, seria el origen de palabras mas importantes que el mismo: Álgebra. Logaritmo.
Diseño y análisis de algoritmos Análisis de Algoritmos II.
Metodología de la programación
Ingeniería en Software Facultad de Ingeniería 2014
Introducción a los TADs
Tema 3: Complejidad Estructura de Datos
* Cuando nos permite desarrollar un programa que necesitamos para tomar un conjunto de buenas prácticas para hacer eso. Esto se debe a que podemos ahorrar.
Análisis y Diseño de Algoritmos Programa #1 Samuel Garrido Daniel.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
QUE ES PNL. CONCEPTO La programación neurolingüística es un proceso mental, mediante el cual utilizamos los sentidos con los cuales percibimos el mundo,
Prof. Jonathan Silva Ingeniería Civil – Informática I Ingeniería Civil Informática I Clase 3 – Diseño de Programas.
Transcripción de la presentación:

Análisis de Algoritmos Metodologías para el análisis de algoritmos Notación asintótica Elementos matemáticos Otras técnicas de análisis

Metodologías para el análisis de algoritmos La complejidad de un algoritmo estudia los recursos necesarios (tiempo y memoria) que requiere un algoritmo. El tiempo de ejecución de un algoritmo o es prioritario cuando se analiza un algoritmo. El tiempo de ejecución de un algoritmo o estructura de datos depende de varios factores relativos al hardware (procesador, reloj, memoria, disco, etc) y el software (sistema operativo, lenguaje, compilador, etc.).

Metodologías para el análisis de algoritmos Medida del tiempo de ejecución: experimentación. Escribir un programa que implemente el algoritmo. Ejecutar el programa con un conjunto de datos que varían en tamaño y composición (peor caso, mejor caso, caso promedio) . Usar un método como System.currentTimeMillis() para obtener una medida precisa del tiempo de ejecución.

Metodologías para el análisis de algoritmos Medida del tiempo en Java: experimentación. long startTime = System.currentTimeMillis(); // retorna el tiempo en miliseconds desde 1/1/1970 GMT // código a ser medido long elapsedTime = System.currentTimeMillis() - startTime;

Metodologías para el análisis de algoritmos Medida del tiempo en Java: experimentación.

Metodologías para el análisis de algoritmos Medida del tiempo en Java (más preciso): long startTime = System.currentTimeMillis(); long counter; do { counter++; hacerAlgo ( ); } while (System.currentTimeMillis() - startTime < 1000), long elapsedTime = (System.currentTimeMillis() - startTime) / counter;

Metodologías para el análisis de algoritmos Interesa hallar la dependencia del tiempo de ejecución en función del tamaño de la entrada. Un método para estudiar el tiempo de ejecución es la experimentación, que tiene limitaciones: Los experimentos se pueden hacer sobre un conjunto limitado de entradas de prueba. Es necesario realizar los experimentos con el mismo hardware y software. Es necesario implementar y ejecutar el algoritmo.

Metodologías para el análisis de algoritmos Adicionalmente a la experimentación conviene disponer de un enfoque analítico que: Tome en consideración todas las posibles entradas. Permita evaluar la eficiencia de dos algoritmos de forma independiente del hardware y software. Se pueda realizar estudiando una representación de alto nivel del algoritmo sin necesidad de implementarlo.

Pseudocódigo Pseudocódigo es una descripción de un algoritmo más estructurada que la verbal pero menos formal que la de un lenguaje de programación. Ejemplo: hallar el elemento mayor de un array. Algorithm arrayMax(A, n): Input: Un array A que almacena n enteros. Output: El máximo elemento en A. currentMax  A[0] for i 1 to n -1 do if currentMax < A[i] then currentMax  A[i] return currentMax Pseudocódigo es la notación preferida para describir algoritmos.

Qué es pseudocódigo Una mezcla de lenguaje natural y conceptos de programación de lato nivel que describen las proncipales ideas que están en una implementación genérica de una estructura de datos o algoritmo. -Expresiones: usa símbolos matemáticos standard para describir expresiones numéricas y booleanas -usa  for assignment (“=” in Java) -usa = for the equality relationship (“==” in Java) -Declaración de métodos: -Algorithm nombre(param1, param2) -Bloques Programación: - decision structures: if ... then ... [else ... ] - while-loops: while ... do - repeat-loops: repeat ... until ... - for-loop: for ... do - array indexing: A[i] -Métodos: - llamadas: object method(args) - returns: return value

Análisis de algoritmos Operaciones Primitivas: se pueden identificar en el pseudocódigo instrucciones de bajo nivel independientes del lenguaje de programación. Ejemplos: llamar un método y retornar de un método operaciones aritméticas (e.g. suma) comparación de dos números, etc. Inspeccionando el pseudocódigo se puede contar el número de operaciones primitivas ejecutadas por un algoritmo.

Ejemplo de conteo Algorithm arrayMax(A, n): Input: Un array A que almacena n enteros. Output: El máximo elemento en A. currentMax  A[0] for i 1 to n -1 do if currentMax < A[i] then currentMax  A[i] return currentMax t(n) = 2 + 1 + n +4(n-1) + 1 = 5n (mínimo) = 2 + 1 + n +6(n-1) + 1 = 7n - 2 (máximo) 2 1 n 4(n-1) | 6(n-1) 1

Notación asintótica Objetivo: simplificar el análisis eliminando la información innecesaria (como “redondeo” 1,000,001≈1,000,000) Queremos decir de manera formal 3n2 ≈ n2 Notación “O-grande (Big-Oh)”: dadas las funciones f(n) and g(n), decimos que f(n) es O(g(n) ) si y solo si hay constantes positivas c y n0 tal que f(n)≤ c g(n) para n ≥ n0

Notación asintótica: ejemplo Para funciones f(n) y g(n) (derecha) hay constantes positivas c y n0 tales que: f(n)≤c g(n) for n ≥ n0 conclusión: 2n+6 is O(n).

Notación asintótica: ejemplo Otro caso… n2 no es O(n) debido a que no hay c y n0 tal que: n2 ≤ cn para n ≥ n0 (como se ve en el gráfico, no importa cuan grande se escoge c hay un n suficientemente grande que n2>cn ) .

Notación asintótica Nota: Aun cuando es correcto decir que “7n - 3 es O(n3)”, es mejor decir “7n - 3 es O(n)”, esto es, se debe hacer la aproximación lo más cerca posible Regla simple: Eliminar los términos de bajo orden y las constantes 7n-3 es O(n) 8n2log n + 5n2 + n es O(n2log n)

Notación asintótica (terminología) Clases especiales de algoritmos: logaritmico: O(log n) lineal: O(n) cuadratico: O(n2) polinomico: O(nk), k ≥ 1 exponencial: O(an), n > 1 “Alternativos” de Big-Oh  (f(n)): Big Omega-- cota inferior asintótica  (f(n)): Big Theta-- cota promedio asintótica

Tiempo de ejecución Usar la notación Big-Oh para expresar el número de operaciones primitivas ejecutadas como función del tamaño de entrada. Ejemplo: decimos que el algoritmo arrayMax se ejecuta en tiempo O(n). Comparación de tiempos de ejecución asintóticos - un algoritmo que corre en tiempo O(n) es mejor que uno que corre en tiempo O(n2) - de forma similar, O(log n) es mejor que O(n) - jerarquía de funciones: log n << n << n2 << n3 << 2n Cuidado! Con los factores constantes muy grandes. Un algoritmo que corre en tiempo 1,000,000 n todavía es O(n) pero puede ser menor eficiente para un conjunto de datos que uno que corre en tiempo 2n2, que es O(n2)

Ejemplo de análisis asintótico Algoritmo para calcular promedios prefijos: Algorithm prefixAverages1(X): Input: Array X de números de n-elementos. Output: Array A de números de n -elementos tal que A[i] es el promedio de los elementos X[0], ... , X[i]. Sea A un array de n números. for i 0 to n - 1 do a  0 for j  0 to i do a  a + X[j] A[i]  a/(i+ 1) return array A Análisis: O(n2)

Ejemplo de análisis asintótico Otro algoritmo para calcular promedios prefijos: A[i-1] = (X[0] + X[1] +...+ X[i-1])/i A[i] = (X[0] + X[1] +...+ X[i-1] + X[i])/(i+1) Algorithm prefixAverages2(X): Input: Array X de números de n-elementos. Output: Array A de números de n -elementos tal que A[i] es el promedio de los elementos X[0], ... , X[i]. Sea A un array de n números. s 0 for i  0 to n do s  s + X[i] A[i]  s/(i+ 1) return array A Análisis: O(n)

Complejidad en la práctica Considerando 109 instrucciones/segundo

Análisis de algoritmos recursivos Algorithm recursiveMax(A, n): Input: Un array A que almacena n enteros. Output: El máximo elemento en A. if n = 1 then return A[0] return max {recursiveMax(A, n-1), A[n-1] } Se usan ecuaciones de recurrencia 3 si n = 1 T(n) = T(n-1) + 7 en otro caso Forma cerrada: T(n) = 7(n-1) + 3

Elementos matemáticos Sumatorios y series Logaritmos y exponentes propiedades de logaritmos: logb(xy) = logbx + logby logb (x/y) = logbx - logby logbxa = alogbx logba= logxa/logxb propiedades de exponenciales: a(b+c) = aba c abc = (ab)c ab /ac = a(b-c) b = a logab bc = a c*logab Funciones especiales Floor: x = el mayor entero ≤ x Ceiling: x = el menor entero ≥ x

Elementos matemáticos Técnicas de justificación (demostración) Ejemplo y contraejemplo Contrapositivo y Contradicción Inducción Invariantes de bucle Probabilidades (algoritmos que usan random o análisis de rendimiento promedio de un algoritmo)

Otras técnicas Amortización Método contable Funciones potenciales Experimentación Configuración Selección de la cuestión Decisión de lo que va a medir (Referencias a memoria, Comparaciones, Operaciones aritméticas) Generación de los datos de prueba Codificación de la solución y realización del experimento Análisis de datos y visualización La prueba del cociente La prueba de potencia