Documente Academic
Documente Profesional
Documente Cultură
83
85 En este parte se estudiaran diversas tcnicas de diseo de algoritmos. En cada captulo se estudiar una tcnica distinta empezando por ver que tipo de problemas se pueden atacar utilizando la tcnica. Se estudia, adems, el como hacer el anlisis de algoritmos que utilicen dicha tcnica as como ejemplos concretos donde podemos utilizar la tcnica para su solucin. No se pretende realizar un estudio exhaustivo sino presentar las tcnicas mas comunes. Dichas tcnicas son: Dividir para vencer. Mtodo Avido. Bsqueda con retroceso. rboles de juego. A continuacin se presentan cada una de ellas con una breve introduccin Dividir para vencer Mtodo Avido. Bsqueda con retroceso. rboles de jurgo.
86
5.1.
Forma genrica
El Algoritmo 15 presenta la forma genrica de un algoritmo diseado utilizando la tcnica de dividir para vencer. El algoritmo recibe un problema p, el tamao de este problema n as como una variable donde se guarda la solucin s. El problema p es dividido en varios subproblemas que se guardan en el vector sp. Para resolver cada subproblema el algoritmos se llama recursivamente donde el subproblema ser a su vez dividido hasta que eventualmente lleguemos al caso donde la solucin es trivial. Una vez resueltos todos los subproblemas se combinan todas las soluciones encontradas (que se han guardado en el vector ssp) en la solucin s. Cuando el tamao del problema es lo sucientemente pequeo se calcula de manera inmediata la solucin. 87
88
CalculaSolucinInmediata(p, n, s)
sp = Divide (p, n, s, t) sp es un arreglo de subproblemas para i = 1 a nmero de subproblemas haz DividirParavencer (sp[i], t[i], ssp[i]) t es un arreglo de tamaos de los subproblemas ssp es un arreglo de soluciones del problema
zah is termina.
Combina(ssp, s)
f (t[i])
donde m es el valor para el cual la funcin problema pequeo es verdadero y k el nmero de subproblemas, es decir, el nmero de elementos de sp. Esta tcnica es muy utilizada para resolver el problema de ordenar un arreglo de valores as como de bsqueda. A continuacin veremos dos ejemplos de como utilizar dividir para vencer para ordenar un arreglo. Es importante destacar que pese a que la tcnica utilizada es la misma en ambos casos los algoritmos resultantes son diferentes.
5.3. MERGESORT
89
5.3.
Mergesort
Ejemplo 27 El ordenamiento por intercalamiento (mergesort), como se muestra en el algoritmo 16, utiliza la tcnica de dividir para vencer de la siguiente manera. Para ordenar un arreglo este se divide en dos mitades, cada mitad es ordenada y ambas mitades ya ordenadas se intercalan para dar la solucin.
is termina.
f in) mitad (ini+ 2 Mergesort(ini, mitad) Mergesort(mitad + 1, f in) Intercala(ini, mitad, f in)
Anlisis Temporal
Tamao del problema: n, el tamao del arreglo. Operacin bsica: asignaciones entre elementos del arreglo. Primero es necesario hacer el anlisis del algoritmo que intercala, algoritmo 17. El algoritmo hace 2n operaciones. Esto lo podemos ver de manera informal de la siguiente manera. Primero, el algoritmo copia todos los elementos de el arreglo A al arreglo B intercalndolos en orden. Despus, copia los elementos del arreglo B al A ya en orden. Debido a que el algoritmo de ordenamiento no realiza comparaciones se tiene un solo caso. Caso nico:
90
ini1 ini ini2 mitad + f in k1 mientras (ini1 mitad) (ini2 f in) haz si A[ini1 ] < A[ini2 ] entonces B [k ] A[ini1] ini1 ini1 + 1
otro
is
zah si ini > mitad entonces para j = ini2 a f in haz zah is para j ini a f in haz termina.
A[j ] B [j ] B [k ] A[j ] k k+1
k k+1
5.3. MERGESORT
91
f (1) = 0
intercala
f (n) =
n 2n +2f ( ) 2
Si asumimos que n = 2k podemos expandir la recurrencia utilizando el hecho de que n f (n) 2f ( ) = 2n 2 de la siguiente forma
f (2k ) 2f (2k1 ) = 2 2k 2f (2k1 ) 22 f (2k2 ) = 22 2k1 22 f (2k2 ) 23 f (2k3 ) = 23 2k2 . . . 2k2 f (22 ) 2k1 f (21 ) = 2k1 22 2k1 f (21 ) 21 f (20 ) = 2k 21
Sumando todas las ecuaciones tendremos que
k
f (2 ) =
i=1
2k+1 = k 2k+1
f (n) = log(n) n
es decir
Anlisis Espacial
Memoria esttica.
92
Observamos que en el algoritmo de intercala se necesitan de n celdas para los arreglos A y B. Dado que estas son variables globales es la nica memoria esttica se necesita. Por lo tanto
Fmd (1) = c
Solucin propuesta: Cortar la recursividad en n = 16; utilizar insercin directa. El algoritmo 18 es el algoritmo de insercin directa el cual se puede utilizar para aquellos casos donde n 16.
El anlisis para el algoritmo cambia ya que en el caso base se hace la insercin directa. Este algoritmo si vara de acuerdo a como se encuentren los datos en el arreglo. El anlisis del algoritmo de insercin directa sera de la siguiente manera:
5.3. MERGESORT
93
A[i + 1] x
Ft (n) =
j =2
(3 +
i=0
2) =
j =2
3 + 2(j 1)
que es O(n2 ). Para el algoritmo de mergesort lo que cambiara sera el caso base:
InsercinDirecta(ini, f in)
...
94
5.4. QUICKSORT
95
5.4.
Quicksort
is termina.
Anlisis Temporal
Tamao del problema: Tamao del arreglo Operacin bsica: Comparaciones Para hacer el anlisis temporal notamos que el algoritmo particin realiza n comparaciones. De manera informal esto sucede por que el pivote se compara contra todos los elementos del arreglo. Hacemos el anlisis de quicksort caso por caso. Peor Caso: Ocurre cuando el pivote es el primer elemento En este caso el arreglo se divide en dos partes, una de tamao n 1 y otra de tamao 1. Como ya dijimos el arreglo de tamao 1 ya esta ordenado y supongamos que no necesitamos realizar ninguna operacin. Por lo tanto
96
repite repite men men + 1hasta A[men] > x; repite may may 1hasta A[may ] < x; si men < may entonces is hasta men may ;
A[ini] A[may ]; A[may ] x; Particin may ;
Intercambia(men, may )
termina.
n
particin
+1 = f (n 1) + n + 1
f (n) f (n 1) = n + 1
y expandiendo las recurrencias tendremos
97
f (n) =
2
(i + 1) =
n(n + 1) + (n 2) 2
que es O(n2 ). Mejor caso:El pivote esta exactamente a la mitad En este caso el arreglo se divide en dos partes del mismo tamao. Si suponemos que n = 2k cada parte tendr un tamao 2k 1 (por que el pivote ya esta en orden). La gura 9 muestra el rbol de llamadas recursivas que se realizan.
f (2k )
f (2k1 1)
f (2k1 1)
f (2k2 1)
f (2k2 1)
f (2k2 )
f (2k2 )
f (1) 0 n f (n) 2f ( ) + n + 1 2
es decir
n f (n) 2f ( ) n + 1, 2
98
f (2k ) 2f (2k1 ) 2k + 1 2f (2k1 ) 22 f (2k2 ) 2k + 2 22 f (2k2 ) 23 f (2k3 ) 2k + 22 . . . 2k2 f (22 ) 2k2 f (2) 2k + 2k2 2k1 f (2) 2k f (1) 2k + 2k1
por lo tanto
k1
f (2 ) k 2 +
i=0
2i k 2k +
2k1 1 n log n + n 1 2
que es O(n log n). Caso medio: El pivote se distribuye uniformemente en todo el arreglo. Esto signica que las llamadas recurrentes pueden tener las siguientes formas:
f (n) =
es decir
99
f (n) =2 n+1
despejando f (n) tenemos
n+1
n+1
i=3
1 i
f (n) = 2(n + 1)
i=3
1 2(n + 1) i
n+1 3
dx x
100
que es O(n log n). El algoritmo adolece del exceso de llamadas recursivas, como mergesort. El algoritmo 22 es una versin iterativa del algoritmo.
MetePila(ini, f in) mientras PilaVacia() haz SacaPila(ini, f in) mientras (ini < f in) haz pivote Particin(ini, f in); MetePila(pivote + 1, f in); f in pivote 1;
Anlisis Espacial
En el caso del anlisis espacial, la memoria necesitada por el algoritmo de quicksort, tenemos tambin varios casos.
5.5. EJERCICIOS
101
f (n) = c = O(1)
Para ahorrar memoria dinmica: si pivote ini < f in pivote entonces MetePila(pivote + 1, f in) f in pivote 1
otro
is
5.5.
Ejercicios
Ejercicio 5.1 Realice el anlisis espacial para el peor caso de quicksort. Ejercicio 5.2 Par ms cercano. Dado un conjunto de puntos en el plano
cartesiano (x, y ) el problema es encontrar aquellos dos puntos que se encuentran ms cerca el uno del otro. Haga el anlisis del algoritmo.
102
B C
K L
R S
arreglo de n monedas. Haga el anlisis de dicho algoritmo. Asuma que conoce la funcin falsa que regresa verdadero si la moneda es falsa y es de orden constante.
5.5. EJERCICIOS
103
10
11
14
104
is zah termina.
sol vacia mientras SolCompleta(sol) haz elem seleccion(A) si EsViable (sol, elem) entonces sol sol elem A A elem
6.1.
Problemas Tipo
Reciben como entrada un conjunto de elementos, la salida es un subconjunto de esos elementos que cumplen ciertas restricciones. Cada uno de estos 105
106
subconjuntos es llamado una solucin factible o viable. Se requiere encontrar una solucin factible que maximice o minimice una funcin objetivo. Esta solucin es llamada la solucin ptima. En la mayora de los casos es necesario probar que la estrategia de solucin adoptada conduce a una solucin ptima. Esta tcnica se utiliza para resolver una gran cantidad de problemas de optimizacin. En cada uno de ellos identicamos la funcin objetivo y se demuestra que la estrategia nos conduce a la solucin ptima.
li L.
i=0
Asumimos que cada vez que se desea leer un programa, la cinta se lee desde el comienzo. Es decir, que si los programas se encuentran almacenados en el orden I =< i1 , i2 , . . . , in > el tiempo necesario para recuperar el programa k es
k
tk
j =1
lij .
1 TPEL = n
k=1
1 lij = n j =1
(n k + 1)lik
k=1
Funcin objetivo
Encuentra un orden para almacenar los programas de tal manera que el TPEL sea el menor posible.
107
zah termina.
lj
k=1 j =1
de ndices {1, 2, 3, . . . , n}. Entonces sea D(I ) ptima de tal forma que
n
D(I ) =
k=1
(n k + 1)lij .
Deben existir en I un par de ndices a, b tales que a < b y lia > lib .
108
D(I ) =
k=1
D(I ) D(I ) = (n a + 1)lia (n b + 1)lia + (n b + 1)lib (n a + 1)lib = (b a)lia + (a b)lib = (b a)(lia lib ) > 0
contradiccin
xi v i
i=1
xi pi M, vi > 0, pi > 0, 1 i n
i=1
Supongamos que n = 3, M = 20 y
109
xi v i 1 1 1 ( , , ) 2 3 4 5 ( , 1, 0) 18 2 (0, , 1) 3
y en particular
pi vi 16.5 20 20
24 31.6 31.6
24 25 15 4 5 3 , , )=( , , ) 18 15 10 3 3 2
1 = (0, 1, ) 2 = 32.5
Estrategia
Tomar los objetos de mayor valor por unidad de peso. El algoritmo 25 muestra el algoritmo para resolver el problema de la mochila utilizando el mtodo vido.
Teorema 14 Si
ptima.
Sea x = (x1 , x2 , . . . , xn ) la solucin generada por el algoritmo. Sea j el primer ndice tal que xj = 1 xi = 11 i < j, y 0 xj 1 con xi = 0j < i n. Supongo que existe una solucin ptima Y = (y1 , y2 , y3 , . . . , yn ) Recorremos X y Y hasta encontrar el primer ndice k tal que xk = yk . Puede pasar que 1. k < j yk < xk
110
i 0; peso 0; valor 0; ordena(p, v, ppv ); mientras peso < M haz k ppv [i]; si p[k ] < (M peso) entonces x[k ] 1
otro
x[k ]
is
(M peso) ; p[k ]
zah termina.
111
Si k existe yk < xk . Pero eso tambin implica que l tal que l > k y yl = 0. Construimos ahora una Y tal que Y y Y son idnticas excepto en y yl = yl con lo cual los ndices k y l. Sustituimos yk = yk + pk pl
n n
yi pi =
i=1 i=1
yi pi
Note que
yk p k = ( yk +
y
pk
)pk = yk +
yl p l = ( yl +
pl
)pl = yl
Si hacemos yk tan grande como podamos tendremos dos posibilidades: 1. yk = xk 2. yk < xk en cuyo caso existe l tal que l > k y yl = 0 y podemos hacer el razonamiento superior hasta hacer yk = xk . Pero, qu pasa con la suma de valores? Para ellas tendremos
n n
yi pi
i=1 i=1
yi pi
Por que
yk vk = yk vk + y l vl = y l vl
pk pl
vk
vl
112 y
vk vl > pk pl
Es decir que podemos hacer Y idntico a X hasta k y mantenerlo ptimo. Es claro que podemos seguir este razonamiento para k + 1, k + 2 . . . , n. X es ptimo. Construiremos una solucin Z en la cual vamos a hacer crecer yk hasta xk y decrecer yk+1 , ..., yn . Tendremos por lo tanto:
n n
v i xi =
i=1 i=1
vi yi + (yk Xk )vk
n
i=1
!
i) >! y es optima ii) Z es optima y se parece a x hasta xk , si aplicamos el mismo procedimiento tendremos z xk + 1X
x es optima
6.4.1. Problema
Determinar la manera ptima de intercalar los registros de los n archivos ordenados.
113
6.4.2. Estrategia
Tomar cada vez los dos archivos mas pequeos. Este problema puede representarse como un rbol binario en el que las hojas son los archivos iniciales y los nodos internos las intercalaciones, la Figura 10 muestra un ejemplo. Si F1 esta a una distancia de 3 los registros de Fi se movieron tres veces. Si di es la distancia del nodo Fi a la raz y li es la longitud del archivo Fi entonces el nmero total de movimientos es
n
li di
i=1
y3
y3
y2
y1
y2
y1
x1
x2
x3
x4
x1
x2
x3
x4
114
zah termina.
nodo Creanodo(); Izq (nodo) M enor(L); menor elimina el Der(nodo) M enor(L); nodo de vuelta Long (nodo) Long (Izq (nodo) + Long (Der(nodo)); Inserta(L, nodo);
l1 + l2
lr
lm
l1
l2
Si intercambiamos l1 y l2 con lr y ln , la longitud de camino externo ponderado del rbol resultante T es LCEP(T ) LCEP(T ). Adems:
115
Si LCEP(T ) = LCEP(T ) entonces l1 , l2 , lr , ln estn en el mismo nivel. Si LCEP(T ) > LCEP(T ) estaban en diferentes niveles. Contradiccin!
mod (k 1) = 1
25
35
15
20
30
30
10
116
c(T ) =
aA
c(a)
6.5.1. Problema
Encontrar un rbol generador de costo mnimo.
71 0 6 53 2 4 G
5
71 0 6 53 2 4 E
71 0 6 53 2 4 G 71 0 6 53 2 4 A
3 3
0 71 6 53 2 4 E
71 0 6 53 2 4 C
71 0 6 53 2 4 2 0 71 6 53 2 4 F B 5 8 ?> 9 : =< ; D
6.5.2. Estrategia
Existen dos estrategias bsicas Tomar el arco de menos costo que una un vrtice conectado con uno no conectado. Toman el menor arco que no forme ciclo. El algoritmo de Kruskal que se muestra en el algoritmo 27 utiliza la segunda estrategia para encontrar un rbol generador de costo mnimo.
117
zah termina.
is
Algoritmo 27: Kruskal Teorema 16 El algoritmo de Kruskal genera un rbol generador de costo
mnimo para un grafo conectado no dirigido G.
El rbol obtenido sigue siendo generador y ptimo c(T ) c(T ). Podemos seguir este razonamiento hasta que T = Tk . Tk es ptimo.
118
7.1.
Problemas Tipo
(x1 , x2 , x3 , ..., xn ), xi Si
F (x1 , x2 , x3 , ..., xn ).
Cada uno de los valores xi de la tupla puede tomar uno de varios posibles valores Si . Si |Si | = mi entonces existen m1 m2 m3 mn posibles valores para (x1 , x2 , x3 , ..., xn ). 119
120
121
122
nivel nivel 1;
7.3. n Reinas
Ejemplo 33 El problema de las n reinas consiste en colocar n reinas en
un tablero de ajedrez de n n de manera que no se ataquen mutuamente. La solucin se puede expresar como la tupla de posiciones de las reinas (q1 , q2 , . . . , qn ). Si cada posicin es representada como (r, c) (rengln, colum-
7.3. N REINAS
123
proc RBacktrack (n) comienza para cada xk T (x1 , x2 , . . . , xi ) haz si Bk (x1 , x2 , . . . , xk ) entonces si (x1 , x2 , . . . , xk ) entonces is is zah termina.
imprime(x1 , x2 , . . . , xk );
n2 n
posibles soluciones. Pero si notamos que cada reina debe estar en un rengln diferente (las reinas atacan cualquier pieza en su mismo rengln) entonces la solucin se puede expresar como (c1 , c2 , c3 , . . . , cn ) donde ci es la columna en la que se coloca a la reina en el rengln i. Lo cual reduce nuestro espacio de soluciones a solo n! (por que dos reinas no pueden estar en la misma columna).
ci = cj i = j, 1 i, j n.
124
rengln ni en la misma columna. Solo falta asegurarse de que las reinas deben estar en diferente diagonal. Eso lo logramos vericando que
|cj ci | = |j i|.
El algoritmo coloca (algoritmo 30) se encarga de vericar que las restricciones explicitas e implcitas se cumplan. El algoritmo checa que la ltima reina en colocarse (la xi+1 ) cumpla con las restricciones. Este algoritmo es la implementacin de la funcin B para el problema de las n reinas.
func Coloca(reinas) comienza para i = 1 a reinas 1 haz si (x[i] = x[reina] |x[i] x[reina]| = |i reina|) entonces zah is
Coloca f also;
Coloca verdadero
c2 =1 4 3 1 2
125
Como se ve en la gura solo es necesario generar todos los posibles valores de columnas para obtener el siguiente estado. El algoritmo 31 muestra el algoritmo necesario para encontrar la solucin para n reinas. En cada estado se generan todas las posibles columnas y se utiliza la funcin Coloca para vericar si es posible alcanzar un estado respuesta.
reina 1 x[reina] 0 mientras reinas > 0 haz x[reina] x[reina] + 1; mientras (x[reina] n) Coloca(reina) haz x[reina] x[reina] + 1
reina reina 1;
7.4.
Suma de Subconjuntos
los subconjuntos tales que la suma de los elementos sea igual a un entero M . Por ejemplo, para el conjunto
126
Este problema se puede formular de dos maneras distintas, aunque en ambos casos tendremos al conjunto representado como un vector
< v1 , v2 , v3 , . . . , vn > .
7.4.1. Formulacin 1
Podemos representar la solucin con
(x1 , x2 , x3 , . . . , xk )
donde xi en (x1 , x2 , x3 , . . . , xk ) signica que vxi esta en la tupla. As las soluciones para el ejemplo se expresan
S1 = (1, 2, 4) S2 = (3, 4)
Para generar las posibles tuplas solo necesitamos hacer que
xi 1, 2, 3, . . . , n
y que la tupla
(x1 , x2 , x3 , . . . , xk )
satisfaga
n
vxi = M.
i=1
7.4.2. Restricciones
Para esta formulacin del problema tendremos que las restricciones que tenemos son
127
Explicitas 1 xi ni y
vxi = M.
i=1
entonces
otro
imprime(x);
is
entonces
7.4.3. Formulacin 2
La solucin ser una tupla
(x1 , x2 , x3 , . . . , xn ) con xi 0, 1
y si xi = 1 signica que vi esta en el subconjunto. Si xi = 0 signica que vi no esta en el subconjunto. La tupla (x1 , x2 , x3 , . . . , xn ). As las soluciones
128
S1 = (1, 1, 0, 1) S2 = (0, 0, 1, 1)
que debe cumplir
n
xi vi = M.
i=1
7.4.4. Restricciones
Para esta formulacin del problema tendremos que las restricciones que tenemos son
Explicitas
xi = 0 1
y
vxi = M.
i=1
v i xi +
i=1 k i=k+1
vi < M
vi xi + vk+1 > M
i=1
129
otro
is
7.5.1. Solucin
Expresamos a la solucin como la tupla (x1 , x2 , x3 , . . . , xn ) con xi {1, . . . , m} donde xi es color asignado al vrtice i, por lo que vemos a V como un vector < v1 , v2 , . . . , vn > con |V | = n. La restriccin se expresa como
xi = xj i = j si (i, j ) A.
El rbol de espacio de estados:
130
func SeColorea(nodo) comienza para vrtice = 1 a nodo 1 haz si (G[vertice, nodo]) (x[vertice] = x[nodo]) entonces zah is
SeColorea F ;
termina.
SeColorea V ;
repite
x[nodo] x[nodo] + 1; hasta x[nodo] > m sepuedecolorear(nodo); si (x[nodo] =< m) entonces si (nodo = n) Imprime(x);
otro is
nodo nodo 1;
131
zah termina.
is
132
8.1.
Problema
Encontrar un camino hacia el triunfo del jugador que tiene el turno en la raz del rbol. 133
134
8.2. Solucin
Hacer la bsqueda con retroceso en el rbol de juego utilizando el mtodo MiniMax, y las funciones de corte dadas por la tcnica poda alfa-beta.
135
Eval utilidad(T );
valor ; valor ;
is para cada H hijos(T ) haz si (M odo = M ax) entonces otro is zah is termina.
Eval valor;
136
valor nal resulta de la aplicacin de la evaluacin Min-Max. valor tentativo es una cota inferior de valor nal para nodos Max es una cota superior del valor nal para nodos Min.
8.5.2. Reglas
Si todos los hijos de un nodo T ya se podaron o se exploraron entonces valor nal(T)<-valor tentativo Vf H Si un nodo T tiene un valor vt y uno de los hijos de T , el nodo H tiene un valor nal vf H . i) T es un nodo Max y vt < vf H vt vf H . ii) T es un nodo Min y vt > vf H vt vf H . Si un nodo T tiene un valor tentativo vf T y su descendiente, el nodo H tiene un valor tentativo vf H i) T es un nodo Max vtT considerados de H. ii) T es un nodo Max vtT considerados de H.
vtH se podan todos los hijos no vtH se podan todos los hijos no
nodo raiz ; Q Colavacia(); Encola(Q, nodo); mientras Escolavacia(Q) HaySolucin haz nodo Desencola(a); si nodo es solucin entonces imprime(nodo); HaySolucin verdad;
otro
is zah termina.
139
(T ) = h(g ) + g C (T )
donde
h(T ): Cantidad de trabajo necesaria para llegar de la raz a T . g (T ): Una estimacin de la cantidad de trabajo necesaria para llegar de T a un nodo respuesta.
El algoritmo 39 muestra al algoritmo general utilizando estas funciones.
nodo raiz ; inserta(vivos, nodo); mientras N ovacio(vivos) Haysolucion haz nodo traeM enoryelimina(vivos); inserta(muertos, nodos); si nodoessolucion entonces imprime(nodo); Haysolucion verdad;
otro
otro
is
H.costo ca ux;