Вы находитесь на странице: 1из 10

Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

SESIN

5
Tcnicas de Diseo de Algoritmos. Parte I

I. OBJETIVOS
Definir las tcnicas de diseo de algoritmos
Valorar los mtodos de fuerza bruta, recursividad, divide y vencers.

II. TEMAS A TRATAR


Mtodo de Fuerza Bruta
Recursividad
Divide y Vencers

III. MARCO TERICO

1. Mtodo de Fuerza Bruta

La bsqueda por fuerza bruta, bsqueda combinatoria, bsqueda exhaustiva o


simplemente fuerza bruta, es una tcnica trivial pero a menudo usada, que consiste en
enumerar sistemticamente todos los posibles candidatos para la solucin de un
problema, con el fin de chequear si dicho candidato satisface la solucin al mismo.

Por ejemplo, un algoritmo de fuerza bruta para encontrar el divisor de un numero natural
n consistira en enumerar todos los enteros desde 1 hasta n, chequeando si cada uno de
ellos divide n sin generar resto. Otro ejemplo de bsqueda por fuerza bruta, en este caso
para solucionar el problema de las ocho reinas (posicionar ocho reinas en el tablero de
ajedrez de forma que ninguna de ellas ataque al resto), consistira en examinar todas las
combinaciones de posicin para las 8 reinas (en total 64! /56! = 178.462.987.637.760
posiciones diferentes), comprobando en cada una de ellas si las reinas se atacan
mutuamente.

La bsqueda por fuerza bruta es sencilla de implementar y, siempre que exista, encuentra
una solucin. Sin embargo, su coste de ejecucin es proporcional al nmero de
soluciones candidatas, el cual es exponencialmente proporcional al tamao del problema.
Por el contrario, la bsqueda por fuerza bruta se usa habitualmente cuando el nmero de
soluciones candidatas no es elevado, o bien cuando este puede reducirse previamente
usando algn otro mtodo heurstico.

Es un mtodo utilizado tambin cuando es ms importante una implementacin sencilla


que una mayor rapidez. Este puede ser el caso en aplicaciones crticas donde cualquier
error en el algoritmo puede acarrear serias consecuencias, o tambin en aplicaciones
destinadas a demostrar teoremas matemticos. Este algoritmo es usado como mtodo
base para mediciones de rendimiento de otros algoritmos o meta heursticas.

1
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

La bsqueda por fuerza bruta no se debe confundir con backtracking, mtodo que
descarta un gran nmero de conjuntos de soluciones, sin enumerar explcitamente cada
una de las mismas.
Implementacin de la bsqueda por fuerza bruta
Algoritmo bsico
Para poder utilizar la bsqueda por fuerza bruta a un tipo especifico de problema, se
deben implementar las funciones primero, siguiente, valido, y mostrar. Todas recogern
el parmetro indicando una instancia en particular del problema:

1. primero (P): genera la primera solucin candidata para P.


2. siguiente (P, c): genera la siguiente solucin candidata para P despus de una solucin
candidata c.
3. valido (P, c): chequea si una solucin candidata c es una solucin correcta de P.
4. mostrar (P, c): informa que la solucin c es una solucin correcta de P.
La funcin siguiente debe indicar de alguna forma cuando no existen mas soluciones
candidatas para el problema P despus de la ltima. Una forma de realizar esto consiste
en devolver un valor "nulo". De esta misma forma, la funcin primero devolver un valor
"nulo" cuando no exista ninguna solucin candidata al problema P.
Usando tales funciones, la bsqueda por fuerza bruta se expresa mediante el siguiente
algoritmo:

Por ejemplo, para buscar los divisores de un entero n, la instancia del problema P es el
propio numero n. la llamada primero (n) devolver 1 siempre y cuando n1, y "nulo" en
otro caso; la funcin siguiente (n,c) debe devolver c + 1 si c<n , y "nulo" caso contrario;
vlido (n,c) devolver verdadero si y solo si c es un divisor de n.

Variaciones comunes en el algoritmo


El algoritmo descrito anteriormente llama a la funcin mostrar para cada solucin al
problema. Este puede ser fcilmente modificado de forma que termine una vez encuentre
la primera solucin, o bien despus de encontrar un determinado nmero de soluciones,
despus de probar con un numero especifico de soluciones candidatas, o despus de
haber consumido una cantidad fija de tiempo de CPU.

Explosin combinacional
La principal desventaja del mtodo de fuerza bruta es que, para la mayora de problemas
reales, el nmero de soluciones candidatas es prohibitivamente elevado.
Por ejemplo, para buscar los divisores de un numero n tal y como se describe
anteriormente, el numero de soluciones candidatas a probar ser de n. Por tanto, si n
consta de, digamos, 16 dgitos, la bsqueda requerir de al menos 1015 comparaciones
computacionales, tarea que puede tardar varios das en un ordenador personal tipo. Si n
es un bit de 64 dgitos, que aproximadamente puede tener hasta 19 dgitos decimales, la
bsqueda puede tardar del orden de 10 anos.

2
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

Este crecimiento exponencial en el nmero de candidatos, cuando crece el tamao del


problema ocurre en todo tipo de problemas. Por ejemplo, si buscamos una combinacin
particular de 10 elementos entonces tendremos que considerar 10! = 3,628,800
candidatos diferentes, lo cual en un PC habitual puede ser generado y probado en menos
de un segundo. Sin embargo, aadir un nico elemento mas lo cual supone solo un
10% ms en el tamao del problema multiplicara el nmero de candidatos 11 veces
lo que supone un 1000% de incremento. Para 20 elementos el nmero de candidatos
diferentes es 20!, es decir, aproximadamente 2.41018 o 2.4 millones de millones de
millones; la bsqueda podra tardar unos 10.000 anos. A este fenmeno no deseado se le
denomina explosin combinacional.

2. Recursividad

Recurrencia, Recursin o recursividad es la forma en la cual se especifica un proceso


basado en su propia definicin. Siendo un poco ms preciso, y para evitar el aparente
circulo sin fin en esta definicin:

Un problema que pueda ser definido en funcin de su tamao, sea este N, pueda ser
dividido en instancias ms pequeas (< N) del mismo problema y se conozca la solucin
explicita a las instancias ms simples, lo que se conoce como casos base, se puede aplicar
induccin sobre las llamadas ms pequeas y suponer que estas quedan resueltas.
Para que se entienda mejor a continuacin se exponen algunos ejemplos:
Factorial(x: Entero): Sea N := x el tamao del problema, podemos definir el
problema de forma recurrente como x*Factorial(x - 1); como el tamao de
Factorial(x - 1) es menor que N podemos aplicar induccin por lo que
disponemos del resultado. El caso base es el Factorial(0) que es 1.
Ordenacin por fusin(v: vector): Sea N := tamao(v), podemos separar el vector
en dos mitades. Estas dos mitades tienen tamao N/2 por lo que por induccin
podemos aplicar la ordenacin en estos dos subproblemas. Una vez que tenemos
ambas mitades ordenadas simplemente debemos fusionarlas. El caso base es
ordenar un vector de 0 elementos, que esta trivialmente ordenado y no hay que
hacer nada.

En estos ejemplos podemos observar como un problema se divide en varias (>=1)


instancias del mismo problema, pero de tamao menor gracias a lo cual se puede aplicar
induccin, llegando a un punto donde se conoce el resultado (el caso base).
Nota: aunque los trminos "recursin" y "recursividad" son ampliamente empleados en el
campo de la informtica, el trmino correcto en castellano es recurrencia. Sin embargo
este ltimo trmino es algo mas especifico.

Los nmeros naturales


Un ejemplo de conjunto definido de forma recurrente es el de los nmeros naturales:
a) 0 pertenece a N
b) Si n pertenece a N, entonces n+1 pertenece a N
c) Si X verifica a) y b) , entonces N est incluido en X
Los nmeros naturales es el conjunto de nmeros enteros no negativos.

3
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

Funciones definidas de forma recurrente


Aquellas funciones cuyo dominio puede ser recursivamente definido pueden ser
definidas de forma recurrente. El ejemplo ms conocido es la definicin recurrente de la
funcin factorial n!:

Con esta definicin veamos cmo funciona esta funcin para el valor del factorial de 3:
3! = 3 (3-1)!
= 3 2!
= 3 2 (2-1)!
= 3 2 1!
= 3 2 1 (1-1)!
= 3 2 1 0!
=3211
=6

Algoritmo recursivo
Un mtodo usual de simplificacin de un problema complejo es la divisin de este en
subproblemas del mismo tipo. Esta tcnica de programacin se conoce como divide y
vencers y es el ncleo en el diseo de numerosos algoritmos de gran importancia, as
como tambin es parte fundamental de la programacin dinmica.

El ejemplo del clculo recursivo del factorial de un nmero llevado al campo de la


programacin, en este ejemplo C++:

int factorial(int x)
{
if (x > -1 && x < 2) return 1; // Cuando -1 < x < 2 devolvemos 1
// puesto que 0! = 1 y 1! = 1
else if (x < 0) return 0; // Error no existe factorial de
// nmeros negativos
return x * factorial(x - 1); // Si x >= 2 devolvemos el producto
// de x por el factorial de x - 1
}

El seguimiento de la recursividad programada es casi exactamente igual al ejemplo antes


dado, para intentar ayudar a que se entienda mejor se ha acompaado con muchas
explicaciones que diferencia los distintos sub-procesos de la recursividad.

X = 3 //Queremos 3!, por lo tanto X inicial es 3


X >= 2 -> return 3*factorial(2);
X = 2 //Ahora estamos solicitando el factorial de 2
X >= 2 -> return 2*factorial(1);
X = 1 // Ahora estamos solicitando el factorial de 1
X < 2 -> return 1;
[En este punto tenemos el factorial de 1 por lo que volvemos marcha atrs resolviendo todos los
resultados]
return 2 [es decir: return 2*1 = return 2*factorial(1)]
return 6 [es decir: return 3*2 = return 3*factorial(2)*factorial(1)] //
El resultado devuelto es 6

4
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

Ejemplos de recurrencias
Factoria l -- n! = n (n-1)!
Sucesion de Fibonacc i -- f(n) = f(n-1) + f(n-2)
Numeros de Catalan -- C(2n, n)/(n+1)
Las Torres de Hanoi
Funcion de Ackermann

3. Divide y Vencers

En la cultura popular, divide y vencers hace referencia a un refrn que implica resolver
un problema difcil, dividindolo en partes mas simples tantas veces como sea necesario,
hasta que la resolucin de las partes se torna obvia. La solucin del problema principal se
construye con las soluciones encontradas.

En las ciencias de la computacin, el termino divide y vencers (DYV) hace referencia a


uno de los mas importantes paradigmas de diseo algortmico. El mtodo est basado en
la resolucin recursiva de un problema dividindolo en dos o ms subproblemas de igual
tipo o similar. El proceso continua hasta que estos llegan a ser lo suficientemente
sencillos como para que se resuelvan directamente. Al final, las soluciones a cada uno de
los subproblemas se combinan para dar una solucin al problema original.

Esta tcnica es la base de los algoritmos eficientes para casi cualquier tipo de problema
como, por ejemplo, algoritmos de ordenamiento (quicksort, mergesort, entre muchos
otros),multiplicar nmeros grandes (Karatsuba), anlisis sintcticos (anlisis sintctico
top-down) y la transformada discreta de Fourier.

Por otra parte, analizar y disear algoritmos de DyV son tareas que lleva tiempo dominar.
Al igual que en la induccin, a veces es necesario sustituir el problema original por uno
ms complejo para conseguir realizar la recursin, y no hay un mtodo sistemtico de
generalizacin.

El nombre divide y vencers tambin se aplica a veces a algoritmos que reducen cada
problema a un nico subproblema, como la bsqueda binaria para encontrar un elemento
en una lista ordenada (o su equivalente en computacin numrica, el algoritmo de
biseccin para bsqueda de races). Estos algoritmos pueden ser implementados mas
eficientemente que los algoritmos generales de divide y vencers; en particular, si es
usando una serie de recursiones que lo convierten en simples bucles. Bajo esta amplia
definicin, sin embargo, cada algoritmo que usa recursin o bucles puede ser tomado
como un algoritmo de divide y vencers. El nombre decrementa y vencers ha sido
propuesta para la subclase simple de problemas.

La correccin de un algoritmo de divide y vencers, esta habitualmente probada una


induccin matemtica, y su coste computacional se determina resolviendo relaciones de
recurrencia.

Diseo e implementacin
La resolucin de un problema mediante esta tcnica consta fundamentalmente de los
siguientes pasos:

5
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

1. En primer lugar ha de plantearse el problema de forma que pueda ser descompuesto en


k subproblemas del mismo tipo, pero de menor tamao. Es decir, si el tamao de la
entrada es n, hemos de conseguir dividir el problema en k subproblemas (donde 1 k
n), cada uno con una entrada de tamao nk y donde 0 nk < n. A esta tarea se le conoce
como divisin.

2. En segundo lugar han de resolverse independientemente todos los subproblemas, bien


directamente si son elementales o bien de forma recursiva. El hecho de que el tamao de
los subproblemas sea estrictamente menor que el tamao original del problema nos
garantiza la convergencia hacia los casos elementales, tambin denominados casos base.

3. Por ltimo, combinar las soluciones obtenidas en el paso anterior para construir la
solucin del problema original. Los algoritmos divide y vencers (o divide and conquer,
en ingls), se disean como procedimientos generalmente recursivos.

AlgoritmoDyV (p: TipoProblema): TipoSolucion


if esCasoBase(p)
return resuelve(p)
else
subproblemas: array of TipoProblema
subproblemas = divideEnSubproblemas(p)
soluciones_parciales: array of TipoSolucion
for each sp in subproblemas
soluciones_parciales.push_back(AlgoritmoDYV(sp))
endFor
return mezcla(soluciones_parciales)
endIf
finAlgoritmoDyV

Por el hecho de usar un diseo recursivo, los algoritmos diseados mediante la tcnica de
Divide y Vencers van a heredar las ventajas e inconvenientes que la recursin plantea:
Por un lado el diseo que se obtiene suele ser simple, claro, robusto y elegante, lo
que da lugar a una mayor legibilidad y facilidad de depuracin y mantenimiento
del cdigo obtenido.
Por contra, los diseos recursivos conllevan normalmente un mayor tiempo de
ejecucin que los iterativos, adems de la complejidad espacial que puede
representar el uso de la pila de recursin.

Sin embargo, este tipo de algoritmos tambin se pueden implementar como un algoritmo
no recursivo que almacene las soluciones parciales en una estructura de datos explicita,
como puede ser una pila, cola, o cola de prioridad. Esta aproximacin da mayor libertad
al diseador, de forma que se pueda escoger que subproblema es el que se va a resolver a
continuacin, lo que puede ser importante en el caso de usar tcnicas como Ramificacion
y acotacin o de optimizacin.

Recursin
Los algoritmos de divide y vencers estn naturalmente implementados, como
procesos recursivos. En ese caso, los subproblemas parciales encabezados por aquel que
ya ha sido resuelto se almacenan en la pila de llamadas de procedimientos.

6
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

Pila explcita
Los algoritmos de divide y vencers tambin pueden ser implementados por un programa
no recursivo que almacena los subproblemas parciales en alguna estructura de datos
explicita, tales como una pila, una cola, o una cola de prioridad. Este enfoque permite
mas libertad a la hora de elegir los subproblemas a resolver despus, una caracterstica
que es importante en algunas aplicaciones, por ejemplo en la bsqueda en anchura y en el
mtodo de ramificacin y poda para optimizacin de subproblemas. Este enfoque es
tambin la solucin estndar en lenguajes de programacin que no permiten
procedimientos recursivos.

Tamao de la pila
En implementaciones recursivas de algoritmos de DyV, debe asegurarse que hay
suficiente memoria libre para la pila de recursin, sino la ejecucin puede .fallar por
desbordamiento de la pila. Afortunadamente, los algoritmos DyV que son eficientes
temporalmente tienen una profundidad recursiva relativamente pequea. Por ejemplo, el
algoritmo quicksort puede ser implementado de forma que nunca requiere ms de log2n
llamadas recursivas para ordenar n elementos.

Los desbordamientos de pila podran ser difciles de evitar cuando usamos


procedimientos recursivos, donde muchos compiladores asumen que la pila de recursin
es una zona contagiosa de memoria, y algunos asignan una cantidad de espacio
determinada para ello. Los compiladores pueden tambin asignar ms informacin en la
pila de recursin que la estrictamente necesaria, tales como la direccin de retorno,
parmetros invariables, y las variables internas del procedimiento. As, el riesgo de
desbordamiento de pila puede ser reducido mediante la minimizacin de parmetros y
variables internas de los procedimientos recursivos, o usando estructura de pila explicita.

Eligiendo los casos base


En cualquier algoritmo recursivo, hay una libertad considerable para elegir los casos
bases, los subproblemas pequeos que son resueltos directamente para acabar con la
recursin. Elegir los casos base ms pequeos y simples posibles es ms elegante y
normalmente nos da lugar a programas ms simples, porque hay menos casos a
considerar y son ms fciles de resolver. Por ejemplo, un algoritmo FFT podra parar la
recursin cuando la entrada es una muestra simple, y el algoritmo quicksort de
ordenacin podra parar cuando la entrada es una lista vaca. En ambos casos, solo hay
que considerar un caso base a considerar, y no requiere procesamiento.
Por otra parte, la eficiencia normalmente mejora si la recursin se para en casos
relativamente grandes, y estos son resueltos no recursivamente. Esta estrategia evita la
sobrecarga de llamadas recursivas que hacen poco o ningn trabajo, y pueden tambin
permitir el uso de algoritmos especializados no recursivos que, para esos casos base, son
ms eficientes que la recursin explicita. Ya que un algoritmo de DyV reduce cada
instancia del problema o subproblema an gran nmero de instancias base, estas
habitualmente dominan el coste general del algoritmo, especialmente cuando la
sobrecarga de separacin/unin es baja.
Vase que estas consideraciones no dependen de si la recursin esta implementada por
compilador o por pila explicita.
As, por ejemplo, muchas implementaciones de biblioteca de quicksort se convertirn en
un simple algoritmo de insertion sort basado en bucles (o similar) una vez que el nmero
de elementos a ordenar es lo suficientemente pequeo.

7
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

Notemos que, si la lista vaca fuese el nico caso base, ordenar una lista con n entradas
dara lugar a n+1 llamadas al quicksort que no hara nada salvo volver inmediatamente.
El incrementar los casos bases a listas de tamao 2 o menos eliminaran la mayora de
estas llamadas que no haran nada, y ms generalmente un caso base ms grande que 2 es
tpicamente usado para reducir la fraccin de tiempo gastado en la sobrecarga de la
llamada de funciones o manipulacin de la pila.

Compartir subproblemas repetidos


Para algunos problemas, la recursin ramificada podra acabar evaluando el mismo
subproblema muchas veces. En tales casos valdra la pena identificar y guardar las
soluciones de estos subproblemas solapados, una tcnica comnmente conocida como
memorizacin. Llevado al lmite, nos lleva a algoritmos de divide y vencers de
bottom-up tales como la programacin dinmica y anlisis grfico.

Ventajas

Resolucin de problemas complejos


Este modelo algortmico es una herramienta potente para solucionar problemas
complejos, tales como el clsico juego de las torres de Hanoi. Todo lo que necesita este
algoritmo es dividir el problema en subproblemas ms sencillos, y estos en otros ms
sencillos hasta llegar a unos subproblemas sencillos (tambin llamados casos base). Una
vez ah, se resuelven y se combinan los subproblemas en orden inverso a su inicio. Como
dividir los problemas es, a menudo, la parte ms compleja del algoritmo. Por eso, en
muchos problemas, el modelo solo ofrece la solucin ms sencilla, no la mejor.

Eficiencia del algoritmo


Normalmente, esta tcnica proporciona una forma natural de disear algoritmos
eficientes. Por ejemplo, si el trabajo de dividir el problema y de combinar las soluciones
parciales es proporcional al tamao del problema (n); adems, hay un nmero limitado p
de subproblemas de tamao aproximadamente igual a n/p en cada etapa; y por ultimo, los
casos base requieren un tiempo constante (O(1)); entonces el algoritmo divide y vencers
tiene por cota superior asinttica a O(nlogn). Esta cota es la que tienen los algoritmos
divide y vencers que solucionan problemas tales como ordenar y la transformada
discreta de fourier. Ambos procedimientos reducen su complejidad, anteriormente
definida por O(n2). Para terminar, cabe destacar que existen otros enfoques y mtodos
que mejoran estas cotas.

Paralelismo
Este tipo de algoritmos se adapta de forma natural a la ejecucin en entornos
multiprocesador, especialmente en sistemas de memoria compartida donde la
comunicacin de datos entre los procesadores no necesita ser planeada por adelantado,
por lo que subproblemas distintos se pueden ejecutar en procesadores distintos.

Acceso a memoria
Los algoritmos que siguen el paradigma Divide y vencers, tienden naturalmente a hacer
un uso eficiente de las memorias caches. La razn es que una vez que un subproblema es
lo suficientemente pequeo, el y todos sus subproblemas se pueden, en principio,
solucionar dentro de esa cache, sin tener acceso a la memoria principal, que es del orden
de decenas de veces ms lenta. Un algoritmo diseado para aprovechar la memoria cache
8
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

de esta manera se llama modelo cach-olvidadiza, olvidadiza porque no contiene el


tamao de la memoria como parmetro explicito. Por otra parte, estos algoritmos se
pueden disear para muchos problemas importantes, tales como ordenacin, la
multiplicacin de matrices, de manera que se haga un uso ptimo de la cache.

En contraste, el acercamiento tradicional para explotar la cache es hacer bloques, de esta


forma, el problema se divide explcitamente en las partes de tamaos apropiados para que
se pueda utilizar al cache de forma ptima, pero solamente cuando el algoritmo es
mejorado para el tamao especfico de la cache de una maquina particular. La misma
ventaja existe en lo que respecta a otros sistemas jerrquicos de memoria, por ejemplo
NUMA o memoria virtual, as como para niveles mltiples de cache: una vez que un
subproblema es suficientemente pequeo, puede ser solucionado dentro de un nivel dado
de la jerarqua, sin tener que acceder al ms alto (ms lento).

Sin embargo, la clase de optimalidad asinttica descrita aqu, anloga a notacin O


mayscula, no hace caso de factores constantes, y el aadir mejoras adicionales
especficas de la mquina y cache no es un requerimiento para alcanzar el ptimo en un
sentido absoluto.

Control del redondeo


En computaciones con aritmtica redondeada, por ejemplo con los nmeros en aritmtica
flotante, un algoritmo de divide y vencers podra dar resultados ms exactos que un
problema iterativo equivalente superficialmente. Por ejemplo, se pueden sumar N
nmeros tanto como con un bucle simple que suma cada dato a una variable simple, o
mediante un algoritmo de DyV que rompe el conjunto de datos en dos mitades,
recursivamente computa cada suma y luego une las 2 sumas. Mientras que el segundo
mtodo realiza las mismas sumas que el primero, y cuesta ms por las llamadas
recursivas, normalmente es ms exacto.

Desventajas
La principal desventaja de este mtodo es su lentitud en la repeticin del proceso
recursivo: los gastos indirectos de las llamadas recursivas a la resolucin de los
subproblemas, junto con el hecho de tener que almacenar la pila de llamadas (el estado
en cada punto en la repeticin), pueden empeorar cualquier mejora hasta entonces
lograda. Esta tarea, sin embargo, depende del estilo de la implementacin: con casos base
lo suficientemente grandes, se reducen los gastos indirectos de la repeticin de las
llamadas.

Otra desventaja o inconveniente importante, es la dificultad o incluso inconveniencia de


aplicar el mtodo a situaciones en las que la solucin al problema general no se deriva de
la suma directa y simple de los subproblemas (partes). Esto se presenta por ejemplo
cuando son relevantes las interacciones o efectos mutuos entre los subproblemas, lo que
genera nuevos subproblemas, al considerar cada una de estas interacciones,
incrementando exponencialmente el nmero de subproblemas a considerar, al
incrementarse la complejidad de la situacin general y de sus componentes. De modo
similar, el algoritmo puede no ser aplicable cuando las interacciones no son predecibles
de preciso.

9
Sesin 5 ANLISIS Y DISEO DE ALGORITMOS

IV
ACTIVIDADES

1. Recurrencia: Implementar en un lenguaje de programacin elegido, los siguientes


algoritmos recursivos:

a) Factorial n! = n (n-1)!
b) Sucesin de Fibonacci f(n) = f(n-1) + f(n-2)
c) Nmeros de Catalan C(2n, n)/(n+1)
d) Las Torres de Hanoi
e) Funcin de Ackermann

2. Algoritmo Divide y vencers: Implementarla solucin de los siguientes problemas:


a) Multiplicacin de Enteros Grandes: algoritmo eficiente para multiplicar nmeros de
tamao considerable, que se salen de los lmites de representacin, y no abordable con
los algoritmos clsicos debido al excesivo coste.
b) Subvector de suma mxima: Algoritmo eficiente para encontrar subcadenas dentro de
un vector evitando tener que recorrer todo el vector desde cada posicin.

V
CUESTIONARIO

1. .Cual es la mejor tcnica de diseo de algoritmos?


2. Enumera en un cuadro resumen las ventajas y desventajas de cada uno de las tcnicas
de diseo de algoritmos vistas en esta sesin.

10

Вам также может понравиться