Divide y Venceras

Embed Size (px)

Citation preview

Algortmica III Divide y Vencers Docente: Carlos A. Ruiz De La Cruz Melo Correo: [email protected] 2 Divide y Vencers Divideyvencersesunatcnicaparadisear algoritmos que consiste en: Descomponer el casoque haya que resolveren unciertonmerodesub-casosmspequeos del mismo problema. Resolverdemanerasucesivaeindependiente cada uno de estos sub-casos. Combinarlassolucionesobtenidasdeesta manera para obtener la solucin original. 3 Caso General Consideremosunproblema arbitrario,yseacasounalgoritmo sencillocapazderesolverel problema. Se le llama sub-algoritmo bsico. 4 Caso General algoritmoDivVen(x): tipo de dato Si (x suficientemente pequeo o sencillo) entonces retornar caso(x) finsi //Descomponer x en casos ms pequeos x1,x2,.. xk para i 1 hasta k hacer Yi DivVen(xi) finpara //Recombinar los Yi para obtener Y de x para i 1 hasta k hacer Y Y + Yi finpara retornar Y finalgoritmo Algunosalgoritmosdedividey vencersnosiguenexactamenteeste esquema: por ejemplo, puede necesitar queelprimersubcasoestresuelto antes de formar el segundo subcaso. Elnmerodesub-ejemplaresn, sueleserpequeoe independiente del caso particular que haya que resolver. Dividir x en sub-ejemplares algoritmoDivVen(x): tipo de dato Si (x suficientemente pequeo o sencillo) entonces retornar caso(x) finsi //Descomponer x en casos ms pequeos x1,x2,.. xk para i 1 hasta k hacer Yi DivVen(xi) finpara //Recombinar los Yi para obtener Y de x para i 1 hasta k hacer Y Y + Yi finpara retornar Y finalgoritmo algoritmoDivVen(x): tipo de dato Si (x suficientemente pequeo o sencillo) entonces retornar caso(x) finsi //Descomponer x en casos ms pequeos x1,x2,.. xk para i 1 hasta k hacer Yi DivVen(xi) finpara //Recombinar los Yi para obtener Y de x para i 1 hasta k hacer Y Y + Yi finpara retornar Y finalgoritmo Determinacin del umbral dndecolocarelumbral?, estoes,cundoseconsideraque unsub-problemaes suficientementepequeocomo paranotenerquedividirlopara resolverlo Cuandon=1,notienemucho sentido descomponer x en un caso ms sencillo x1 Lamayoradealgoritmosdedividey vencerssontalesqueeltamaode losksub-casosesaproximadamente (n/k)paraalgunaconstantek,en dondeneseltamaodelcaso original. k sub-casos algoritmoDivVen(x): tipo de dato Si (x suficientemente pequeo o sencillo) entonces retornar caso(x) finsi //Descomponer x en casos ms pequeos x1,x2,.. xk para i 1 hasta k hacer Yi DivVen(xi) finpara //Recombinar los Yi para obtener Y de x para i 1 hasta k hacer Y Y + Yi finpara retornar Y finalgoritmo 8 Combinar las soluciones Eltiemponecesariopara combinar las soluciones de los sub-problemasparahallarla solucindeloriginal; normalmenteesO(nk).Por tanto el tiempo total es: Siemprequensea suficientemente grande. ) ( ) ( * ) (kn O k n t k n t + =algoritmoDivVen(x): tipo de dato Si (x suficientemente pequeo o sencillo) entonces retornar caso(x) finsi //Descomponer x en casos ms pequeos x1,x2,.. xk para i 1 hasta k hacer Yi DivVen(xi) finpara //Recombinar los Yi para obtener Y de x para i 1 hasta k hacer Y Y + Yi finpara retornar Y finalgoritmo 9 Justificacin del Divide y Vencers Para que se justifique divide yvencers se necesitan tres condiciones. Tienequeserposibledescomponerelcaso ensub-casosyrecomponerlassoluciones parciales de forma bastante eficiente. Lossub-casosdebenserenloposible aproximadamente del mismo tamao. La decisin de utilizar el sub-algoritmo bsico enlugardehacerllamadasrecursivasdebe tomarse cuidadosamente. Eficienciade Divide y Vencers Laeficienciadeestatcnicadependedecmoseresuelvanlos sub-casos. Esquema de la Tcnica de Divide y Vencers Divisin. Divideelproblemaoriginalenksub-problemas de menor tamao Conquistar. Estossub-problemasseresuelvenindependientemente: Directamente si son simples Reduciendoacasosmssimples (tpicamente de forma recursiva) Combinar.Secombinansussolucionesparcialespara obtener la solucin del problema original. 12 Recursin Larecursinpermitedefinirunobjeto (problemas,estructurasdedatos)en trminos de s mismo. Un procedimiento recursivo debe tener: Uncriteriollamadocriteriobsico, por el que el mtodo no se llame a s mismo,sinoquellegueauna solucin directa. Cadavezqueelmtodosellamea smismo(directaoindirectamente), debeestarmscercadelcriterio base. 13 Tipos de Recursin Recursin Directa: El subprograma se llama directamente a s mismo. LlamadaaP Sub ProgramaP 14 Tipos de Recursin Recursin Indirecta Elsubprogramallamaaotro subprograma,ysteasuvezllamaal primero de lo contrario a un tercero. Llamada a Q Llamada a V Sub Programa P Sub Programa Q Sub Programa V Llamada a Q Llamada a P Sub Programa P Sub Programa Q 15 Propiedades de la Recursin Unprocedimientorecursivocon criteriobaseyaproximacin constante a este criterio base, se dice que est bien definido. Sediceprofundidadrecursivaal nmerodevecesquesellama recursivamente un subprograma. La representacin en forma grfica se puederealizarpormediodeunrbol recursivo. 16 Funcionamiento Interno de la Recursin Cuandounprogramallamaaun subprograma,debeguardarsevarios elementos: Debe guardarse los valores de los parmetrosdelsubprogramaque llama;parapoderencontrarlos despusqueretornaelcontrola este subprograma. Debeguardarseladireccindela instruccin que se debe ejecutar a continuacindelsubprograma llamado,pararetornarelcontrola esta instruccin. 17 Funcionamiento Interno de la Recursin Pila Es una lista de elementos a la cual se le puede insertar o eliminar elementos, slo por uno de sus extremos. (LIFO) Internamenteseutilizaunaestructura tipopila,queguardarunacopiadelos valoresdevariablesyconstantes locales del subprograma que efecta la llamada. Adems, se guarda una referencia a la siguiente instruccin a ejecutar. Proceso 18 Funcionamiento Interno de la Recursin Seprocedeaejecutarlas instruccionesdelsubprograma llamado. Concluidalaejecucindel subprogramallamado,se recuperalacopiadelosvalores del tope de la pila. Seretornaelcontrolala direccindelasiguiente instruccinaejecutar,para continuar operando. Estoserepitehastaquelapila est vaca. Proceso funcinm(3) funcin m(2) funcin m(1)

m(1) m(2) m(3) P I L A Exponenciacin Unejemplomssencillodelatcnicadividey vencersquenodejadeserinteresanteesun algoritmoquecalculalapotenciaan.paraun enteroa yunnaturaln.Laversinmsingenua de dicho algoritmo es la siguiente: Algoritmo potencia(a, n)resu 1 para x 1 hastanhacer resu resu * a finpara retornarresu fincnumero resu= an Exponenciacin Sibienelcostodeuna multiplicacinvara considerablementeconel tamaodelosnmerosa multiplicar,concentremospor ahoralaatencinencontarel nmerodemultiplicaciones querealizaestealgoritmoen funcindensinpreocuparnos poreltamaodelosnmeros a multiplicar. Evidentementeelnmerode multiplicaciones es n. Estealgoritmorequiereun tiempo que est en u(n). Algoritmo potencia(a, n) : entero resu 1 para x 1 hastanhacer resu resu * a finpara retornarresu fincnumero Escribiendo de otra manera Exponenciacin Sepuedehaceralgomejor?S, utilizandolatcnicadedividey vencersyobservandoquepara n par an = (a n /2) 2. Esto nos permite escribir la funcin anterior de otra manera: Algoritmo potencia2(a, n) : entero si n=0 entonces resu 1 sinosi n es par entonces resupotencia2(a, n/2) resu resu * resu sino resua* potencia2(a, n-1) finsi finsi retornarresu Fincnumero Exponenciacin Algoritmo potencia2(a, n) : entero si n=0 entonces resu 1 sinosi n es par entonces resupotencia2(a, n/2) resu resu * resu sino resua* potencia2(a, n-1) finsi finsi retornarresu Fincnumero SeaN(n)elnmerodemultiplicaciones realizadasporestealgoritmoparaelexponente n.

Sinespar,N(n)=N(n/2)+1.staesuna recurrenciadivideyvencerscona=1,b=2y k= 0. Porello,a=bkyN(n)eu(logn)paran mltiplo de 2. Se puede comprobar que el mismo resultado se obtiene para los dems ns. Exponenciacin Comparado con el mtodo original de multiplicar x por s mismo nveces, este algoritmo slo utiliza O(log n) multiplicacionesyaceleraelclculodean tremendamente; ms o menos de la misma forma que elalgoritmodelamultiplicacinacelerauna multiplicacinsobreelmtodomslentoderealizar una suma repetida. Algoritmo potencia2(a, n) : entero si n=0 entonces resu 1 sinosi n es par entonces resupotencia2(a, n/2) resu resu * resu sino resua* potencia2(a, n-1) finsi finsi retornarresu Fincnumero Multiplicacinde nmeros grandes Comoafirmamosrecin,noeslomismo multiplicarnmerospequeosque nmerosgrandes.Repasemosconun ejemploelalgoritmodemultiplicacin usual: 3476 1593 10428 31284 17380 3476 5537268 Multiplicacinde nmeros grandes 3476 1593 10428 31284 17380 3476 5537268 Porcadadgitode1593escribimosun trmino a sumar. Paraelcmputodecadatermino, debemos recorrer los dgitos de 3476. Seanelnmerodedgitosdelos nmerosamultiplicar(asumiendoque losfactorestienenaproximadamenteel mismo nmero de dgitos). Elcmputodelasnlneasinsume tiempou(n2),ylasumadelosn trminostambin.seeselordendel algoritmo usual de multiplicacin. Aplicando Divide y Venceras Separemos cada factor en dos mitades: el primero en 34 y 76, y el segundo en 15 y 93: 34 * 15 = 510 000034 * 93 = 3162 00 76 * 15 = 1140 00 76 * 93 = 70 68 5537268 Esta es una manera correcta de multiplicar dado que 3476 = 102*34 + 76 y 1593 =102*15 + 93, luego 3476*1593 = 104 * (34*15) + 102* (34* 93 + 76*15) + 76*93. Engeneralqueremosmultiplicar2nmerosa ybden dgitosdecimales.Asumimosporsimplicidadquenes par. Elmtodoqueestamosconsiderandodescomponeay b: a = 10 n/2 w +x y b = 10 n/2 y +z. Luego, a *b = 10 n wy +10 n/2(wz +xy)+xz. Esdecir,pararealizarunamultiplicacinentrenmeros de longitud decimal n se realizan 4 multiplicaciones entre nmerosdelongituddecimaln/2,ademsde3sumas de nmeros de longitud decimal n ymultiplicaciones por potencias de 10, que no son verdaderas multiplicaciones sinoslodesplazamientoshacialaizquierda,o equivalentemente,elsimpleagregadode0sala derecha Aplicando Divide y Venceras 34 * 15 = 510 0000 34 * 93 =3162 00 76 * 15 =1140 00 76 * 93 = 7068 5537268 Valedecirquesereduceelproblemade realizarunamultiplicacinentrenmerosde longitud n al de realizar 4 multiplicaciones entre nmerosdelongitudn/2msciertas operaciones(sumas,shifts)quesondeorden u(n). Paraanalizarestealgoritmo,consideramosla recurrencia resultante: Aplicando Divide y Venceras t(n) = 4t(n/2) + u(n) Como 4 > 21, resulta que t(n)eu (nlog 24) = u(n2). Es decir,nohemosganadonadasobreelalgoritmo original, el que todos utilizamos en la prctica. 34 * 15 = 510 34 * 93 =3162 76 * 15 =1140 76 * 93 = 7068 5537268 Sinembargo,steesfcildemejorar. Llamemos p = wy, q = xz y r = (w+x)(y+z). Con slo 3 multiplicaciones entre nmeros de longitud n/2 (o n/2+1 en el ltimo caso) obtenemos p, q y r. Observemos adems que r resulta igual ar = wy +wz +xy +xz =p+wz +xy +q. Porello,a*b=10np+10n/2(rpq)+q,es decir,3multiplicacionesyvariassumasy restas.Larecurrenciaasociadaaeste algoritmo es: Aplicando Divide y Venceras t(n) = 3t(n/2) + u(n) 34 * 15 = 510 34 * 93 =3162 76 * 15 =1140 76 * 93 = 7068 5537268 Aplicando Divide y Venceras Como an tenemos 3 > 21, resulta que t(n) eu(nlog 23 ). Esto es t(n) eO(n1.6 ) y t(n)e O (n1.5). Es decir, este algoritmo es significativamente mejor que el que utilizamos en la prctica. t(n) = 3t(n/2) + u(n) 34 * 15 = 510 34 * 93 =3162 76 * 15 =1140 76 * 93 = 7068 5537268 Factoriales El factorial de un nmero entero positivo n se define como el producto de los nmeros comprendidos entre 1 y n. La expresinn!simboliza el factorial de n. > ==1 )! 1 ( *1 1) (n n nnn fMtodo factorial(nvalor) si (nvalor 1) entonces retornar 1// estado bsico sino retornar nvalor*factorial(nvalor-1) fsi finfactorial Factoriales Mtodo factorial(nvalor) si (nvalor 1) entonces retornar 1// estado bsico sino retornar nvalor*factorial(nvalor-1) fsi finfactorial Para las primeras instrucciones cuando nValor es 1 0 tenemos O(1) Para la llamada recursiva tenemos T(n) = 1 + T(n-1)paranValor > 1 ... (A) Si suponemos quen = n-1 en (A) T(n-1) = 1 + T(n-2)....(B) Remplazando lo anterior en (A): T(n) = 1 +1 + T(n-2) = 2 + T(n-2) .... (C) Por tanto tenemos:T(n) = 2 + T(n-2) paranValor > 2 ...(C)Factoriales Mtodo factorial() si (nvalor 1) entonces retornar 1// estado bsico sino retornar nvalor*factorial(nvalor-1) fsi finfactorial Si suponemos quen = n-2 en (A) T(n-2) = 1 + T(n-3)... (D) Remplazando lo anterior en (C): T(n) = 2 +1 + T(n-3) = 3 + T(n-3) ... (D) En la siguiente llamada tenemos: T(n) =3 + T(n-3) paranValor > 3 ... (D) Por tanto en la penltima llamada tenemos: T(n) = (n-1) + T(1) Con lo cual T(n) = n 1 +1 = n Concluyendo con O(n) PASO N PILA RETORNO PROX. 0 4 41 4 4*, 32 3 4*,3*, 23 2 4*,3*,2*, 14 1 4*,3*,2*,1*, 05 0 4*,3*,2*,1*, 1 16 1 4*,3*,2*, 1(1*1) 27 2 4*,3*, 2(2*1) 38 3 4*, 6(3*2) 49 4 24(4*6)Funcionamiento Interno de la Recursin Calculo recursivo del Factorial(n=4) Fibonacci La determuinacin de la serie Fibonacci: 0, 1 ,1, 2, 3, 5, 8, 13, 21 ....se obtiene de la suma de los dos nmeros anteriores. Es decir: Fibonacci(0) = 0 Fibonacci(1) = 1 Fibonacci(2) = Fibonacci(1) + Fibonacci(0) = 1 + 0 = 1 Fibonacci(3) = Fibonacci(2) + Fibonacci(1) = 1 + 1 = 2 Fibonacci(4) = Fibonacci(3) + Fibonacci(2) = 2 + 1 = 3 Fibonacci(5) = Fibonacci(4) + Fibonacci(3) = 3 + 2 =algoritmoFibona(n) Si ((n = 0)v (n = 1)) Entonces Retornarn sino RetornarFibona(n-1)+Fibona(n-2) fSi fMetodoFibonacci anlisis Sea T(1) para el control del bucle. Sea de un tiempo T(n-1) para la primera llamada recursiva SeadeuntiempoT(n-2)paralasegundallamada recursiva Entonces: T(n) = 1 + T(n-1) + T(n-2) Tomando n-1 en vez de n:T(n-1) = 1 + T(n-2) + T(n-3) Tomando n-2 en vez de n:T(n-2) = 1 + T(n-3) + T(n-4) Por tanto en el ltimo ciclo :T(2) = 1 + T(1) + T(0) algoritmoFibona(n) Si ((n = 0)v (n = 1)) Entonces Retornarn sino RetornarFibona(n-1)+Fibona(n-2) fSi fMetodoFibonacci anlisis algoritmoFibona(n) Si ((n = 0)v (n = 1)) Entonces Retornarn sino RetornarFibona(n-1)+Fibona(n-2) fSi fMetodo T(n) = (n-1) + T(n-2) + T(n-3) + T(n-4) + . + T(1) + T(0) T(n) = n + {T(n-2) + T(n-3) + T(n-4) + . + T(1) } T(n) = n + n*T(n) = n + n2 Por tanto O(n2 ) Sumandoaambosladosdelas ecuaciones se tiene: PASO N PILA FIBONACI PROX0 4 41 4 Fibo(2)+, 32 3 Fibo(2)+,Fibo(1)+, 23 2 Fibo(2)+,Fibo(1)+,Fibo(0)+, 14 1 Fibo(2)+,Fibo(1)+,Fibo(0)+, 1 25 2 Fibo(2)+,Fibo(1)+,Fibo(0)+, 1 06 0 Fibo(2)+,Fibo(1)+, 0 27 2 Fibo(2)+,Fibo(1)+, 1(1+0) 38 3 Fibo(2)+,Fibo(1)+, 1 19 1 Fibo(2)+, 1 310 3 Fibo(2)+, 2(1+1) 411 4 Fibo(2)+, 2 212 2 Fibo(0)+, 113 1 Fibo(0)+, 1 214 2 Fibo(0)+, 1 015 0 0 216 2 1(1+0) 417 4 3(2+1)Funcionamiento Interno de la Recursin Calculo recursivo del Fibonacci(n=4) 39 El problema de Torres de Hanoi Tenemos 3 torres y N discos de diferentes tamaos; cada uno con una perforacin en el centro que le permite deslizarse por las torres. Inicialmente los N discos estn ordenados de mayor a menor en la primera de las torres. Sedebepasarlosdiscosaotratorreenel mismo orden, utilizando la tercera torre como auxiliar. En cada movimiento slo se puede mover un discoynopuedequedarunodemayor tamao sobre uno menor tamao.A ABCB C A: Origen B: Destino C:Auxiliar El problema de Torres de Hanoi algoritmohanoi (n, A, B, C) si (n = 1) entoncesescribir(mover disco de A a B) sinohanoi(n-1, A, C, B) escribir(mover disco de A a B) hanoi( n-1, C, B, A) finhanoi A ABCB C A: Origen B: Destino C:Auxiliar 41 El problema de Torres de Hanoi Concluimosquerbolrecursivonos permitecalcularenfuncindel#de hojas, cuantas llamadas recursivas se dan: 2n - 1 rbolrecursivodeTorresdeHanoi para n = 3H(3,1,2,3)H(2,3,2,1)H(1,1,2,1)H(2,1,3,2)H(1,1,2,3)H(1,3,1,2)H(1,2,3,1)1-22-32-3 1-23-13-21-242 Conclusiones Divideyvencersesadecuadopara reducirunproblemaavarioscasosms pequeos de si mismo Larecursinesadecuadaparalasolucin queconsisteenhacersucesivasllamadas a si mismo. Estosmtodosdebentenerunareglade detencin que indique que el problema est terminado. Estosmtodosnodamayorrapidez,ni ahorra espacio de memoria; pero elcdigo esmascompactoyenciertoscasosms fcil de aprender. LABORATORIO Realicelossiguienteprogramasdeformarecursivausandola tcnica dyv e implemntelo en java o C++. 1. SetieneunarregloAdeenteros,detamaoN>0,connmerosenteros positivosynegativos.RealiceunalgoritmoDyVqueencuentreelmenor nmero entero que se encuentre en este arreglo y retorne su posicin, en caso no existir retorne -1. Muestre su analisis. 2. SetieneunarregloAdeenteros,detamaoN>0,ordenado ascendentemente.RealiceunalgoritmoDyVqueencuentreunndicei talque:1