Diseño y análisis de algoritmos

Slides:



Advertisements
Presentaciones similares
Capítulo 2 Algoritmos.
Advertisements

Teoría de Números Instructor: Luis Eduardo Falcón.
Complejidad Computacional
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Programación de Computadores
Introducción a los Algoritmos
2.1 – Expresiones algebraicas
Notación Científica y Potencia de 10
Combinadores SK.
Bloque 2: Divide y Vencerás
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)
1. La integral Gustavo Rocha
CÁLCULO DIFERENCIAL.
Curso de Programación I Parte III
¿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 1. NÚMEROS NATURALES
TEMA 6: DIVISIÓN DE POLINOMIOS
“Definiciones, Operaciones algebraicas, MCM, MCD”
2.1 Recursividad El hecho de que una función pueda llamarse a sí misma.
¿Qué es una ecuación diferencial?
Analisis y Diseño de Algoritmos Tema: Grafos 3ra Parte
DPTO. MATEMÁTICAS - I.E.S. PABLO SERRANO
EXPONENTES Y RADICALES
Representación de Números en un Registro Binario
Análisis de Algoritmos

Análisis de Algoritmos
CONCEPTOS BÁSICOS: Números Naturales
Introducción al análisis de algoritmos

CC3001 Algoritmos y Estructuras de Datos
(Organización y Manejo de Archivos)
Descomposición Factorial Unidad 5
Material de apoyo Unidad 4 Estructura de datos
Divide y vencerás 1. Método general.
Análisis de algoritmos
Guías Modulares de Estudio Cálculo diferencial – Parte B
4.  Métodos matemáticos.
Operaciones con números complejos
Parte II. Algorítmica. 4. Programación dinámica.
Parte I. Estructuras de Datos.
Análisis y Diseño de Algoritmos
Una introducción a la computación evolutiva
SIG. LAURA VELAZQUEZ MORELOS. Hace referencia a un refrán que implica resolver un problema difícil, dividiéndolo en partes más simples tantas veces como.
Parte I. Estructuras de Datos.
Parte I. Estructuras de Datos.
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.
El desarrollo del pensamiento multiplicativo
Ecuaciones Algebraicas
POLINOMIOS p(x) = p0 + p1x + p2x2 + p3x3 + … + pnxn pn ≠ 0
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
“CURSO PROPEDÉUTICO PARA EL MEJORAMIENTO DEL PENSAMIENTO MATEMÁTICO”
Introducción a los TADs
QUINTA CONFERENCIA Lugar: Oficinas Generales Fecha: 15 de Diciembre de 2007 Conferencista: Prof. Carlos Betancourt Monroy Centro de Estudios Científicos.

TEMA 4: USO DE EXPONENTES Y NOTACIÓN CIENTÍFICA 1 MATEMÁTICAS II POTENCIAS SUCESIVAS DE UN NÚMERO POTENCIAS SUCESIVAS DE UN NÚMERO ¡ CUIDADO CON LAS BACTERIAS.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
Soluciones en Serie de Ecuaciones Lineales
Damas chinas (Mzelle Laure)
Tarea 1 Nombre: Maximiliano Orozco Castro Matemáticas para gastronomía.
Algoritmo Genético para la solución del problema SAT René Clemente Juárez Angel Felipe Lara Valladares Junio 2012.
Números y Fracciones 1.Los números naturales y los enterosLos números naturales y los enteros 2.Números primosNúmeros primos 3.Máximo común divisor y mínimo.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) IV. IMPLANTACION DE ALGORITMOS.
Transcripción de la presentación:

Diseño y análisis de algoritmos Técnica de diseño “Dividir y Conquistar”

Temario Técnica de diseño “Dividir y Conquistar” Introducción Esquema genérico Aplicaciones Multiplicación de enteros grandes

Técnica de diseño “dividir y conquistar” Introducción Idea: es una técnica de diseño de algoritmos que consiste en Descomponer la instancia del problema a resolver en un cierto número de subinstancias más pequeños del MISMO PROBLEMA; Resolver independientemente cada una de estas subinstancias; Combinar las soluciones obtenidas para construir la solución de la instancia del problema original Generalmente resulta un algoritmo más eficiente que el original Aplicaciones, entre otras: Búsqueda binaria Merge sort (ya pasado) Clasificación de Hoare (quicksort) Selección y búsqueda de la mediana Aplicaciones, entre otras: Multiplicación de enteros grandes Multiplicación de matrices Introducción a la criptografía Itinerarios (ej:calendario campeonato)

Técnica de diseño “dividir y conquistar” Esquema genérico function dividir_y_conquistar(X: tx) devuelve ty VAR X1, X2 ...... Xk :tx; /*var tipo tx*/ Y1, Y2 ...... Yk :ty; If X es suficientemente simple o pequeño then return( algoritmoBasico(X)) else begin descomponer X en X1, X2 ...... Xk; for (i=1; i < k; i++) do Yi = dividir_y_conquistar( Xi); rocomponer los Yi para obtener una solución Y a X return(Y) end End;

Técnica de diseño “dividir y conquistar” Esquema genérico Es importante , determinar para cada problema: Cuáles son las subinstancias y cómo se encuentran. Es decir, la descomposición. Cómo resolver el problema en las subinstancias. Es decir, el algoritmo Básico Cómo combinar las soluciones parciales Del esquema básico se puede apreciar que el diseño es de una función recursiva y su criterio de parada sucede cuando una subinstancia llega a tener un tamaño suficientemente pequeño para ser resuelta inmediatamente. Este tamaño se puede denominar umbral .

Técnica de diseño “dividir y conquistar” Esquema genérico, análisis del tiempo de ejecución El tiempo de ejecución está dado por la recurrencia: Si n es suficientemente pequeño o Donde ,b es una constate tal que n/b se aproxima al tamaño de las subinstancias f(n) es el tiempo del algoritmoBásico(), y g(n) es el tiempo de la partición y la Recombinación. Para que la estrategia sea eficiente las subinstancias deben ser todas de aproximadamente el mismo tamaño. Además se debe estudiar cuidadosamente cuales son los mejores umbrales. Para calcular la complejidad de estos casos se puede usar el teorema “maestro” de las recurrencias:

Técnica de diseño “dividir y conquistar” Esquema genérico, análisis del tiempo de ejecución Teorema: sean a>=1, b > 1 constantes, f(n) una función y T(n) una recurrencia definida sobre sobre los los enteros no negativos de la forma donde n/b puede considerarse una división entera. Entonces valen: Si para algún entonces Si entonces Si para algún ,y satisface para alguna positiva, entonces Ejemplos: Si entonces a=9, b=3, se aplica el caso 1 con y Si entonces a=1, b=3/2, se aplica el caso 2 y Si entonces a = 3, b= 4, y ,con c=3/4, por lo que se aplica el caso 3 y

Técnica de diseño “dividir y conquistar” Esquema genérico, análisis del tiempo de ejecución Determinación del umbral: Aunque la determinación del umbral no afecta el orden de complejidad de los algoritmos DyC, si afecta el tiempo efectivo de ejecución. Ejemplo: Entonces el algoritmo básico es de y seguún teorema maestro, regla 1, el orden de DyC es sin embargo, cambiando el umbral, se podría obtener los siguientes experimientos de tiempo medidos en microsegundos : n T DyC con T DyC con Algoritmo básico 5000 32000 42 seg 15 min 6 seg 2 min 25 seg 17 min

Técnica de diseño “dividir y conquistar” Esquema genérico, análisis del tiempo de ejecución Determinación del umbral: Es muy difícil, o a veces imposible, encontrar teóricamente un umbral óptimo, pues puede variar con el valor de n para el mismo problema. Puede pasar que el umbral óptimo puede cambiar de instancia en instancia y que dependa de de cada implementación en particular. Otra opción es usar un método empírico para aproximar un buen umbral, pero es poco práctico, pues se requiere aplicar el algoritmo varias veces y a una gran cantidad de instancias. Una opción mejor es un camino híbrido: se calcula la función teórica de la complejidad del algoritmo, dando valores a las constantes de acuerdo con pruebas empíricas. Luego se toma como un valor tal que tome aproximadamente el mismo tiempo el algoritmo básico y el DyC. Correctitud: Esta se demuestra a través de comprobar la correctitud el algoritmo básico. Luego se debe aplicar inducción sobre el tamaño de la instancia.

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Problema: Supongamos que tenemos que multiplicar dos enteros a y b de n y m dígitos , cantidades que no son posibles de representar directamente en ele hardware de la máquina.(recordar que si pueden operarse directamente por la máquina se considera cun orden constante) Es fácil implementar una estructura de datos para estos enteros grandes que soporte la suma , resta y productos y divisiones por potencias de la base en tiempo Si se quiere mutiplicar por cualquier número, entonces habrá que implementar un algoritmo tradicional, que tiene una complejidad La idea es aplicar la técnica dividir y conquistar para tratar de mejorar el tiempo. Supongamos por un momento que m=n.

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Problema: Aplicando DyC una vez , y usando base 10 se tiene: a x y b w z Esto es: Si se extiende el método aplicando DyC recursivamente se obtiene la recurrencia:

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Se puede calcular que : , puesto que se requieren 4 llamadas recursivas con productos con dígitos más pequeños, por lo que el orden es similar a los algoritmos tradicionales. Se puede mejorar tomando: Con lo que entonces: y Se tienen entonces dos productos de dígitos, y r un producto de a lo sumo dígitos, más sumas restas y productos por la potencia de la base (lineales).

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Si el tiempo del algoritmo base es : , y el de sobrecarga es g(n), entonces aplicando DyC una sóla vez se obtiene: que comparado con es una mejora del 25% en la constante del término principal, paero aún así se mantiene en un orden Para obtener una mejora significativa, es necesario aplicar reiteradamente DyC a los productos más pequeños. La rrecurrencia generada por el algoritmo es :

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Se puede calcular que : , puesto que se requieren 3 llamadas recursivas con productos con dígitos más pequeños, por lo que el orden es mejor que a los algoritmos tradicionales. Falta calcular con un tamaño “suficientemente pequeño” para que convenga aplicar el algoritmo básico. Aquí es lógico usar un tamaño que corresponda con el de la representación del hardware, con lo que el algoritmo básico será de un oren menor al de DyC . A continuación el algoritmo en pseudocódigo.

Técnica de diseño “dividir y conquistar” Multiplicación de enteros grandes Truco: calcular xw, xz+yw , yz haciendo menos de cuatro multiplicaciones. Por álgebra: r = (x + y) (w + z) = xw + (xz+yw)+ yz enterogrande function mult2(enterogrande u,v) { int n, s; /*var enteras*/ enterogrande : w, x, y , z, r, p , q; n = máximo(tam(u),tam(v)); If n “es suficientemente pequeño” { return( u*v) /*multiplicación clásica*/ } else { s = n DIV 2; x = u DIV 10 ; y = u % 10 ; w = v DIV 10 ; z = v % 10 ; r = mult2(x+y,w+z); p = mult2(x,w); q = mult2(y,z); return(p*10 ) + (r – p – q )*10 + q s s s s s 2s