Análisis de Algoritmos

Documentos relacionados
Conceptos Fundamentales del Análisis de Algoritmos II

Notación Asintótica. Temas. Introducción Notación O Notación Omega Notación Theta. Análisis de Algoritmos

Análisis de la Complejidad de Algoritmos

Análisis y Diseño de Algoritmos

Notación Asintótica. Programación Avanzada

Complejidad computacional y asintótica

1. Introducción al análisis de algoritmos

1. 1. Introducción al concepto de algoritmia

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

La eficiencia de los programas

Análisis de algoritmos

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

Notación Asintótica 2

Introducción y Comportamiento Asintótico

Diseño y Análisis de Algoritmos

1. Algoritmo, programa y pseudocódigo. Introducción al estudio de algoritmos. Ejemplos

Análisis y Diseño de Algoritmos

Algoritmos y Complejidad

Técnicas y Herramientas. Algoritmos y Complejidad. Técnicas de Demostración. Técnicas y Herramientas. Herramientas Matemáticas Básicas

Introducción al Análisis del Coste de Algoritmos

CI2612: Algoritmos y Estructuras de Datos II. Nociones básicas. Objetivos. Algoritmos. Blai Bonet

cc3001 Métodos Matemáticos

Análisis Amortizado. Diseño y Análisis de Algoritmos Cátedra de Programación Carrera de Ingeniería de Sistemas Prof. Isabel Besembel Carrera

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

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

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

Análisis de Algoritmos

Análisis de algoritmos

Introducción al análisis de algoritmos

Programación II. Mario Aldea Rivas Programación II 04/04/11 1. Mario Aldea Rivas Programación II 04/04/11 2

Algoritmos y Complejidad

Estructuras de Datos y Algoritmos

ALGORITMOS INTRODUCCIÓN ALGORITMOS INTRODUCCIÓN AL ANÁLISIS Y AL DISEÑO DE AL ANÁLISIS Y AL DISEÑO DE UNIVERSIDAD AUTÓNOMA METROPOLITANA

Estructuras de Datos. Clase 3 Análisis de algoritmos recursivos

Tema 2 Fundamentos de Complejidad Algorítmica

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

Parte I: El computador y el proceso de programación

TÉCNICAS DE ANÁLISIS DE ALGORITMOS Miguel Angel Norzagaray Cosío Universidad Autónoma de Baja California Sur 1

Complejidad Computacional

Algoritmos de Ordenamiento

Algoritmos de Ordenación

Análisis de algoritmos.

Análisis de Algoritmos

Tema 3. Análisis de costes

COMPLEJIDAD Y EFICIENCIA DE ALGORITMOS

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

Complejidad de los Algoritmos

Algoritmos: Análisis de Algoritmos

IN34A - Optimización

TEMA 1 La eficiencia de los algoritmos

Análisis de algoritmos y Notación Asintótica

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Computación I (CI-2125) Clase 3. Prof. Mireya Morales Primera

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

Análisis de algoritmos

Divide-y-vencerás, backtracking y programación dinámica

b) Diagrama de flujo La representación del algoritmo mediante la utilización de un diagrama de flujo sería como el que se muestra:

La Máquina de Acceso Aleatorio (Random Access Machine)

Criptografía y Seguridad Computacional

ELO320 Estructuras de Datos y Algoritmos. Complejidad. Tomás Arredondo Vidal

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

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

Algoritmos y Complejidad

Unidad 3. Estructuras de control en diagrama de Flujo y pseudocódigo Tema Iteración o Repetitivas (mientras)

Programación Estructurada

SISTEMAS OPERATIVOS Arquitectura de computadores

Carlos A. Rivera-Morales. Precálculo 2

Fundamentos de Programación Entera. A. Revisión. Carlos Testuri Germán Ferrari

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

Partes de una computadora. Conceptos Generales. Elementos de Computación (CU) Computación (TIG) El Hardware de una computadora

5. ESTRUCTURAS DE REPETICIÓN

ARQUITECTURA DE VON NEUMANN Y HARVARD

Transcripción:

January 15, 010

1 Pseudocódigo 3

Modelos de referencia Antes de analizar un algoritmo debemos tener un modelo de la implementación de la tecnología que se va a usar, incluyendo un modelo para los recursos de esa tecnología y sus costos. Nosotros... Asumamos un modelo de computación genérico de acceso aleatorio (Random-Access Machine) y nuestros algoritmos son implementados como programas de computadoras

El modelo RAM Las instrucciones se ejecutan una tras otra No hay operaciones concurrentes

El modelo RAM Las instrucciones se ejecutan una tras otra No hay operaciones concurrentes Contiene instrucciones comúnmente encontradas en computadores reales: aritméticas( +, -, *, /, %), movimiento de data (cargar, copiar, almacenar) y control (condicionales, llamado de funciones y retorno)

El modelo RAM Las instrucciones se ejecutan una tras otra No hay operaciones concurrentes Contiene instrucciones comúnmente encontradas en computadores reales: aritméticas( +, -, *, /, %), movimiento de data (cargar, copiar, almacenar) y control (condicionales, llamado de funciones y retorno) No modela la jerarquía de memoria que se encuentra en las arquitecturas modernas: cache, memoria virtual, etc...

El modelo RAM Las instrucciones se ejecutan una tras otra No hay operaciones concurrentes Contiene instrucciones comúnmente encontradas en computadores reales: aritméticas( +, -, *, /, %), movimiento de data (cargar, copiar, almacenar) y control (condicionales, llamado de funciones y retorno) No modela la jerarquía de memoria que se encuentra en las arquitecturas modernas: cache, memoria virtual, etc...

Pseudocódigo El tiempo que toma Insertion Sort depende fundamentalmente de la entrada: el ordenamiento de 1,000 números toma más que el de 10. Más aun, el Insertion Sort puede tomar distinta cantidad de tiempo para ordenar dos entradas del mismo tamaño pero diferiendo en qué tan ya ordenadas estén. Preliminares... El tiempo de ejecución de un algoritmo en función de su entrada es la cantidad pasos ejecutados. Asumeremos que un tiempo constante se necesita para ejecutar cada ĺınea de código. Las ĺıneas pueden tener distintos tiempos, pero asumeremos que el tiempo de la i-ésima ĺınea toma Ci, donde Ci es constante.

Pseudocódigo Outline Pseudocódigo Las ĺıneas donde están definidos los bucles se ejecutan una vez más que el cuerpo del bucle mismo. Por qué? El tiempo de ejecución del algoritmo es la suma de los tiempos de ejecución de cada sentencia ejecutada. Una sentencia que tome Cx tiempo y se repita n veces contribuye ncx al tiempo de ejecución del algoritmo.

Pseudocódigo Tiempo de ejecución del Insertion Sort Sumando los productos anteriores (costo x veces) llegamos a la siguiente fórmula: T(n) = c 1 n + c (n 1) + c 4 (n 1) + c 5 n j= t j + c 6 n j= (t j 1) + c 7 n j= (t j 1) + c 8 (n 1)

Pseudocódigo Tiempo de ejecución del Insertion Sort () Notando que: n j= t j = n(n+1) 1 y n j= (t j 1) = n(n+1) Entonces: T(n) = c 1 n +c (n 1)+c 4 (n 1)+c 5 ( n(n+1) 1)+c 6 ( n(n+1)) +c 7 ( n(n+1) ) T(n) T(n) = ( c 5 + c 6 + c 7 )n +(c 1 +c +c 4 + c 5 c 6 c 7 +c 8 )n (c +c 4 +c 5 +c 8 )

Pseudocódigo Este tiempo de ejecución puede ser expresado de la forma an + bn + c para las constantes a, b y c que dependen de los costos c i. Por lo tanto, es una función cuadrática Generalmente nos interesamos por el peor tiempo de ejecución de los algoritmos, porque... (1) Es un ĺımite superior, garantiza que el algoritmo no excederá tal ĺımite () El peor de los casos ocurre frecuentemente. Considera el ejemplo de una búsqueda en una base de datos. (3) El caso promedio es difícil de especificar y termina siendo una función similar a la del peor de los casos

En el análisis de algoritmos nos interesa la proporción o orden de crecimiento. Este orden de crecimiento es el término de mayor orden del polinomio que expresa el tiempo de ejecución (n en el caso del ordenamiento por inserción Esto es porque, a medida que n crece, los otros términos no aportan tanto. En el caso del ordenamiento por inserción, decimos entonces que su tiempo de ejecución en el peor de los casos es de orden θ(n ) Hay distintas notaciones para expresar el tiempo de ejecución...

Notación Theta Dada una función g(n), decimos por Θ(g(n)) el conjunto de funciones Θ(g(n)) = {f(n): existen constantes positivas c 1, c yn 0 tal que 0 <= c 1 g(n) <= f (n) <= c g(n) para todas las n => n0} O sea Una función f(n) pertenece al conjunto Θ(g(n)) si existen constante c 1 yc tal que pueda estar en el medio entre c 1 g(n)yc g(n), para una n suficientemente grande. Al decir f(n) = Θ(g(n)) se debe leer f(n) es del orden Θ(g(n))

Notación Big Oh Dada una función g(n), denotamos por O(g(n)) el conjunto de funciones O(g(n)) = {f(n): existen constantes positivas cyn 0 tal que f (n) <= cg(n) para todas las n => n0} O sea La notación O sólo denota un ĺımite superior. Es como decir, a lo sumo X. Por lo tanto, n = O(n ). Esto implica también que al utilizar la notación O para expresar el peor tiempo de ejecución de un algoritmo, también estamos expresando tiempo de ejecución para cada entrada. Al decir f(n) = O(g(n)) se debe leer f(n) es del orden O(g(n))

Notación Omega Dada una función g(n), denotamos por Ω(g(n)) el conjunto de funciones Ω(g(n)) = {f(n): existen constantes positivas cyn 0 tal que 0 <= cg(n) <= f (n) para todas las n => n0} O sea Así como O(g(n)) expresa un ĺımite asintótico superior, Ω(g(n)) exprea un ĺımite asintótico inferior. Esto implica, similar a Big Oh, que al expresar el mejor tiempo de ejecución con Ω también estamos expresando el tiempo de ejecución de todas las entradas. Ejemplo: El tiempo de ejecución del insertion-sort cae entre Ω(n)yO(n ). Al decir f(n) = Ω(g(n)) se debe leer f(n) es del orden Ω(g(n))

Small o Outline Dada una función g(n), denotamos por o(g(n)) el conjunto de funciones o(g(n)) = {f(n): existen constantes positivas cyn 0 tal que 0 <= f (n) < cg(n) para todas las n => n0} O sea Small o representa, a diferencia de Big O, un ĺımite asintótico superior pero no fuerte. Ejemplo: n = o(n ) pero no n = o(n ) Al decir f(n) = o(g(n)) se debe leer f(n) es del orden o(g(n))