Analisis de Algoritmo y Complejidad Computacional

  • View
    569

  • Download
    1

Embed Size (px)

Transcript

ANALISIS DE ALGORITMO Y COMPLEJIDAD COMPUTACIONAL

The Game ChessCuantos granos de trigo son? si en cada cuadrado del tablero se dobla la cantidad anterior:

63

2i = 264 20 = 1,8*1019i=0

Teora de Algoritmos Anlisis y ComplejidadTeora Complejidad Computacional = El estudio de resolver problemas interesantes Medida de la cantidad de recursos necesarios: espacio tiempo

Sobre los algoritmos:

Polinomio es Bueno

--------- Entre ms pequeo mejor

Exponencial es malo --------- Entre ms pequeo mejor

Para que estudiar este Tema:Eficientes algoritmos llevan a eficientes programas Programas eficientes se venden mejor Programas eficientes hacen un mejor uso del hardware Programadores que escriben mejores programas son ms requeridos

Factores Influyen en la Eficiencia de Programas:Problema a resolver. Lenguaje de programacin. Compilador Hardware Habilidad del programador Eficacia del programador Algoritmo

Algoritmos CorregidosProblema a resolver. Lenguaje de programacin. Compilador Hardware Habilidad del programador Eficacia del programador Algoritmo

ResumenConfianza en los algoritmo desde las pruebas y pruebas corregidas Corregir algoritmos recursivos probar directamente por induccin Corregir algoritmos iterativos usando loop invariantes e induccin

CorreccionesConfianza en los algoritmo desde las pruebas y pruebas corregidas Corregir algoritmos recursivos probar directamente por induccin Corregir algoritmos iterativos usando loop invariantes e induccin

CorreccionesLgico Mtodo de Corregir Chequeando Testing Pruebas Corregidas

Testing versus Pruebas CorregidasTesting Prueba Corregida : Trata algoritmo son una entrada de ejemplo.

: Prueba matemticamente Puede no encontrar problemas : : Puede no encontrar problemas Usar test solo puede ser peligroso

Testing

Usar una combinacin de ambas es mejor

Correcciones de Algoritmos RecursivosPara probar correcciones de algoritmos recursivos:Probar por induccin el tamao del problema a ser resuelto.Base recursividad, es la base de la induccin Necesita probar que llamadas recursivas, no son infinitas recursividades Paso inductivo: Asumo que la recursividad llama correctamente, as pruebo que trabaja correctamente.

Nmero Recursivo FibonacciNmero Fibonacci:F0 = 0 F1 = 1 y para todo 2 n, Fn = Fn-2 + Fn-1 function fib(n) comment return Fn If n 1 then return(n) else return(fib(n-1) + fib(n-2))

Reivindica: Para todo n 0, fib(n) return FnBase : Para n = 0, fib(n) retorna 0, est reivindicado Para n = 1, fib(n) retorna 1, est reivindicado Induccin: Supuesto que n 2, y para todo 0 m n, fib(m) retorna Fm Supuesto fin(n) retorna Fn As : fib(n) = fib(n-1) + fib(n-2)

FibonacciInt fibonacci(int n) { if ((n==0) II (n==1)) return n; else return fibonacci(n-1) + fibonacci(n-2); }

T(n) = T(n) =

O(1) T(n-1) + T(n-2) + 1

si 1 si n > 1

AnlisisLa operacin bsica que se hace es la suma, se define C(n) como la cantidad de sumas necesarias para calcular fibonacci(n). Si a C(0),C(1),,(Cn) es claro que C0 = 0 y C1 = 0 y para n 2, es Cn = Cn-1 + Cn-2 + 1 Su generatriz es: C(z) = CnZn no

noCnZn = n2(Cn-1 + Cn-2 + 1)Z

n

noCnZn = n2(Cn-1 + Cn-2 + 1)Z

n

Transformando generatrices a otras conocidas. Primero se separa en tres sumatorias.

Luego se ajustan los ndices

Se sacan factores

Como C0 = 0, entonces

, sumando y restando 1 + Z

Ahora como

y

resulta que

Simplificando Las races del polinomio Siendo son comnmente conocido como razn aurea y su conjugado

Por lo que se puede factorizar

Aplicando la propiedad

se llega a

Por lo que llegamos a que

Lo que descomponemos en

igualando coeficientes resulta que

operando sistemas de ecuaciones

Los valores son:

Por lo que la funcin generatriz queda:

Extrayendo coeficientes:

Como el mdulo de

es inferior a uno asintticamente se comporta

As, se concluye que, fibonacci es de orden:

O(

ANALISIS DE ALGORITMO

Implementando Algoritmos

Gran O(h)

Definicin:f(n) es del orden de g(n), f(n) = O(g(n)), si existe c, no R+ tal que ara todo n no, f(n) cg(n)

Ejemplo:log(n) es O(n) Reivindica: Para todo n 1, log(n) n.

Se prueba por induccin:La reivindicacin es trivial para n=1. dado que log(1) = 0 < 1. Ahora se supone cierto para n 1 y log(n) n. Entonces: log(n+1) log(2n) = logn +1 n+1

(por hiptesis de induccin)

Gran (h)

Definicin:f(n) es del orden de g(n), f(n) = (g(n)), si existe c > 0, tales que son muchos infinitamente n N tal que, f(n) cg(n)

Gran (h)

Definicin:f(n) es del orden de g(n), f(n) = (g(n)), si existe c,n0 R+> 0, tales que para todo n n0, f(n) cg(n)

Es esta una DiferenciaSi f(n) = (g(n)), f(n) = (g(n)) la inversa no es cierta. Por ejemplo.

Gran (h)

Definicin:f(n) es (g(n)), s y solo s f(n) es O(g(n)) y f(n) es (g(n))

Sumando O(h)Si f1(n) es O(g1(n)) y f2(n) es O(g2(n)) f1(n) + f2(n) es O(g1(n) + g2(n))

Multiplicando O(h)Si f1(n) es O(g1(n)) y f2(n) es O(g2(n)) f1(n) f2(n) es O(g1(n)*g2(n))

Tipo de AnlisisPeor Caso: El tiempo que toma en el peor caso posible. Es el mximo T(n) sobre una entrada de tamao n. Caso Promedio: Es la expectativa de tiempo corriendo, dada alguna probabilidad o distribucin de tiempo (usualmente uniforme). T(n) es el tiempo que toma sobre toda entrada de tamao n en promedio. Caso Probabilstico: Es la expectativa de tiempo que corre sobre una rango de entradas posibles. Caso Amortizado: El tiempo de corrida pata una serie de ejecuciones, dividida por el nmero de ejecuciones.

Complejidad TiempoAnalizando los tiempos en el peor caso: asignacin procedimiento entrada procedimiento salida si el test hay dos ramas loop O(1) O(1) O(1) O(mximo de las dos ramas) suma sobre todas las iteraciones del tiempo de cada iteracin.

Multiplicacinfunction multiply(y,z) comment Return yz, donde y,z IN 1. x:= 0; 2. while z>0 do 3. if z is odd then x:= x + y; 4. y:=2y; z:=(z/2); 5. return(x) Supuesto y y z tienen n bits. procedimiento de entrada y salida costo O(1) veces lineas 3,4 costo O(1) cada vez el while loop sobre lmeas 2-4 costos O(n) veces (es ejecutada a lo ms n veces) lnea 1 costos O(1) veces

Entonces, la multiplicacin toma O(n) veces

Bubblesort1. procudere bubblesort(A[1..n]) 2. for i:=1 to n-1 do 3. for j:=0 to n-i do 4. if A[j] > A[j+1] then 5. Swap A[j] with A[j+1] procedimiento de entrada y salida costo O(1) veces lnea 5costo O(1) cada vez el if de la sentencia de lneas 4-5 costosO(1) El for-loop sobre lneas 3-5 costos O(n-i) veces El for-loop sobre lneas 2-5 costos O( ) El bubblesort toma tiempo de O(n2) en el peor caso.

Anlisis de Algoritmos Iterativos (no recursivos)El Heap: Una implementacin de prioridad de la cola Tiempo de insercin Tiempo de borrado Heapsort Construir un Heap Deshacer un Heap Anlisis peor caso Como construir un Heap en O(nlog(n)) O(nlog(n)) O(nlog(n)) O(n) O(log(n)) O(log(n))

HeapEl Heap: es una popular implementacin. Un heap es un rbol binario con los datos cargados en los nodos, Tiene dos importantes propiedades.1. Balance. Completar el rbol binario sin prdida de hojas, en los ltimos niveles del lado izquierdo.

2. El valor de las hoja del padre es menor que el valor de las hojas del hijo.

Borrar el MnimoBorrarlo de la raz, y devolver el valor.

Pero lo que se tiene ya no es un rbol!!!

Reemplazar la raz por la ltima hoja.

Pero se viola la condicin de la estructura!!!

Reemplazar la raz por la ltima hoja.

Pero se viola la condicin de la estructura!!!

Repetidamente cambiar el elemento hijo ms pequeo.

Como esto TrabajaPor qu el intercambio del nuevo nodo es el hijo ms pequeo?

o

Supuesto b c y a no est en el lugar correcto. Esto es a>b o a>c . En este caso b c, nosotros sabemos que a > b.

o

Lo que lleva a:

o

respectivamente. Si b es ms pequeo que sus hijos? Si, porque b < c y b c.

Si b es ms pequeo que sus hijos? Si, porque b < c y b c. C es el ms pequeo de estos hijos? Si, porque se verific antes. Es a ms pequeo que stos hijos? No necesariamente, as puede continuar intercambindose y bajando por el rbol. El sub rbol de c, tiene la condicin de estructura? Si, dado que esto no ha cambiado.

Insertar un nuevo Elemento

Preservando balance

Implementando un HeapUn heap de n nodos usados en un arreglo A[1..n]* La raz est cargada con A[1] * Los hijos a la izquierda de un nodo en A[i] est cargada en nodo A[2i] * Los hijos a la derecha de un nodo A[i] est cargada en nodo A[2i+1]

Implementando un HeapUn heap de n nodos usados en un arreglo A[1..n]* La raz est cargada con A[1] * Los hijos a la izquierda de un nodo en A[i] est cargada en nodo A[2i] * Los hijos a la derecha de un nodo A[i] est cargada en nodo A[2i+1]

Borrar el Mnimo Remover raz Reemplazar raz Swaps O(1) O(1) O(l(n))

Donde l(n) es el nmero de niveles en n-nodo heap.

InsertarPoner una hoja Swaps O(1) O(l(n))

Anlisis de l(n) Un rbol binario completo con k niveles, tiene exactamente 2k-1 nodos. Entonces con k niveles tiene no menos 2k-1 y no ms que 2k-1 .

Entonces en un heap con k niveles y n nodos:

ResumenAnlisis de algoritmos recursivos: * relacin de recurrencia * como deriva * como se soluciona

Derivando la Relacin de RecurrenciaPara encontrar la relacin de recurrencia corriendo veces a un algoritmo: * n es el tamao del problema * ver que valor de n es usado sobre la base recursividad * Ver el valor de T(no), usualmente una constante * Usua