You are on page 1of 9

ESTRATEGIAS DE DISEO

Existen 5 estrategias mayormente utilizadas en el diseo de algoritmos, en las que se encuentran: Voraz Divide y Vencers Programacin dinmica Back tracking Algoritmo Probabilstico

DIVIDE Y VENCERAS

Es una tcnica de diseo de algoritmos que consiste en resolver un problema a partir de la solucin de subproblemas del mismo tipo, pero de menor tamao. Si los subproblemas son an muy grandes se aplica nuevamente esta tcnica hasta alcanza subproblemas lo suficientemente pequeos para ser solucionados directamente. Algunas aplicaciones de esta tcnica son la clasificacin por intercalacin y los arboles binarios de bsqueda. La resolucin de un problema mediante esta tcnica consta fundamentalmente de los siguientes pasos: 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 tar ea 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, se disean como procedimientos generalmente recursivos.

Orden del algoritmo

Donde a, c y k son nmeros reales, n y b son nmeros naturales y donde a<0, c>0, k>= 0 y b>1.

Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

Ejemplo de Implementacin Bsqueda binaria algoritmo BusquedaBinaria(a: vector; prim,ult,x:enteros) var tercio:entero; inicio si (prim>=ultimo) entonces return a[ult]=x; sino tercio:=prim+((ult-prim+1)DIV 3); si x=a[tercio] entonces return true; sinosi (x<a[tercio] entonces return BusquedaBinaria(a,prim,tercio,x); sino return BusquedaBinaria(a,tercio+1,ult,x) finsi finsi fin BusquedaBinaria;

VORAZ
Tambin conocido como vido, devorador o goloso. Es un mtodo muy sencillo que puede ser aplicado a numerosos problemas, especialmente los de optimizacin. Dado un problema cn N entradas el mtodo consiste en obtener un subconjunto de estas que satisfagan una determinada restriccin definida por el problema. Cada uno de los subconjuntos que cumplan las restricciones diremos que son soluciones Prometedoras. Una soluci n prometedora que maximice o minimice una funcin objetivo la denominaremos solucin ptima. Para identificar si un problema es susceptible a ser resulto por un algoritmo vido, se definen una serie de elementos que deben estar presentes en el problema: Un conjunto de candidatos, que corresponden a las N entradas del problema. Una funcin de seleccin que en cada momento determine el candidato idneo para formar la solucin de entre los que an no an sido seleccionados ni rechazados. Una funcin que compruebe si un cierto subconjunto de candidatos es prometedor. Una funcin objetivo que determine el valor de la solucin hallada. Es la funcin que queremos maximizar o minimizar. Una funcin que compruebe si un subconjunto de estas entradas es solucin al problema, sea optima o no. Con estos elementos, podemos resumir el funcionamiento de los algoritmos vidos en los siguientes puntos: 1. Para resolver el problema, un algoritmo vido tratara de encontrar un subconjunto de candidatos tales que, cumpliendo las restricciones del problema, constituya la solucin ptima. 2. Para ello trabajara por etapas, tomando en cada una de ellas la decisin que le parece la mejor, sin considerar las consecuencias futuras, y por tanto escoger de entre todos los
Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

candidatos el que produce un optimo local para esa etapa, suponiendo que ser la mejor para el problema. 3. Antes de aadir un candidato a la solucin que se est construyendo comprobara si es prometedora al aadirlo. En caso afirmativo lo incluir a ella y en caso contrario lo descartara para siempre y no volver a considerarlo. 4. Cada vez que se incluya un candidato comprobara si el conjunto obtenido es solucin. Orden del algoritmo M el nmero de aristas del grafo y n el nmero de vrtices, el algoritmo de Kruskal muestra una complejidad O(m log m) o, equivalentemente, O (m log n), cuando se ejecuta sobre estructuras de datos simples. Los tiempos de ejecucin son equivalentes porque:

m es a lo sumo n2 y log n2 = 2logn es O (log n).

ignorando los vrtices aislados, los cuales forman su propia componente del rbol de expansin mnimo, n 2m, as que log n es O (log m). Ejemplo de Implementacin 1 function Kruskal (G) 2 for each vertex v in G do 3 Define an elementary cluster C (v) *v}. 4 Initialize a priority queue Q to contain all edges in G, using the weights as keys. 5 Define a tree T //T will ultimately contain the edges of the MST 6 // n es el nmero total de vrtices 7 while T has fewer than n-1 edges do 8 // edge u, v is the minimum weighted route from/to v 9 (u,v) Q.removeMin() 10 // previene ciclos en T. suma u, v solo si T no contiene una arista que una u y v. 11 // Ntese que el cluster contiene ms de un vrtice si una arista une un par de 12 // vrtices que han sido aadidos al rbol. 13 Let C(v) be the cluster containing v, and let C(u) be the cluster containing u. 14 if C(v) C(u) then 15 Add edge (v,u) to T. 16 Merge C(v) and C(u) into one cluster, that is, union C(v) and C(u). 17 return tree T

PROGRAMACION DINAMICA
Existe una serie de problemas cuyas soluciones pueden ser expresadas recursivamente en trminos matemticos y posiblemente la manera ms natural de resolverlos es mediante un algoritmo recursivo. Sin embargo, el tiempo de ejecucin de dicha solucin es normalmente de

Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

orden exponencial y por lo tanto impracticable, lo cual puede mejorarse substancialmente mediante la programacin dinmica. La eficiencia de esta tcnica consiste en resolver los subproblemas una sola vez, guardando sus soluciones en una tabla para su futura utilizacin. Donde tiene mayor aplicacin esta estrategia es en la resolucin de problemas de optimizacin. En este tipo de problemas se pueden presentar distintas soluciones, cada una con un valor, y lo que se desea es encontrar la solucin con valor ptimo (mximo o mnimo). Para que un problema pueda ser abordado por esta tcnica ha de cumplir 2 condiciones: 1. la solucin al problema ha de ser alcanzada a travs de una secuencia de decisiones, una en cada etapa. 2. Dicha secuencia de decisiones ha de cumplir el principio de ptimo. El diseo de un algoritmo de Programacin Dinmica consta de los siguientes pasos: 1. Planteamiento de la solucin como una sucesin de decisiones y verificacin de que sta cumple el principio de ptimo. 2. Definicin recursiva de la solucin. 3. Calculo del valor de la solucin ptima mediante una tabla donde se almacenan soluciones a problemas parciales para reutilizar los clculos. 4. Construccin de la solucin ptima haciendo uso de la informacin contenida en la tabla anterior. Ejemplo de Implementacin Coeficientes binomiales El algoritmo recursivo que calcula los coeficientes binomiales resulta ser de complejidad exponencial por la repeticin de los clculos que realiza. No obstante, es posible disear un algoritmo con un tiempo de ejecucin de orden O(nk) basado en la idea del Tringulo de Pascal, idea claramente aplicable mediante programacin dinmica. Para ello es necesaria la creacin de una tabla bidimensional en la que ir almacenando los valores intermedios que se utilizan posteriormente. La idea recursiva de los coeficientes binomiales es la siguiente:

si 0 < k < n

=1

La idea para construir la tabla de manera eficiente y sin valores intiles es la siguiente:

Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

0 0 1 2 3 1 1 1 1

...

k-1

1 2 3 1 3 1

...

...

...

...

...

...

... n-1 n

...

...

...

...

...

... C(n-1,k-1) C(n-1,k) C(n,k)

El siguiente algoritmo memorizado de estrategia Bottom-up tiene complejidad polinmica y va rellenando la tabla de izquierda a derecha y de arriba abajo: FUNC CoeficientesPolinomiales ( n, k: NATURAL): NATURAL Variables tabla: TABLA DE NATURAL i, j: NATURAL Inicio PARA i 0 HASTA n HACER tabla[i][0] 1 FINPARA PARA i 1 HASTA n HACER tabla[i][1] i FINPARA PARA i 2 HASTA k HACER tabla[i][i] 1 FINPARA PARA i 3 HASTA n HACER PARA j 2 HASTA i-1 HACER
Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

SI j <= k ENTONCES tabla[i][j] tabla[i-1][j-1] + tabla[i-1][j] FINSI FINPARA FINPARA devolver tabla[n][k] Fin

BACKTRACKING
El mtodo de vuelta atrs (Backtracking) es uno de los ms utilizados en el sentido de que puede aplicarse en la resolucin de un gran nmero de problemas, especialmente en aquellos de optimizacin. Ciertos problemas son incapaces de solucionarse con las tcnicas antes mencionadas, de manera que la nica forma de resolverlos es a travs de un estudio exhaustivo de un conjunto conocido a priori de posibles soluciones, en las que se trata de encontrar una o todas las soluciones y por lo tanto tambin la ptima. Para llevar a cabo un estudio exhaustivo, el diseo Vuelta Atrs proporciona una manera sistemtica de generar todas las posibles soluciones siempre que dichas soluciones sean susceptibles de resolverse en etapas. En su forma bsica la Vuelta Atrs se asemeja a un recorrido en profundidad dentro de un rbol cuya existencia solo es implcita, y que denominaremos rbol de expansin. En este recorrido pueden suceder 2 cosas. La primera es que tenga xito, si procediendo de esa manera, se llega a una solucin (una hoja del rbol). Si lo nico que buscamos era una solucin al problema, el algoritmo finaliza aqu; ahora bien, si lo que buscamos eran todas las soluciones o la mejor de todas ellas, el algoritmo seguir explorando el rbol en bsqueda de soluciones alternativas. Por otra parte, el recorrido no tiene xito si en alguna etapa la solucin parcial construida hasta el momento no se puede completar; nos encontramos en lo que llamamos nodos fracaso. En tal caso, el algoritmo vuelve Atrs (de aqu su nombre) en su recorrido eliminando los elementos que se hubieran aadido en cada etapa a partir de ese nodo. En este retroceso, si existe uno o ms caminos aun no explorados que puedan conducir a solucin, el recorrido del rbol contina por ellos. Orden del algoritmo El tiempo d ejecucin depende del nmero de nodos generados y del tiempo requerido para cada nodo, que viene dado por el coste de las funciones. Ejemplo de Implementacin

La vuelta del caballo #include <stdio.h>


Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

#define N 5 #define ncuad N*N void mover(int tablero[][N], int i, int pos_x, int pos_y, int *q); const int ejex[8] = { -1,-2,-2,-1, 1, 2, 2, 1 }, ejey[8] = { -2,-1, 1, 2, 2, 1,-1,-2 }; int main(void) { int tablero[N][N]; /* tablero del caballo. */ int i,j,q; /* inicializa el tablero a cero */ for (i = 0; i < N; i++) for (j = 0; j < N; j++) tablero[i][j] = 0; /* pone el primer movimiento */ tablero[0][0] = 1; mover(tablero,2,0,0,&q); if (q) { /* hay solucion: la muestra. */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%3d ", tablero[i][j]); putchar('\n'); } } else printf("\nNo existe solucion\n"); return 0; } void mover(int tablero[][N],int i, int pos_x, int pos_y, int *q) { int k, u, v; k = 0; *q = 0; do { u = pos_x + ejex[k]; v = pos_y + ejey[k]; /* seleccionar candidato */ if (u >= 0 && u < N && v >= 0 && v < N) { /* esta dentro de los limites? */ if (tablero[u][v] == 0) { /* es valido? */ tablero[u][v] = i; /* anota el candidato */ if (i < ncuad) { /* llega al final del recorrido? */ mover(tablero,i+1,u,v,q); if (!*q) tablero[u][v] = 0; /* borra el candidato */
Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

} } k++; } while (!*q && k < 8); }

} else *q = 1; /* hay solucion */

ALGORITMOS PROBABILISTAS

Un algoritmo probabilista (o probabilstico) es un algoritmo que basa su resultado en la toma de algunas decisiones al azar, de tal forma que, en promedio, obtiene una buena solucin al problema planteado para cualquier distribucin de los datos de entrada. Existen varios tipos de algoritmos probabilsticos dependiendo de su funcionamiento, pudindose distinguir: Algoritmos numricos, que proporcionan una solucin aproximada del problema. Algoritmos de Montecarlo, que pueden dar la respuesta correcta o respuesta errneas (con probabilidad baja). Algoritmos de Las Vegas, que nunca dan una respuesta incorrecta: o bien dan la respuesta correcta o informan del fallo. Algoritmos de Sherwood, los cuales devuelven siempre una respuesta, la cual es forzosamente exacta. Un algoritmo probabilista puede comportarse de distinta forma aplicando la misma entrada. A un algoritmo determinista nunca se le permite que no termine: hacer una divisin por 0, entrar en un bucle infinito, etc. Si existe ms de una solucin para unos datos dados, un algoritmo determinista siempre encuentra la misma solucin (a no ser que se programe para encontrar varias o todas). Un algoritmo probabilista puede encontrar soluciones diferentes ejecutndose varias veces con los mismos datos. A un algoritmo determinista no se le permite que calcule una solucin incorrecta para ningn dato. Un algoritmo probabilista puede equivocarse siempre que esto ocurra con una probabilidad pequea para cada dato de entrada. Repitiendo la ejecucin un nmero suficiente de veces para el mismo dato, puede aumentarse tanto como se quiera el grado de confianza en obtener la solucin correcta. El anlisis de la eficiencia de un algoritmo determinista es, en determinadas ocasiones, difcil. El anlisis de los algoritmos probabilistas es, a menudo, muy difcil.

Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

Orden del algoritmo La complejidad de este algoritmo es Ejemplo de Implementacin Algoritmo tipo Montecarlo para verificar la multiplicacin de dos matrices. Sean A, B, C matrices de N x N. Se desea chequear s tiempo O (n3) usando el algoritmo estndar. Probabilsticamente, se puede chequear si error. El algoritmo es el siguiente: . Determinsticamente, esto toma .

en tiempo O(n2) con baja probabilidad de

for (i=1; i<=k; i++) { Generar un vector aleatorio de N x 1 con entradas en {-1, 1}; if (A*(Bx) != Cx) return false; // A*B != C } return true; // A*B = C con alta probabilidad

Ramrez Flores Jessica Estrategias de Diseo Anlisis y Diseo de Algoritmos Sec. D03

You might also like