Análisis de Algoritmos 2

Slides:



Advertisements
Presentaciones similares
Capítulo 2 Algoritmos.
Advertisements

PROPIEDADES DE EXPONENTES, RADICALES
Complejidad Computacional
Diseño y análisis de algoritmos
Programación II Recursividad
¿ Que es la complejidad de un algoritmo ?
Funciones. Programación, Algoritmos y Estructuras de Datos.
INFORMATICA I Funciones CLASE 13.
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERIA DIVISIÓN DE INGENIERÍA ELÉCTRICA COMPUTACIÓN PARA INGENIEROS NOTA IMPORTANTE: Para complementar.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Evaluacion de algoritmos
Logaritmo Es el exponente al que hay que elevar otro número llamado base para que nos resulte como potencia un número N. donde: N es el número b es la.
ESTRUCTURAS DE SECUENCIA
Unidad 3 Punteros.
Arreglos: Vectores en JAVA
2 Acciones y funciones 2.1 Concepto
Funciones en lenguaje C
Unidad 1 Funciones exponenciales y logarítmicas
Medición y rendimientos de Algoritmos
EXPONENTES Y RADICALES
Clase Teórica No. 4 Programación IV
Estructuras de Iteracion (Repetitivas ) while , for,, do-while
Arreglos.
3.1 Declaración de tablas en C
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
Universidad Domingo Savio Facultad de Ciencias y Tecnología de la Información Carrera Ingeniería en Redes y Telecomunicaciones Materia : Programación I.
Pertinencia de la enseñanza del cómputo paralelo en el currículo de las ingenierías. Proyecto PAPIME PE
Estructura de Datos y Algoritmos

Estructuras de Datos Arreglos.
Búsqueda. Búsqueda Secuencial Es el método de búsqueda más sencillo En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y.
Algoritmos de búsqueda
Introducción al 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.
Computación I Primer Semestre 2006 Capítulo IV Ciclos y Colecciones (con un sabor a algoritmos)
Práctica 1 Teoría de errores
Análisis de Algoritmos
Estructuras de control Resolución de problemas y algoritmos.
Departamento de Sistemas Informáticos y Programación Universidad Complutense de Madrid Bloque 2: Divide y Vencerás Unidad 1: Nociones básicas.
Conceptos Avanzados de Programación
Eficiencia en uso de recursos y memoria
LOGARITMOS.
LOGARITMOS.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Análisis de Algoritmos Tiempo de ejecución de un algoritmo Prof
Calculo de Limite de Funciones
Fundamentos de Programación
Ingeniería en Software Facultad de Ingeniería 2014
Ing. Esp. Ricardo Cujar.  Lenguaje de programación orientado a objetos.  Desarrollado por Sun MicroSystems.  Independiente del Sistema Operativo gracias.
Universidad Domingo Savio Facultad de Ciencias y Tecnología de la Información Carrera Ingeniería en Redes y Telecomunicaciones Materia : Programación I.
Algoritmo.
Arreglos: Vectores Prof. Flor Narciso Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de Los Andes.
Arreglos Ejemplo paso a paso. Planteamiento Como estudiante de ingeniería, quieres usar tus habilidades de programador para llevar un registro de tus.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
Redes (r, n) Suponga este sistema de 7 componentes redundante, puesto que (por hipótesis) el sistema funciona con al menos tres componentes Tiempo de falla.
LOGARITMOS.
Concepto y restricciones
ESTRUCTURAS DE DATOS “Conceptualización de estructuras de datos” Por: Eduardo Robayo.
Análisis de Algoritmos Tiempo de ejecución de un algoritmo Prof.: Ricardo Botero Tabares Ingeniería en Software Facultad de Ingeniería 2014.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
ArreglosUnidimensionales enjava. Existenarreglosdeunadimensión (unidimensionales),dedosdimensiones Losarreglossonvariablesquealmacenanvarios valores del.
Paso de parámetros Diseño de programas iterativos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 7 Versión.
(multiplicar por el exponente y disminuir el exponente inicial en uno)
Transcripción de la presentación:

Análisis de Algoritmos 2 Análisis de Algoritmos 2. El concepto de complejidad (aritmética en notación O) Prof.: Ricardo Botero Tabares Ingeniería en Software Facultad de Ingeniería Tecnológico de Antioquia Institución Universitaria 2014

ANÁLISIS DE ALGORITMOS 2. El concepto de complejidad (aritmética en notación O) Para calcular el tiempo de ejecución de un algoritmo se debe definir su orden de magnitud, basado en el contador de frecuencias. El orden de magnitud hace referencia a la aritmética en notación O.

Como se onotó antes, los órdenes de magnitud más comunes son los que se observan en la tabla inferior, donde los algoritmos más eficientes en cuanto a tiempo de ejecución son los de orden de magnitud constante, y los menos eficientes son los de orden de magnitud exponencial. Orden de magnitud Representación Constante O(1) Logarítmico O(log2(n)) Lineal O(n) Semilogarítmico O(nlog2(n)) Cuadrático O(n2) Cúbico O(n3) Exponencial O(2n) Eficiencia Veamos otros algoritmos con orden de magnitud cúbico, logarítmico, semilogarítmico y exponencial.

Algoritmo de complejidad cúbica No es difícil concebirlos: algoritmo con tres ciclos anidados. Ejemplo: llenar una arreglo de tres dimensiones. //Declaraciones previas: variables globales o de clase int n; double cubo[] [] []; void llenarCubo( ){ //Se asume que la variable entera n tiene un valor consistente. cubo = new double[n] [n] [n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++){ Consola.imprimir(“Digite un número real:”); cubo [i] [j] [k] = Consola.leerReal(); } Orden de magnitud: O(n3)

Algoritmo de complejidad logarítmica Recordemos el concepto de logaritmo: logb(x) = r El número r es el exponente al cual hay que elevar el número b (base) para obtener x, es decir: br = x Ejemplos: log2(32) = 5 porque 25 = 32 log10(100) = 2 porque 102 = 100 En otras palabras: el logaritmo de un número x es el número de veces que hay que dividir dicho número, por otro llamado base (b), hasta obtener un cociente de uno (1).

Un algoritmo clásico de complejidad logarítmica en base 2, es el algoritmo de la búsqueda binaria sobre un vector ordenado. vec El algoritmo es el siguiente: int busquedaBinaria(int dato) { // El vector vec y su tamaño n // son atributos de clase int centro, inf = 0, sup = n-1; while (inf <= sup){ centro = (sup + inf) / 2; if (vec[centro] == dato) return centro; else if (dato < vec[centro]) sup = centro - 1; inf = centro + 1; } return -1; 3 5 8 13 19 23 31 36 45 50 57 61 72 81 93 1 2 4 6 7 9 10 11 12 14

Otros algoritmos sencillos de complejidad logarítmica i) O(log2(n)) void metodoLogaritmico1( ){ int n, cont, i; n = 32, cont = 0, i = 32; while (i > 1){ cont = cont + 1; i = i / 2; } Consola.imprimir(n + “\n” + cont); O también:

ii) O(log2(n)) void metodoLogaritmico2( ){ int n, cont, i; n = 32, cont = 0, i = 1; while (i < n){ cont = cont + 1; i = i * 2; } Consola.imprimir(n + “\n” + cont);

iii) O(log3(n)) void metodoLogaritmico3( ){ int n, cont, i; n = 81, cont = 0, i = 81; while (i > 1){ cont = cont + 1; i = i / 3; } Consola.imprimir(n + “\n” + cont); En general, si la variable controladora del ciclo (en este caso i) se dividiera por x, el algoritmo sería O(logx(n)).

Algoritmo de complejidad semilogarítmica Se debe tener un ciclo logarítmico dentro de otro ciclo de magnitud lineal. Ejemplo: void semiLogaritmico( int n){ int acum, i, j, tot; acum = 0, i = 1; while (i <= n){ tot = 0; j = n; while (j > 1){ tot = tot +1; j = j / 2; } Consola.imprimir(tot); acum = acum + tot; i = i + 1; Consola.imprimir(n + “\n” + acum); Orden de magnitud: nlog2(n)

Búsqueda del algoritmo más eficiente Considérese el siguiente problema: Leer un entero positivo y mostrar la suma de los enteros desde uno (1) hasta el número ingresado. Una solución inmediata es la siguiente: void sumatoria( ){ int n, suma = 0, i; Consola.imprimir(“Ingrese un número entero positivo:”); n = Consola.leerEntero( ); for (i = 1; i <= n; i++) suma += i; Consola.imprimir(“Suma enteros desde 1 hasta ” + n + “: ”+ suma); } Este método es: O(n)

Ahora, existe una fórmula matemática para calcular la suma de los enteros entre 1 y una variable entera n: suma = 𝑖=1 𝑛 𝑖 = n*(n + 1) / 2 Aplicando esta fórmula, podemos solucionar el problema sin el uso de un ciclo en el cálculo de la sumatoria: void sumatoriaConFormula( ){ int n, suma; Consola.imprimir(“Ingrese un número entero positivo:”); n = Consola.leerEntero( ); suma = n*(n + 1) / 2; Consola.imprimir(“Suma enteros desde 1 hasta ” + n + “: ”+ suma); } Este método es: O(1)