Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cap 7
Cap 7
Diseo de Algoritmos
Como ya hemos mencionado, el principio bsico del diseo descendente es tratar de
resolver un problema mediante la resolucin de problemas ms simples. En este captulo
ahondaremos en el diseo de algoritmos iterativos.
En la seccin 7. presentamos estrategias de solucin de problemas basadas en el diseo
descendente. !resentaremos en la seccin 7." es#uemas de algoritmos bsicos de
tratamiento secuencial.
Como vimos en la seccin $.", el diseo descendente tambi%n se denomina tcnica de
refinamiento sucesivo. &asta el momento hemos aplicado el diseo descendente slo para
re'inar acciones abstractas en t%rminos de acciones cada ve( menos abstractas, es decir, #ue
se acercan cada ve( ms a las instrucciones propias de nuestro lengua)e de programacin.
*in embargo, cuando hacemos un primer algoritmo para resolver un problema, las acciones
describen realmente la interaccin de los ob)etos involucrados en el enunciado del
problema. !or lo tanto no basta con re'inar las acciones entre ob)etos sino #ue es preciso
re'inar +o representar, los ob)etos abstractos en t%rminos de ob)etos ms concretos. Con
'recuencia, los ob)etos involucrados en el enunciado del problema no son directamente
representables en lengua)es de programacin convencionales +por e)emplo, los con)untos,-
de all la necesidad de re'inar datos. .a representacin de ob)etos abstractos en t%rminos de
ob)etos concretos lo llamamos refinamiento de datos, y presentaremos una metodologa a
seguir para llevar a cabo tal representacin.
7.1. Diseo Descendente
.a metodologa de diseo descendente de programas consiste en/
, 0e'inir una solucin de un problema en t%rminos de la composicin de soluciones
de problemas #ue a priori son ms sencillos de resolver, o de es#uemas de solucin
ya conocidos.
", .a primera solucin del problema corresponder a una composicin de acciones
sobre los ob)etos al ms alto nivel de abstraccin, es decir, a los involucrados en la
especi'icacin del problema.
$, 1plicar re'inamiento sucesivo, el cual consiste en re'inar tanto las acciones como
los datos hasta conseguir #ue el algoritmo inicial se convierta en un programa.
En esta seccin ahondaremos en la prctica del diseo descendente, tanto en re'inamiento
de acciones como de datos. &asta el momento hemos aplicado el diseo descendente slo
para re'inar acciones abstractas en t%rminos de acciones cada ve( menos abstractas, es
decir, #ue se acercan cada ve( ms a las instrucciones propias de nuestro lengua)e de
programacin. *in embargo, cuando hacemos un primer algoritmo para resolver un
problema, las acciones describen realmente la interaccin de los ob)etos involucrados en el
enunciado del problema. !or lo tanto no basta con re'inar las acciones entre ob)etos sino
#ue es preciso re'inar +o representar, los ob)etos abstractos en t%rminos de ob)etos ms
concretos, a esto 2ltimo es a lo #ue llamamos refinamiento de datos. En los e)emplos de
$
diseo descendente vistos hasta ahora, no 'ue necesario re'inar los datos pues estos
correspondan a tipos no estructurados, como los n2meros enteros, los booleanos, etc.,
considerados tipos bsicos de nuestro pseudolengua)e #ue no hace 'alta re'inar.
El principio bsico del diseo descendente es se debe programar hacia un lengua)e de
programacin y no en el lengua)e de programacin, lo #ue signi'ica partir de algoritmos en
t%rminos de los ob)etos involucrados en la especi'icacin original del problema e ir
re'inndolos hasta obtener un programa en el lengua)e de programacin #ue hayamos
escogido. 3na ve( #ue un primer algoritmo correcto es encontrado, podemos cambiar la
representacin de los ob)etos por otros para me)orar, por e)emplo, la e'iciencia +en el
Captulo 4 hablaremos de e'iciencia, y5o implementarlos en el lengua)e de programacin.
Cada ob)eto involucrado en la especi'icacin de un problema posee una estructura y
propiedades #ue lo caracteri(a. Esta estructura y propiedades de'inen la clase o el tipo del
objeto. 6as concretamente, una clase de ob)etos se de'ine por un con)unto de valores y un
comportamiento #ue viene e7presado por operaciones sobre ese con)unto de valores- por
e)emplo, el tipo n2mero entero tiene como con)unto de valores 8..., 9, :, , ", $, ...; y
como operaciones la suma, la resta, la multiplicacin, etc. El tipo secuencia de caracteres
tiene como con)unto de valores a las 'unciones de <:..n, en los caracteres, cual#uiera sea el
n2mero natural n, y algunas operaciones son obtener el primero de la secuencia, insertar un
elemento en una posicin dada de una secuencia, etc.
En un lengua)e de programacin moderno, como =1>1, #ue permite definir clases de
objetos, el re'inamiento de datos se e'ect2a construyendo una unidad de programa aparte,
llamada igualmente clase, #ue contiene segmentos de programa #ue implementan por una
parte la representacin de los ob)etos en t%rminos de las estructuras de datos #ue o'rece el
lengua)e y por otra parte, las operaciones de la clase. 0ecimos #ue =1>1 permite
encapsular la implementacin de tipos abstractos de datos. El encapsulamiento de datos
conlleva al ocultamiento de datos, es decir, el programador #ue slo desea manipular
ob)etos de un determinado tipo de datos no tiene por #u% preocuparse por cmo se
representa ese tipo en 'uncin de tipos concretos- lo #ue realmente le interesa es poder
operar con ob)etos de ese tipo, y por lo tanto la implementacin puede permanecer oculta al
programador, permiti%ndole as no involucrarse con los detalles de implementacin del tipo.
7.1.1. Tratar de resolver un problema en trminos de problemas ms
simples
El t%rmino ms simple puede signi'icar di'erentes cosas seg2n el conte7to. 3n problema
puede ser ms simple debido a #ue algunas de sus restricciones han sido omitidas
+resultando en una generali(acin del problema,. El problema puede ser ms simple por#ue,
al contrario, le hemos agregado restricciones. Cual#uiera sea el caso, la estrategia de
resolver un problema en t%rminos de problemas ms simples consiste entonces primero #ue
nada en tratar de identi'icar y resolver casos mas simples del mismo problema y tratar de
resolver el problema original utili(ando la solucin de los casos ms simples
E)emplo/
$"
!roblema/ *e #uiere encontrar un programa #ue intercambie dos segmentos de un arreglo b
con dominio <m..p,, es decir, dados m? n ? p y el arreglo b de la 'igura siguiente/
0onde @ es el valor original del arreglo b. El arreglo b #uedar modi'icado como en la
'igura siguiente/
El programa slo podr declarar un n2mero constante de variables adicionales de tipos
bsicos y utili(ar slo operaciones de intercambio de dos elementos de un arreglo ms las
propias a de los tipos bsicos.
*olucin/
ACmo comen(aramosB. *i los dos segmentos del arreglo son del mismo largo tendramos
un problema ms simple #ue resolver +e)ercicio/ &acer un procedimiento llamado
IntercambiarIguales #ue intercambie dos segmentos dis)untos de igual largo de un arreglo,
se pasar como parmetros el arreglo, el ndice inicial de cada segmento y el largo de los
segmentos a intercambiar,. *upongamos #ue el procedimiento IntercambiarIguales consiste
en intercambiar dos segmentos dis)untos de igual largo. >eamos si podemos resolver
nuestro problema en t%rminos de este problema ms simple.
*uponga por el momento #ue el segmento b<m..n, es mas largo #ue b<n..p,. Consideremos
#ue el segmento b<m..n, consiste de dos segmentos, el primero de los cuales es del mismo
largo #ue b<n..p, +ver diagrama +a, dado ms aba)o,. Entonces los segmentos de igual largo
x1 y y pueden ser intercambiados obteni%ndose el diagrama +b,- adems, el problema
original puede ser resuelto intercambiando los segmentos x2 y x1. Estas dos secciones
pueden ser de distintos largos, pero el largo del mayor segmento es menor #ue el largo del
mayor segmento del problema original, por lo #ue hemos hecho alg2n progreso.
1hora supongamos #ue en lugar del primer segmento del problema original, es el segundo
segmento el #ue tiene largo mayor, es decir, b<n..p, es ms grande. Este caso es ilustrado en
$$
m n
p9
@<m..n,
b/
@<n..p,
m mCp9n
p9
@<n..p,
b/
@<m..n,
m
mCp9n p9
x
1
b/
y
+a,
+b,
n
x
2
m
mCp9n p9
y
b/
x
1
n
x
2
el diagrama +c,, y el procedimiento IntercambiarIguales puede ser utili(ado para
trans'ormar el arreglo como en el diagrama +d,.
1hora tratemos de llevar esta idea a un programa. .os diagramas +b, y +d, indican #ue
despu%s de e)ecutar IntercambiarIguales, n siempre es el ndice in'erior de la seccin ms a
la derecha a ser intercambiada. .o cual es cierto tambi%n al comien(o.
*upongamos #ue en +b, x1 es mas largo #ue x2, tendremos la situacin siguiente/
0onde x1 = x
1
1 x
2
1 , x2 y x
2
1 tienen el mismo largo. 0espu%s de intercambiar x2 y x
2
1
mediante IntercambiarIguales obtenemos/
Dote #ue los segmentos <m..h, y <E..p, ya estn en el sitio #ue les corresponde, y hay #ue
intercambiar los subsegmentos <h..n, y <n..E, del segmento <h..E,. !or lo tanto, podemos
obtener el invariante/
*in embargo, note #ue el algoritmo re#uiere la comparacin de los largos de b<n..E, y
b<h..n,. Fambi%n, el procedimiento IntercambiarIguales re#uiere los largos de los
segmentos. !or lo tanto puede resultar me)or tomar los largos de los segmentos en lugar de
sus ndices e7tremos. !or lo #ue el invariante ! se convierte en el predicado : ? i n9m
:? ) p9n, )unto con/
$G
m
mCp9n p9
x
1
b/
y
+c,
+d,
n
x
2
m
mCp9n p9
y
b/
x
1
n
x
2
m
h
p9
Ha intercam9
biado
b/
n
Intercambiar
con b<n..E,
E
Ha intercam9
biado
Intercambiar
con b<h..n,
m
n9i
p9
Ha intercam9
biado
b/
n
Intercambiar con
b<n..nC),
nC)
Ha intercam9
biado
Intercambiar con
b<n9i..n,
+bJ,
m
mCp9n p9
y
b/
x
2
n
x
2
1
x
1
1
+bJJ,
m
h p9
y
b/
x
2
1
n
x2 x
1
1
E
E)ercicio/ e7presar el invariante ! como un predicado.
3sando la 'uncin de cota decreciente t K ma7 +i,),, el programa es como sigue/
< const m, n, p/ entero-
var b/ arreglo <m..p, de entero-
var i, )/ entero-
8 !recondicin/ m ? n ? p ;
i,) /K n9m, p9n-
8 Invariante/ !, cota/ t ;
do i L ) IntercambiarIguales+b, n9i, n, ),- i /K i9)
<M i ? ) IntercambiarIguales+b, n9i, nC)9i, i,- ) /K )9i
od-
8 ! i K ) ;
IntercambiarIguales+b, n9i, n, i,
8 !ostcondicin ;
M
Como nota interesante, resulta #ue si eliminamos del programa anterior las llamadas al
procedimiento IntercambiarIguales, el programa #ue resulta es el algoritmo de Euclides
para determinar el mximo comn divisor, !D"n#m, p#n$, de n#m % p#n- es decir, el
m7imo com2n divisor de los largos de los segmentos originales/
< const m, n, p/ entero-
var i, )/ entero-
8 !recondicin/ m ? n ? p ;
i,) /K n9m, p9n-
8 Invariante/ : ? i : ? ) 6C0+n9m, p9n, K 6C0+i,), , cota/ ma7+i,), ;
do i L ) i /K i9)
i ? ) ) /K )9i
od-
8 i K ) K 6C0+n9m,p9n, ;
M
E)ercicios/ pgina ""N del Ories.
7.1.&. 'e(inamiento de Datos
>eamos a trav%s de un e)emplo sencillo en #u% consiste el re'inamiento de datos/
!roblema/ &acer un procedimiento #ue calcule todas las soluciones comple)as de la
ecuacin 17
"
C@7CCK:, con 1, @ y C reales. *uponga #ue cuenta con una 'uncin #ue
permite calcular la ra( cuadrada de un n2mero real no negativo. .a especi'icacin de esta
'uncin es como sigue/
real Pai(Cuadrada+entrada 7 / real,
$N
8 !re/ 7KQ Q : ;
8 !ost/ devuelve Q ;
Dote #ue en la ecuacin 1.7
"
C@.7CCK:, la operacin suma +C, se reali(a sobre n2meros
comple)os, es decir, es la suma sobre n2meros comple)os, al igual #ue el producto +.,. !or lo
tanto nuestro problema involucra ob)etos #ue pertenecen a los tipos de datos +o clases,/
n2meros reales y n2meros comple)os.
Duestro pseudolengua)e nos permite hacer programas #ue manipulen tipos de datos
cuales#uiera, en particular el tipo de dato n2mero comple)o. *in embargo, cuando
programamos en un lengua)e de programacin particular, el re'inamiento de datos es
necesario llevarlo a cabo si nuestro lengua)e de programacin no provee el tipo n2mero
comple)o. 1 continuacin llevamos a cabo el desarrollo del programa en pseudolengua)e y
utili(aremos re'inamiento de datos para representar los n2meros comple)os mediante un par
de n2meros reales correspondientes a la parte real y la parte imaginaria del n2mero
comple)o.
.a especi'icacin del programa sera/
< const 1, @, C/ real-
var con)/ Con)unto de D2mero comple)o-
8 !re/ verdad ;
*
8!ost/ con) K 87 / +7 D2mero comple)o, +1.7
"
C @.7 C C K :, ; ;
M
Dote #ue la especi'icacin anterior involucra los tipos de datos n2mero real,, n2mero
comple)o y con)unto de n2meros comple)os.
Como no se impone ninguna condicin adicional a los valores de los coe'icientes del
polinomio, slo #ue sean n2meros reales, debemos hacer un anlisis por casos, pues
dependiendo de los valores de los coe'icientes tenemos di'erentes maneras de proceder para
calcular las races del polinomio. !or lo tanto, dividimos el espacio de estados en 'uncin
de los coe'icientes del polinomio y dependiendo del valor #ue %stos puedan tener, habr una
solucin algortmica distinta al problema.
!or la teora asociada a la especi'icacin del problema, el polinomio ser de segundo grado
cuando 1 : y las races vienen dadas por la ecuacin/
1 . "
C . 1 . G @ @
"
&abr dos races comple)as si el discriminante, @
"
R G.1.C, no es cero- en cuyo caso las
races comple)as son/
"
@ @ G.1.C
".1
+
y
"
@ @ G.1.C
".1
. Fendr una sola ra(
$S
comple)a si el discriminante es cero. Cuando 1 K : y @ :, el polinomio es de primer
grado, y e7istir una sola ra(. H cuando 1 K :, @ K : y C K :, todo n2mero comple)o es
solucin. Cuando 1K:, @K: y C :, no e7istir solucin.
!or lo tanto podemos hacer una especi'icacin ms concreta donde introducimos una
variable entera n #ue nos indica el n2mero de soluciones #ue tiene la ecuacin 1.7
"
C @.7 C
CK:. Tue no haya solucin ser e#uivalente a nK:. &ay una sola ra( es e#uivalente a nK
y la variable 7 contendr la ra(. &ay dos soluciones es e#uivalente a nK" y las soluciones
#uedarn almacenadas en las variables 7 y 7". Fodo n2mero comple)o es solucin de la
ecuacin 1.7
"
C @.7 C CK:, si y slo si nK$. 3na especi'icacin ms concreta +o re'inada,
sera/
< const 1, @, C/ real-
var 7, 7"/ D2mero comple)o-
var n/ entero-
8 !re/ verdad ;
*
8!ost/ +nK: + 7/ 7 D2mero comple)o/ 1.7
"
C @.7 C C : , ,
+nK + 7/ 7 D2mero comple)o/ 1.7
"
C @.7 C C K : 7 K 7 , ,
+nK" + 7/ 7 D2mero comple)o/ 1.7
"
C @.7 C C K : 7 K 7 7 K 7" , ,