¿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.

Slides:



Advertisements
Presentaciones similares
Introducción a la programación
Advertisements

Algoritmos y Programas
Complejidad Computacional
Complejidad Computacional
Diseño y análisis de algoritmos
Unidad I - Programación. Como están escritos los programamas de computadoras.
ESTRUCTURA DE DATOS Unidad 01 RECURSIVIDAD.
Estructura de Datos Unidad 4. Recursividad Dra. María Lucía Barrón Estrada Enero-Junio 2007.
CARRERA: INGENIERIA CIVIL UNI-RUACS
Estructura de Datos Hugo Araya Carrasco Hugo Araya Carrasco.
¿Cómo hacer para que una máquina comprenda el LN?
DESARROLLO DE PROGRAMAS
INSTITUTO TECNOLOGICO DE MINATITLAN
Curso de Programación I Parte I
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.
INFORMACIÓN AUTOMÁTICA Ciencia que estudia el tratamiento
Programación 1 Introducción
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Evaluacion de algoritmos
Ingeniería de sw.
Objetivo: Conocer los componentes hardware y software que constituyen un computador.
ALGORITMOS 2 DIGITALES II
Estructuras de Repetición
Programación I Teoría VI: Recursividad
IINTRODUCCION A LA CIENCIA DE LA COMPUTACION Y A LA PROGRAMACION
Programación Básica con NQC Patricio A. Castillo 03/05/2008.
Medición y rendimientos de Algoritmos
ALGORITMOS es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos.
TRADUCTOR DE UN PROGRAMA
Fundamentos de Programación
Proceso de información en la computadora
Programación II Profesor A.S. MOLINA, Carlos
Semana 5 Subprogramas..
Análisis de Algoritmos
Análisis y Diseño de Algoritmos. Propiedades : f ( n )  O ( f ( n ) ) a ) O ( f ( n ) )  O ( g ( n ) )  f ( n )  g ( n )
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
Tema 1 Entorno de la programación. Conceptos elementales Algoritmo  Secuencia ordenada de pasos exentos de ambigüedad que conduce a la resolución de.
Tae Programación WEB Ventajas de los ordenadores ( compus pa los cuates ) Que es la Programación? Que es un lenguaje de programación? Algoritmo Que es.
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.
Análisis de algoritmos
Figure: Algoritmos Conceptos básicos. Programación: 1.Establecer una secuencia de acciones que: puedan ser ejecutadas por el procesador realicen una.
SISTEMAS OPERATIVOS.
TEMAS PRINCIPALES. ALGORITMOS. CONCEPTOS El algoritmo es un método para resolver un problema mediante una serie de pasos definidos, precisos y finitos.
CONCEPTOS BÁSICOS FUNDACIÓN UNIVERSITARIA LOS LIBERTADORES Fredys Alberto Simanca Herrera Programación Estructurada Semana Bogotá, D.C
PENSAMIENTO ANALÍTICO SISTÉMICO DAISY KATERINE RODRÍGUEZ DURÁN
Algoritmos y pseudocódigos
Ing. Rodolfo Junior Miranda Saldaña CIP: Chimbote- 2013
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) TRADUCTORES Y ANALIZADOR LEXICOGRÁFICO.
Metodología de la programación
TEMA1:Introducción 1 1. Programación 2. Lenguajes de Programación 3. Ordenador.
Análisis de Algoritmos Tiempo de ejecución de un algoritmo Prof
Algoritmo. Algoritmo Algoritmo Al-Khowarizmi nunca pensó que su nombre, seria el origen de palabras mas importantes que el mismo: Álgebra. Logaritmo.
Cecilia Laborde González
INTRODUCCIÓN LI & MSC OSCAR RAMÍREZ CORTÉS U NIVERSIDAD DE LA H UASTECA V ERACRUZANA L ENGUAJES DE P ROGRAMACIÓN.
Introducción a los TADs
Ingeniería del Software I
* 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.
UNIDAD 1 Introducción a la Programación OBJETIVO: El estudiante identificará los elementos Básicos de todo lenguaje de programación. Comparando las posibles.
Programación Java y Desarrollo de Aplicaciones Modulo 1 Arquitectura de ordenadores Tema 3 Programas.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
Unidad 1 Introduccion a los programas Concepto de Programa El término programa (del latín programma, que a su vez proviene de un vocablo griego) tiene.
Algoritmos.
Análisis de Algoritmos Tiempo de ejecución de un algoritmo Prof.: Ricardo Botero Tabares Ingeniería en Software Facultad de Ingeniería 2014.
Solución a Ecuaciones de Recurrencia Dr. Rogelio Dávila Pérez División de Posgrado Universidad Autónoma de Guadalajara
Algoritmos Computacionales
Ing. Barros Rodriguez D. Ronald Introducción a la Programacón.
Transcripción de la presentación:

Las matemáticas como medio para medir la eficiencia de los Algoritmos Computacionales

¿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 que permite encontrar la solución a un problema…” Un algoritmo, puede expresarse en términos de un lenguaje de programación, para obtener un programa que resuelve el problema por medio de la computadora.

Cita... “No hay un incremento concebible en el poder de las computadoras que pueda saturar la demanda científica: aún pensando que una computadora posea un ciclo de tiempo subnuclear (10-23 seg.) y densidades de almacenamiento subnucleares (1039 bits/cm3), ésta no podría manejar la mayoría de los problemas que son importantes en la investigación científica básica y aplicada. Por lo tanto, existirá siempre una fuerte presión para incrementar la eficiencia de los programas, para poder incrementar también la cantidad de información últil generada por un programa.” Ken Wilson, Nóbel de Física 1982

Á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, eficiencia, legibilidad, usabilidad, etc...

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.

Medición del tiempo de ejecución El tiempo de ejecución depende de: 1. La entrada al programa: Su tamaño Sus características 2. La calidad del código generado para el programa por el compilador . 3. La rapidez de las instrucciones de máquina. 4. La complejidad de tiempo del algoritmo.

¿Cómo medir? Cantidad de instrucciones básicas (o elementales) que se ejecutan. Ejemplos de instrucciones básicas: asignación de escalares lectura o escritura de escalares saltos (goto’s) implícitos o explícitos. evaluación de condiciones llamada a funciones etc.

Ejemplo cont = 1; while (cont <= n) do { x = x + a[cont]; x = x + b[cont]; cont = cont + 1; } 1 n+1 n n (goto implícito) 1 goto en falso. TOTAL: 5n + 3

Ejemplo 1 1 asignación + (n+1) comparaciones (n+2)*n = n2 +2n n*n = n2 z = 0; for (int x=1; x<=n; x++) for (int y=1; y<=n; y++) z = z + a[x,y]; 1 1 asignación + (n+1) comparaciones (n+2)*n = n2 +2n n*n = n2 2n2 (incremento + goto implícito) n (goto en falso for y) 2n (incremento + goto implícito) 1 (goto en falso for x) TOTAL: 4n2 + 6n + 4

Consecuencia… Se requiere contar con una notación que permita comparar la eficiencia entre los algoritmos… La NOTACIÓN ASINTÓTICA es la propuesta de notación aceptada por la comunidad científica para describir el comportamiento en eficiencia (o complejidad) de un algoritmo. Describe en forma sintética el comportamiento de la función que con la variable de entrada, determina el número de operaciones que realiza el algoritmo.

NOTACIÓN ASINTÓTICA COMPLEJIDAD TEMPORAL (y ESPACIAL). Tiempo (o espacio) requerido por un algoritmo, expresado en base a una función que depende del tamaño del problema. COMPLEJIDAD TEMPORAL ASINTÓTICA (y ESPACIAL). Comportamiento límite conforme el tamaño del problema se incrementa. Determina el tamaño del problema que puede ser resuelto por un algoritmo.

Definición Se dice que la función f(n) “es de orden g(n)” [O(g(n))], si existen constantes positivas c y n0 tales que f(n) <= c g(n) cuando n >= n0 Ejemplos: n+5 es O(n) pues n+5 <= 2n para toda n >= 5 (n+1)2 es O(n2) pues (n+1)2 <= 4n2 para n>= 1 (n+1)2 NO es O(n) pues para cualquier c > 1 no se cumple que (n+1)2 <= c*n

Ordenes más comunes de los algoritmos O(1) Constante O(n) Lineal O(n2 ) Cuadrático O(n3 ) Cúbico O (nm ) Polinomial O(log(n)) Logarítmico O(nlog(n)) nlog (n) O(mn ) exponencial O(n!) factorial

Comportamiento de las funciones n sqrt(n) n log n n log n

Otro método para calcular el orden de un problema Consiste en aplicar reglas a los estatutos estructurados: Secuencia de instrucciones Decisiones (ejemplo: if) Ciclos (ejemplo: while) Recursividad

Regla 1: Secuencia de instrucciones O(g1(n)) O(g2(n)) ≈ O( mayor(g1(n), g2(n), …, gm(n) ) Ejemplo: Una secuencia de 3 ciclos: Ciclo 1 = O(n) Ciclo 2 = O(log n) Ciclo 3 = O(n2) Tendrá como orden total… O(n2). O(g3(n)) O(gm(n))

Regla 2: Decisiones ≈ O( mayor(g1(n), g2(n)) ) O(g1(n)) Ejemplo: Una decisión con: Rama then = O(n log n) Rama else = O(log n) Tendrá como orden total… O(n log n). O(g2(n))

Regla 3: Ciclos ≈ O( m * g(n) ) O(g(n)) Ejemplo: Un ciclo cuya instrucción: Tiene un O(log n) Se repite n/2 veces Tendrá como orden total… O(½ n log n) = O(n log n). Se repite m veces

Consideraciones especiales En decisiones y ciclos anidados: Analizar el código desde la instrucción más interna hacia el más externa. Tip para los ciclos: ¿“Normalmente” cuál es el orden de la instrucción interna? Si la variable de control se incrementa o decrementa con un valor constante: Orden LINEAL. Si la variable de control se multiplica o divide por un valor constante: Orden LOGARÍTIMICO.

Ejemplo: Sort por intercambio for (int i=1; i<n; i++) for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); → O( ) 1 → O( ) 1 Regla 2: Decisiones = mayor de las 2 ramas

Ejemplo: Sort por intercambio for (int i=1; i<n; i++) for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); Peor caso: se repite n-1 veces → O( ) n → O( ) 1 Regla 3: Ciclos = # veces * orden de la instrucción interna

Ejemplo: Sort por intercambio for (int i=1; i<n; i++) for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); Se repite n-1 veces → O( ) n2 → O( ) n Regla 3: Ciclos = # veces * orden de la instrucción interna

Ejemplo: Multiplicación de matrices a11 a12 … a1n a21 a22 … a2n … … … … am1 am2 … amn b11 b12 … b1m b21 b22 … b2m … … … … bn1 bn2 … bnm X = c11 c12 … c1m c21 c22 … c2m … … … … cm1 cm2 … cmm c11 = a11*b11+a12 *b21 +…+ a1n *bn1 c12 = a11*b12+a12 *b22 +…+ a1n *bn2 … c21 = a21*b11+a22 *b21 +…+ a2n *bn1 cmm = am1*b1m+am2 *b2m +…+ amn *bnm n cij =  aikbkj k=1

Ejemplo: Multiplicación de matrices for i = 1 to n do for j = 1 to n do C[i,j] = 0; for k = 1 to n do C[i,j] = C[i,j] + A[i,k]*B[k,j]; O( n3 ) ← O( n2 ) ← O( 1 ) ← O( n ) ← O( 1 ) ←

Regla 4: Recursividad La complejidad de tiempo se obtiene contando la cantidad de veces que se hace la llamada recursiva. Casos que “normalmente” se dan: Orden LINEAL si sólo se tiene una llamada recursiva, con incrementos o decrementos en el parámetro de control. Orden LOGARITMICO si sólo se tiene una llamada recursiva, con multiplicaciones o divisiones en el parámetro de control. Si hay más de una llamada recursiva, el orden puede tender a ser EXPONENCIAL.

Ejemplo: Fibonacci (Iterativo) ant = 1; --> 1 act = 1; --> 1 while (n>2){ --> n-2 + 1 aux = ant + act; --> n-2 ant = act; --> n-2 act = aux; --> n-2 n = n - 1; --> n-2 } --> n-2+1 write (act); --> 1 T(n) = 6n-7 Por lo tanto el orden del algoritmo es O(n)

Ejemplo: Fibonacci (recursivo) Function fibonacci (n:int): int; if (n < 3) return 1; else return fibonacci(n-1) + fibonacci(n-2); ¿Cómo obtener la complejidad de tiempo del algoritmo? Cantidad de llamadas recursivas: 2 en cada llamada. Algoritmo de orden: O(2n/2)

Análisis de Fibonacci (recursivo) ¿Cuántos términos se requieren para calcular: f(5)? f(4)? f(3)? f(2)? f(6)? f(5) f(3) f(1) f(2) f(4) --> 9 --> 5 --> 3 --> 1 --> 15 Relación: El término T(n) requiere T(n-1)+T(n-2)+1 términos para calcularse.

Análisis de Fibonacci O(2n/2) Si el término T(n) requiere T(n-1)+T(n-2)+1 términos para calcularse… se puede decir que T(n) > 2 * T(n-2) … y por lo tanto: T(n) > 2 * 2 * T(n-4) … y T(n) > 2 * 2 * 2 * T(n-6) … y así sucesivamente hasta: T(n) > 2 * 2 * 2 * …. * 2 * T(1) Por lo tanto: T(n) > 2n/2 y podemos decir que el orden del algoritmo es O(2n/2) n/2 veces