Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructura de Datos y Algoritmos - Aho Hopcroft Ullman
Estructura de Datos y Algoritmos - Aho Hopcroft Ullman
me
ISBN 968-6048-19-7
www.FreeLibros.me
II]
Diseo y anlisis
de algoritmos
Escribir un program a de com putador para resolver un problem a com prende varios
pasos que van desde la form ulacin y especificacin del problem a, el diseo de la
solucin, su implantacin, prueba y documentacin, hasta la evaluacin de la solucin.
En este captulo se presenta el punto de vista de los autores sobre estos pasos. En
los captulos siguientes se analizan los algoritm os y estructuras de datos con los que
se construye la m ayor parte de los program as de com putador.
1 .1
www.FreeLibros.me
Algoritmos
Cuando ya se cuenta con un modelo m atem tico adecuado del problem a, puede bus
carse una solucin en funcin de ese modelo. El objetivo inicial consiste en hallar
una solucin en form a de algoritmo, que es una secuencia finita de instrucciones,
cada una de las cuales tiene un significado preciso y puede ejecutarse con una can
tidad finita de esfuerzo en un tiem po finito. U na proposicin de asignacin entera
com o x\ - y + z es un ejem plo de instruccin que puede ejecutarse con una cantidad
finita de esfuerzo. Las instrucciones de un algoritm o pueden ejecutarse cualquier n
m ero de veces, siem pre que ellas m ism as indiquen la repeticin. No obstante, se exi
ge que un algoritm o term ine despus de ejecutar un nm ero finito de instrucciones,
sin im portar cules fueron los valores de entrada. As, un program a es un algoritmo
m ientras no entre en un ciclo infinito con ninguna entrada.
Es necesario aclarar un aspecto de esta definicin de algoritmo. Se ha dicho que
cada instruccin de un algoritm o debe tener un significado preciso y debe ser eje
cutable con una cantidad finita de esfuerzo; pero lo que est claro para una per
sona, puede no estarlo para otra, y a m enudo es difcil dem ostrar de m anera rigurosa
que una instruccin puede realizarse en un tiem po finito. A veces, tam bin es difcil
dem ostrar que una secuencia de instrucciones term ina con alguna entrada, aunque
est muy claro el significado de cada instruccin. Sin em bargo, al argum entar en fa
vor y en contra, por lo general se llega a un acuerdo respecto a si una secuencia de
instrucciones constituye o no un algoritm o. Q uien afirm e tener un algoritmo debe
asum ir la responsabilidad de dem ostrarlo. En la seccin 1.5 se ver cm o estim ar el
tiem po de ejecucin de algunas construcciones usuales con lenguajes de program a
cin de las que se puede dem ostrar que requieren de un tiem po finito de ejecucin.
Adem s de usar program as en Pascal com o algoritmos, se em plear un seudolenguaje que es una com binacin de las construcciones de un lenguaje formal de pro
gram acin con proposiciones inform ales expresadas en espaol. Se utilizar Pascal
com o lenguaje de program acin, pero para realizar los algoritm os que se estudiarn,
ste puede sustituirse casi por cualquier otro lenguaje conocido. El ejemplo que se
da a continuacin ilustra m uchos de los pasos que com ponen la escritura de un pro
grama de com putador, de acuerdo con el esquem a de los autores.
Ejemplo 1.1. Un m odelo m atem tico puede ayudar a disear un semforo para una
interseccin com plicada de calles. Para construir la secuencia de seales, se crear
un program a que acepte como entrada el conjunto de giros permisibles en una in
terseccin (un giro tam bin ser continuar en lnea recta por una calle) y que di
vida este conjunto en el m enor nm ero posible de grupos, de m anera que todos los
giros de un grupo sean perm isibles en form a sim ultnea sin colisiones. Despus, se
asociar una seal del sem foro a cada grupo de giros. Buscando una divisin que
tenga el m enor nm ero posible de grupos, se obtendr un sem foro con el m enor n
m ero posible de fases.
Se tom ar com o ejem plo la interseccin de la figura 1.1, donde las calles C y E
www.FreeLibros.me
son de una direccin, m ientras las restantes son de dos. En esta interseccin es po
sible realizar 13 giros. Algunos pares de giros, com o A B (de A hacia B) y EC. pueden
ocurrir en form a sim ultnea, m ientras que otros, como AD y EB. ocasionan el cruce
entre lneas de trfico y, por tanto, no pueden realizarse al m ismo tiem po. As, las
luces del semforo deben perm itir los giros en un orden tal que AD y EB nunca
ocurran al m ism o tiem po, en tanto que A B y E C puedan ser sim ultneos.
Fig. 1.1.
Una interseccin.
www.FreeLibros.me
Fig. 1.2.
AB
AB
AC
AD
BA
BC
BD
DA
DB
DC
EA
EB
EC
ED
I
1
1
AC
AD
BA
BC
BD
DA
DB
I
1
1
1
DC
EA
EB
EC
l
l
1
1
1
1
1
1
l
l
I
I
1
I
1
1
1
Fig. 1.3.
1
1
1
1
1
l
l
ED
l
l
l
www.FreeLibros.me
Este enfoque recibe el nom bre vido porque le asigna color a un vrtice en
cuanto le es posible, sin considerar las potenciales desventajas inherentes a tal ac
cin. Hay situaciones en las que podran colorearse m s vrtices con un m ism o co
lor si fuera m enos vido y pasara por alto algn vrtice que legalmente se po
dra colorear. Por ejemplo, considrese el grafo de la figura 1.4, donde, despus de
colorear con rojo el vrtice 1, se puede asignar el m ismo color a los vrtices 3 y 4,
siem pre que no se coloree antes el vrtice 2. Si se consideran los vrtices en orden
numrico, con el algoritm o exhaustivo se asignara el color rojo a los vrtices 1 y 2.
Como ejemplo del enfoque vido aplicado a la figura 1.2. supngase que se
em pieza por asignar a A B el color azul. Se pueden colorear AC. AD y BA de azul,
pues ninguno de estos tres vrtices tiene una arista com n con AB. No es posible asig
nar el color azul al vrtice BC. porque existe una arista entre AB y BC. Del m ismo
modo, no se pueden colorear de azul BD, DA ni DB. porque estn unidos por una
arista a uno o ms vrtices de los ya coloreados. Sin em bargo, s se puede asignar el
azul a DC. As, EA, EB y E C no se pueden colorear con azul, pero ED s.
www.FreeLibros.me
Ahora se em pieza con el segundo color, por ejem plo, coloreando B C de rojo. BD
puede colorearse de rojo, pero DA no, a causa de la arista entre BD y DA. De igual
manera, a DB no se le puede asignar el color rojo y D C ya es azul, pero EA s se pue
de colorear de rojo. Los dem s vrtices sin color tienen ahora una arista con un vr
tice rojo, de m odo que ningn otro vrtice puede ser rojo.
Los vrtices que an no tienen color son DA, DB, E B y EC. Si se colorea DA de
verde, DB tam bin podr ser verde, pero E B y E C no. Estos deben colorearse con
un cuarto color, por ejem plo, am arillo. La asignacin de colores se resume en la fi
gura 1.5. Al aplicar el enfoque vido se determ ina que los giros adicionales
de cierto color son com patibles con aquellos que ya tenan asignado ese mismo co
lor y entre s. Cuando el sem foro perm ita giros de un color, tam bin perm itir los
giros adicionales sin colisiones.
color
giros
giros adicionales
azul
rojo
verde
am arillo
BA, DC. ED
AD, BA, DC, ED
BA, DC, EA, ED
Fig. 1.5.
El enfoque vido no siem pre usa el m enor nm ero posible de colores. Aho
ra, es posible utilizar de nuevo la teora de algoritm os para evaluar la bondad de la
solucin obtenida. En teora de grafos, un grafo completo-k es un conjunto de k vr
tices donde cada par de ellos est unido por una arista. Puesto que en un grafo com
pleto no hay dos vrtices a los que se pueda asignar el m ism o color, es obvio que se
necesitan k colores para colorear un grafo completo-/c.
En el grafo de la figura 1.2, el conjunto de cuatro vrtices AC, DA, BD y E B es
un grafo completo-4. Para este grafo no existe, pues, una coloracin posible con tres
colores o m enos y, por tanto, la solucin de la figura 1.5 es ptim a en el sentido de
que usa el m enor nm ero posible de colores. Para el problem a original, ningn se
m foro puede tener m enos de cuatro fases para la interseccin de la figura 1.1.
As pues, considrese el control de un sem foro basado en la figura 1.5, donde
cada fase del control corresponde a un color. En cada fase, se perm iten los giros in
dicados en la fila de la tabla que corresponde a ese color, y se prohben los restantes.
Este m odelo utiliza el m enor nm ero posible de fases.
U na vez que se tiene un m odelo m atem tico apropiado para un problem a, puede for
m ularse un algoritm o basado en ese modelo. Las versiones iniciales del algoritmo a
m enudo estn mezcladas en proposiciones generales que debern refinarse despus
en instrucciones m s pequeas y definidas. Por ejemplo, se ha descrito el algoritmo
vido de coloracin de grafos con expresiones del tipo elegir algn vrtice no
coloreado. Es de esperar que esas instrucciones sean lo bastante claras para com
www.FreeLibros.me
prender el razonam iento. Sin embargo, para convertir en program a un algoritm o tan
informal, es necesario pasar por varias etapas de form alizacin (refinam iento por pa
sos) hasta llegar a un program a cuyos pasos tengan un significado form alm ente de
finido en el m anual de algn lenguaje de program acin.
Ejemplo 1.2. Considrese el algoritm o vido de coloracin de grafos con el fin de
convertirlo en un program a en Pascal. A continuacin, se supondr que existe un grafo G con algunos vrtices que pueden colorearse. El siguiente program a vido deter
mina uri conjunto de vrtices llam ado nue-color a los cuales se puede asignar un nue
vo color. Se llama repetidas veces al program a hasta colorear todos los vrtices. Sin
entrar en detalles, se puede especificar vido en seudolenguaje como se m uestra en
la figura 1.6.
(1)
(2)
(3)
(4)
(5)
www.FreeLibros.me
zar en form a com pleta para el program a de este ejem plo, pero s se dar un ejem
plo de refinam iento, transform ando la proposicin if de la lnea (3) de la figura 1.6 en
un cdigo ms convencional.
Para probar si un vrtice v es adyacente a otro vrtice de nue-color, se puede con
siderar cada m iem bro w de nue-color y exam inar el grafo G para determ inar la
existencia de una arista entre v y w. U na m anera organizada de realizar esta prueba
consiste en utilizar una variable booleana encontrado que indique si se ha encontra
do una arista. D e este m odo, las lineas (3) a (5) de la figura 1.6 pueden reemplazarse
por el cdigo de la figura 1.7.
(1)
(2)
(3.1)
(3.2)
(3.3)
(3.4)
(3.5)
(4)
(5)
Fig. 1.7.
www.FreeLibros.me
se m uestra en la figura 1.8. Despus de esto, an hay refinam ientos por hacer, pero
se har una pausa para repasar lo estudiado.
procedure vido ( var G: G RA FO ; var nue-color. LISTA );
I vido asigna a nue-color los vrtices a los que se
puede dar el m ism o color i
var
encontrado: boolean;
v, vv; integer;
begin
n u e .c o lo r 0 ;
v prim er vrtice no coloreado de G\
while v < > nulo do begin
encontrado := false;
w
prim er vrtice de nue-color.;
while w < > nulo do begin
if hay una arista entre v y w en G then
e n c o n t r a d o true;
w
siguiente vrtice de nue-color,;
end;
if encontrado - false do begin
m arca v com o coloreado;
agrega v a nue.color,
end;
v siguiente vrtice no coloreado de G
end
end; f vido i
Fig. 1.8.
Resumen
En la figura 1.9 se representa el proceso de program acin tal com o se tratar en este
libro. La prim era etapa es la m odelacin, m ediante un modelo m atem tico apropia
do, como un grafo. En esta etapa, la solucin del problem a es un algoritm o expre
sado de m anera muy informal.
En la siguiente etapa, el algoritm o se escribe en seudolenguaje, es decir, en una
mezcla de construcciones de Pascal y proposiciones m enos form ales en espaol. Esta
etapa se alcanza sustituyendo el espaol inform al por secuencias de proposiciones
cada vez m s detalladas, en un proceso denom inado refinam iento por pasos. En al
gn punto de este proceso, el program a en seudolenguaje estar suficientem ente de
tallado para que las operaciones que se deban realizar con los distintos tipos de da
www.FreeLibros.me
10
tos estn bien determ inadas. Entonces, se crean los tipos de datos abstractos para
cada tipo de datos (con excepcin de los datos de tipo elem ental como los enteros,
los reales o las cadenas de caracteres) dando un nom bre de procedim iento a cada ope
racin y sustituyendo los usos de las operaciones por invocaciones a los procedi
m ientos correspondientes.
modelo
m atem tico
tipos de datos
abstractos
estructuras
de datos
algoritm o
inform al
program a en
seudolenguaje
program a
en Pascal
Fig. 1.9.
En la tercera etapa, se elige una aplicacin para cada tipo de datos abstracto y se
escribe el procedim iento que corresponde a cada operacin con ese tipo. Tambin
se reem plaza por cdigo Pascal toda proposicin inform al que quede en el algorit
m o en seudolenguaje. El resultado ser un program a ejecutable. Despus de depu
rarlo, ser un program a operativo y se espera que por haber aplicado el desarrollo
por pasos bosquejado en la figura 1.9, se requiera poca depuracin.
1 .2
www.FreeLibros.me
TIPO S DE D A TO S ABSTRACTOS
11
ANULA (nue-Color)\
w :- PR IM ER O (nue.color)-,
w :- SIG U IEN TE (n ue.color)\
INSERTA (v, nue-Color)\
www.FreeLibros.me
12
gura 1.8, que utilizan objetos de ese tipo sufran cambios; solam ente cam bian los pro
cedim ientos que aplican las operaciones en el tipo.
V olviendo al tipo de datos abstracto GRA FO , se observa la necesidad de las si
guientes operaciones:
1.
2.
3.
4.
Es evidente que se necesitan otras operaciones fuera del procedim iento vido,
como insertar vrtices y aristas en un grafo y m arcar todos sus vrtices com o no co
loreados. Hay m uchas estructuras de datos que se pueden usar para apoyar grafos
con estas operaciones; este tem a se estudia en los captulos 6 y 7.
Es im portante resaltar el hecho de que no hay lm ite para el nm ero de opera
ciones que se pueden aplicar a diversos casos de un m odelo m atem tico dado. Cada
conjunto de operaciones define un TDA distinto. Algunos ejem plos de operaciones
que podran definirse con un tipo de datos abstracto C O N JU N TO son los siguientes:
1.
2.
3.
ANULA(/1). Este procedim iento hace que el valor del conjunto A sea el conjunto
vaco.
U N ION(/l, B, Q . Este procedim iento tom a dos argumentos, A y B, cuyos valo
res son conjuntos, y hace que el conjunto C tom e el valor de la unin de A y B.
TAM AO(/l). Esta funcin tom a un argum ento A, cuyo valor es un conjunto,
y devuelve un objeto de tipo entero cuyo valor es el nm ero de elem entos de A.
www.FreeLibros.me
1 .3
13
Aunque los trm inos tipo de datos (o sim plem ente tipo), estructura de datos
y tipo de datos abstracto parecen sem ejantes, su significado es diferente. En un
lenguaje de program acin, el tipo de datos de una variable es el conjunto de valores
que sta puede tom ar. Por ejemplo, una variable de tipo booleano puede tom ar los
valores verdadero o falso, pero ningn otro. Los tipos de datos bsicos varan de un
lenguaje a otro; en Pascal son entero (integer), real (real), booleano (boolean) y ca
rcter (char). Las reglas para construir tipos de datos com puestos a partir de los b
sicos tam bin varan de un lenguaje a otro; se ver ahora la construccin de esos ti
pos en Pascal.
Un tipo de datos abstracto es un m odelo m atem tico, ju n to con varias operacio
nes definidas sobre ese modelo. Tal como se indic, en este libro se disearn los
algoritmos en funcin de los TD A , pero para im plantar un algoritm o en un lenguaje
de program acin determ inado debe hallarse alguna m anera de representar los TDA
en funcin de los tipos de datos y los operadores m anejados por ese lenguaje. Para
representar el m odelo m atem tico bsico de un TDA, se em plean estructuras de da
tos, que son conjuntos de variables, quiz de tipos distintos, conectadas entre s de di
versas formas.
El com ponente bsico de una estructura de datos es la celda. Se puede representar
una celda como una caja capaz de alm acenar un valor tom ado de algn tipo de d a
tos bsico o compuesto. Las estructuras de datos se crean dando nom bres a agrega
dos de celdas y (opcionalm ente) interpretando los valores de algunas celdas como
representantes de conexiones entre celdas (por ejem plo, los apuntadores).
El mecanism o de agregacin m s sencillo en Pascal y en la m ayor parte de los
lenguajes de program acin es el arreglo (unidim ensional), que es una sucesin de cel
das de un tipo dado al cual se llam ar casi siem pre tipo_celda. Se puede im aginar
un arreglo com o una transform acin del conjunto ndice (com o los enteros
l, 2, .... n) al tipo tipo-celda. Se puede hacer referencia a una celda de un arreglo
d ando el nom bre del arreglo en unin de un valor tom ado del conjunto ndice del
arreglo. En Pascal, el conjunto ndice puede ser un tipo enum erado definido por el
program ador, como (norte, sur, este, oeste), o un subrango com o L.IO. Los valores
de las celdas de un arreglo pueden ser de cualquier tipo. As, la declaracin
nombre, array [tipo_ndice] of tipo_celda;
indica que nombre es una sucesin de celdas, una por cada valor del tipo tipo_ndice; el contenido de las celdas puede ser cualquier m iem bro del tipo tipo_celda.
A propsito de esto, Pascal tiene una riqueza considerable de tipos ndice. M u
chos lenguajes slo adm iten subrangos (conjuntos finitos de enteros consecutivos)
como tipos ndice. Por ejemplo, en FO RTRA N, para indizar un arreglo con letras,
debe sim ularse el efecto utilizando ndices enteros, como el ndice l para represen
tar la A \ el 2 para la B, y as sucesivamente.
O tro m ecanism o habitual para agrupar celdas en los lenguajes de program acin
es la estructura de registro. Un registro es una celda constituida por un conjunto de
celdas llam adas campos, que pueden ser de tipos distintos. A m enudo, los registros
www.FreeLibros.me
14
Apuntadores y cursores
Adems de las caractersticas de agrupacin-celdas de un lenguaje de program acin,
es posible representar relaciones entre celdas m ediante apuntadores y cursores. Un
apuntador es una celda cuyo valor ndica o seala a otra. Cuando se representan gr
ficamente estructuras de datos, el hecho de que una celda A sea un apuntador a la
celda B se indica con una flecha de A a B.
En Pascal, se puede crear una variable ap que apunte a celdas de un tipo deter
m inado, com o tipo_celda, m ediante la declaracin
var
ap: t tipo_celda
En Pascal se utiliza una flecha ascendente postfija com o operador de desreferenciacin. As, la expresin ap t denota el valor (de tipo tipo_celda) de la celda a la que
apunta ap.
U n cursor es una celda de valor entero que se utiliza como apuntador a un arre
glo. Com o m todos de conexin, cursores y apuntadores son en esencia lo mismo,
con la diferencia de que un cursor se puede utilizar en lenguajes que, como FO R
TRAN, carecen de los tipos apuntadores explcitos que tiene Pascal. Al tratar una
celda de tipo entero como un valor ndice para un arreglo, se hace que esa celda apun
te a una celda del arreglo. D esafortunadam ente, esta tcnica slo sirve para apuntar
a celdas contenidas en un arreglo; no hay m anera razonable de interpretar un entero
como un apuntador a una celda que no sea parte de un arreglo.
En este texto, se dibujar una flecha desde una celda cursor hacia la celda a la
www.FreeLibros.me
15
que apunta. En ocasiones, se m ostrar tam bin el entero de la celda cursor, para
recordar que no se trata de un verdadero apuntador. El lector debe observar que el
m ecanism o apuntador de Pascal es tal que a las celdas de los arreglos slo se puede
apuntan) con cursores, y no con verdaderos apuntadores. C iertos lenguajes, como
PL/I o C, perm iten que los com ponentes de un arreglo sean apuntados tanto por cur
sores como por apuntadores, m ientras que en otros, com o FORTRAN o ALGOL,
no existe el tipo apuntador y slo es posible usar cursores.
Ejemplo 1.3. En la figura 1.10 se observa una estructura de datos con dos partes,
constituida por una cadena de celdas que contienen cursores al arreglo lista-reg de
finido antes. El propsito del cam po siguiente de lista-reg es apuntar a otro registro
del arreglo. Por ejem plo, lista-reg [4], siguiente es 1, por tanto, el registro 4 va se
guido del registro 1. Si se supone que el registro 4 es el prim ero, el cam po siguiente
de lista-reg ordena los registros en la secuencia 4, 1 ,3 , 2. Obsrvese que el campo
siguiente del registro 2 es 0, lo cual indica que no existe un registro que lo siga. Una
convencin til que se adoptar en este libro consiste en usar 0 como un apunta
dor N1L cuando se trabaje con cursores. Esto slo da buenos resultados si tam bin
se adopta la convencin de que los arreglos a los que apuntan cursores han de indizarse a partir de 1, no de 0.
encabezamiento
5 .6
7 .8
datos siguiente
lista-reg
Fig. 1.10.
www.FreeLibros.me
16
1 .4
t El registro no tiene nom bre conocid o porque se cre con una llam ada new (en ca b eza m ien to) cuyo efecto
fue que e n c a bezam iento apuntara a ese registro recin creado. N o obstante, en el interior de la mquina existe
una direccin de m em oria que puede em plearse para localizar la celda.
www.FreeLibros.me
3.
4.
17
www.FreeLibros.me
18
cir que el tiem po de ejecucin T{n) de un program a es 0 {n2), que se lee o mayscula
de n al cuadrado o tan slo o de n al cuadrado, significa que existen constantes
enteras positivas c y n0 tales que para n m ayor o igual que n0. se tiene que T(n) < en2.
Ejemplo 1.4. Supngase que 7X0) - 1, 7X1) - 4, y en general T(n) - {n + l)2. En
tonces se observa que T(n) es 0 (n 2) cuando n0 - 1 y c - 4; es decir, para n > 1, se
tiene que (n+1)2 < 4 n2, que es fcil de dem ostrar. Obsrvese que no se puede hacer
n0 - 0, pues 7X0) -1 no es m enor que c02 - 0 para ninguna constante c.
A continuacin, se supondr que todas las funciones del tiem po de ejecucin es
tn definidas en los enteros no negativos, y que sus valores son siem pre no negati
vos, pero no necesariam ente enteros. Se dice que 7\n) es (XJ\n)) si existen constan
tes positivas c y n0 tales que T(n) < cf{n) cuando n > n0. Cuando el tiem po de eje
cucin de un program a es (XJln)), se dice que tiene velocidad de crecimiento f(n).
Ejemplo 1.5. La funcin T(n) - 33 + 2n2 es 0 { n }). Para com probar esto, sean n0 - 0
y c - 5. Entonces, el lector puede m ostrar que para n > 0, 3n 3 + 2n 2 < 5n 2. Tam
bin se podra decir que T(n) es 0 ( n A), pero sera una aseveracin m s dbil que de
cir que T(n) es 0 { n 3).
A m anera de segundo ejemplo, se dem ostrar que la funcin 3" no es 0(2"). Para
esto, supngase que existen constantes n0 y c tales que para todo n > n0. se tiene que
3" < c2". Entonces, c > (3/2) para cualquier valor de n > n0. Pero (3/2)" se hace
arbitrariam ente grande conform e n crece y, por tanto, ninguna constante c puede
ser m ayor que (3/2)" para toda n.
Cuando se dice que T(n) es 0(f{n)), se sabe que /(/?) es una cota superior para la
velocidad de crecim iento de T(n). Para especificar una cota inferior para la veloci
dad de crecim iento de T{n), se usa la notacin T(n) es 2 (g(n)), que se lee T(n) es
omega m ayscula de g(n) o sim plem ente T(n) es omega de g{n), lo cual significa
que existe una constante c tal que 7(n) > cg(n) para un nm ero infinito de valores
de n t.
Ejemplo 1.6. Para verificar que la funcin T(n) - n2 + 2/i2 es 2(n3), sea c - 1. En
tonces, T(n) > e n 3 para n - 0, 1, ...
En otro ejemplo, sea l\n ) = n para n > 1 impar, y sea T\n) - 2/100 para n > 0
par. Para verificar que T(n) es 2(n2), sea c - 1/100 y considrese el conjunto infini
to de valores de n : n - 0, 2, 4, 6, ....
www.FreeLibros.me
19
cin 0 ( n 3) por ejemplo. Sin embargo, adem s de los factores constantes debidos al
com pilador y a la m quina, existe un factor constante debido a la naturaleza del pro
grama m ismo. Es posible, por ejemplo, que con una com binacin determ inada de
com pilador y m quina, el prim er program a tarde 1002 milisegundos, m ientras el
segundo tarda 5n 3 milisegundos. En este caso, no es preferible el segundo program a
al primero?
La respuesta a esto depende del tam ao de las entradas que se espera que pro
cesen los programas. Para entradas de tam ao n < 20, el program a con tiem po de
ejecucin 5n3 ser m s rpido que el de tiem po de ejecucin 100n2. As pues, si el
program a se va a ejecutar principalm ente con entradas pequeas, ser preferible el
program a cuyo tiem po de ejecucin es 0 ( n 3). No obstante, conform e n crece, la ra
zn de los tiem pos de ejecucin, que es 5rz3/100n2 = n i20, se hace arbitrariam ente
grande. As, a m edida que crece el tam ao de la entrada, el program a 0 ( n 3) requiere
un tiem po significativam ente m ayor que el program a 0 { n 2). Pero si hay algunas en
tradas grandes en los problem as para cuya solucin se estn diseando estos dos pro
gramas, ser m ejor optar por el program a cuyo tiem po de ejecucin tiene la m enor
velocidad de crecimiento.
O tro m otivo para al m enos considerar program as cuyas velocidades de creci
m iento sean lo m s pequeas posible, es que bsicam ente es la velocidad del creci
m iento quien determ ina el tam ao de problem a que se puede resolver en un com
putador. Para decirlo de otro m odo, conform e los com putadores se hacen ms ve
loces, tam bin aum entan los deseos del usuario de resolver con ellos problem as ms
grandes; sin embargo, a m enos que un program a tenga una velocidad de crecim ien
to baja, com o 0 (n ) u 0(/ilogn), un increm ento m odesto en la rapidez de un com pu
tador no influye gran cosa en el tam ao del problem a m s grande que es posible re
solver en una cantidad fija de tiempo.
Fig. 1.11.
www.FreeLibros.me
20
Ejemplo 1.7. En la figura 1.11 se pueden ver los tiem pos de ejecucin de cuatro pro
gramas de distintas com plejidades de tiem po, m edidas en segundos, para una com
binacin determ inada de com pilador y m quina. Supngase que se dispone de 1000
segundos, o alrededor de 17 m inutos, para resolver un problem a determ inado. Qu
tam ao de problem a se puede resolver? Com o se puede ver en la segunda columna
de la figura 1.12, los cuatro algoritm os pueden resolver problem as de un tam ao si
m ilar en 103 segundos.
Supngase ahora que se adquiere una m quina que funciona diez veces ms r
pido sin costo adicional. Entonces, con el m ism o costo, es posible dedicar 104 segun
dos a la solucin de problem as que antes requeran 103 segundos. El tam ao m xi
m o de problem a que es posible resolver ahora con cada uno de los cuatro programas
se m uestra en la tercera colum na de la figura 1.12, y la razn entre los valores de
las colum nas segunda y tercera se m uestra en la cuarta. Se observa que un aum ento
del 1000% en la velocidad del com putador origina apenas un increm ento del 30%
en el tam ao de problem a que se puede resolver con el program a 0(2"). Los au
m entos adicionales de un factor de diez en la rapidez del com putador a partir de
este punto originan aum entos porcentuales an m enores en el tam ao de los proble
mas. D e hecho, el program a 0 (2") slo puede resolver problem as pequeos, inde
pendientem ente de la rapidez del com putador.
T iem po de
ejecucin
T(n)
T am ao m xim o
de problem a
para 103 seg
IOOh
5 n*
nV2
2"
10
14
12
10
Fig. 1.12.
T am ao m xim o
de problem a
para 104 seg
100
45
27
13
Increm ento en el
tam ao mximo
de problem a
10.0
3.2
2.3
1.3
www.FreeLibros.me
CA LCU LO DEL T IE M PO D E E JE C U C IO N DE U N PR O G R A M A
21
Aspectos importantes
Es necesario subrayar de nuevo que la velocidad de crecim iento del tiem po de eje
cucin del peor caso no es el nico criterio, ni necesariam ente el m s im portante,
para evaluar un algoritm o o un program a. A continuacin se presentan algunas con
diciones en las cuales el tiem po de ejecucin de un program a se puede ignorar en
favor de otros factores.
1.
1 .5
www.FreeLibros.me
22
r,(n ) < c, Ari), y si n > n2, entonces T2(n) < cg(n). Sea n0 - m x(n n2). Si
n > n0, entonces T ,(n) + T 2(n) < c ^ n ) + c ^ n ) . De aqu se concluye que si n > n0,
entonces 7j(n) + Tn) < (c, + CjjmxOfn), g(n)); por tanto, 7j(n) + T^n) es <9(mx0(n),
<)))
Ejemplo 1.8. La regla de la sum a anterior puede usarse para calcular el tiem po de
ejecucin de una secuencia de pasos de program a, donde cada paso puede ser un frag
m ento de program a arbitrario con ciclos y ramificaciones. Supngase que se tienen
tres pasos cuyos tiem pos de ejecucin son, respectivam ente, 0 ( n 2), 0 ( n }) y 0(nlogn).
Entonces, el tiem po de ejecucin de los dos prim eros pasos ejecutados en secuencia
es 0 (m x (n 2, n 3)) que es 0 { n 3). El tiem po de ejecucin de los tres juntos es 0(m x(3,
nlogn)), que es 0 ( n 3).
En general, el tiem po de ejecucin de una secuencia fija de pasos, dentro de un
factor constante, es igual al tiem po de ejecucin del paso con m ayor tiem po de eje
cucin. En raras ocasiones dos pasos pueden tener tiem pos de ejecucin inconmen
surables (ninguno es m ayor que el otro, ni son iguales). Por ejemplo, puede haber
pasos con tiem pos de ejecucin 0{J[n)) y 0{g{n)), donde
n2 si n es par
n 3 si n es im par
En tales casos, la regla de la sum a debe aplicarse directam ente; en el ejemplo, el tiem
po de ejecucin es 0(m x(/{n), g(n))), esto es, n* si n es par y n3 si es impar.
O tra observacin til sobre la regla de la sum a es que si g{ri) < ./( ) para toda n
m ayor que una constante n0, entonces 0(J[n) + gin)) es lo m ism o que 0(J[n)). Por
ejem plo, 0 { n 2 + n) es lo m ism o que 0 ( n 2).
La regla de! producto es la siguiente: si r ,( ) y T2(n) son 0(J{n)) y CHg(n)), res
pectivam ente, entonces T t(n )T 2(n) es 0(J{n)g(n)). Se aconseja probar este hecho con
las m ism as ideas que se utilizaron para probar la regla de la suma. Segn la regla
del producto, 0(cj{nj) significa lo m ismo que 0{J[nj) si c es una constante positiva
cualquiera. Por ejem plo, CKn2/ ! ) es lo m ism o que 0 ( n 2).
Antes de pasar a las reglas generales de anlisis de los tiem pos de ejecucin de
los program as, se presentar un ejem plo sencillo para proporcionar una visin gene
ral del proceso.
Ejemplo 1.9. Considrese el program a de clasificacin burbuja de la figura 1.13,
que ordena un arreglo de enteros de m enor a mayor. El efecto total de cada recorri
do del ciclo interno de las proposiciones (3) a (6), es hacer que el m enor de los ele
m entos suba hasta el principio del arreglo.
El nm ero n de elem entos que se van a clasificar es la m edida apropiada del ta
m ao de la entrada. La prim era observacin que se hace es que cada proposicin
de asignacin tom a cierta cantidad constante de tiem po, independiente del tam ao
de la entrada. Esto significa que las proposiciones (4), (5) y (6) tom an tiem po (9(1)
cada una. Obsrvese que (9(1) es la notacin o mayscula de una cantidad constan
te. Por la regla de la sum a, el tiem po de ejecucin com binado de este grupo de pro
posiciones es (9(m x(l, 1, 1)) - (9(1).
www.FreeLibros.me
23
(1)
(2)
(3)
(4)
(5)
(6)
Clasificacin burbuja.
que se debe ir de dentro hacia fuera para obtener el tiem po de ejecucin del grupo
condicional y de cada ciclo. En cuanto a la proposicin if, la prueba de la condicin
requiere tiem po 0(1). No se sabe si el cuerpo de la proposicin if (lneas (4) a (6))
se ejecutar, pero dado que se busca el tiem po de ejecucin del peor caso, se supone
lo peor, esto es, que se ejecute. Por tanto, el grupo if de las proposiciones (3) a (6)
requiere tiem po 0(1).
As, siguiendo hacia fuera, se llega al ciclo for de las lineas (2) a (6). La regla ge
neral para un ciclo es que el tiem po de ejecucin total resulta de sum ar, en cada ite
racin, los tiem pos em pleados en ejecutar el cuerpo del ciclo en esa iteracin. Debe
acum ularse al m enos 0(1 ) por cada iteracin para justificar el increm ento del ndice,
con el fin de verificar si se alcanz el lm ite y para saltar de vuelta al principio del
ciclo. Para el ciclo de las lneas (2) a (6), el cuerpo tarda tiem po 0 (1 ) en cada ite
racin. El nm ero de iteraciones es n -i, de m odo que, por la regla del producto, el
total de tiem po invertido en el ciclo de las lneas (2) a (6) es 0 ((n -i)x 1), o sea,
CKn-i).
Se sigue ahora con el ciclo externo, el cual contiene todas las proposiciones eje
cutables del program a. La proposicin (1) se ejecuta n - \ veces, de m anera que el
tiem po total de ejecucin del program a tiene com o cota superior una constante mul
tiplicada por
n-1
y . (n -i) - n ( n - 1)/2 = n2/2 - n/2
1-1
que es 0 (n 2). Por tanto, para ejecutar el program a de la figura 1.13 se necesita un
tiem po proporcional al cuadrado del nm ero de elem entos que se van a clasificar.
www.FreeLibros.me
24
t A m enos que se especifique lo contrario, todos los logaritmos son de base 2. Obsrvese que O(logzi) no
depende de la base del logaritm o, puesto que log^n - d og/i, d o n d e c - log6.
www.FreeLibros.me
25
Llamadas a procedimientos
Si se tiene un program a con procedim ientos que no son recursivos, es posible calcu
lar el tiem po de ejecucin de los distintos procedim ientos, uno a la vez, partiendo
de aquellos que no llam an a otros. (Recurdese que la invocacin a una funcin debe
considerarse una llam ada.) Debe haber al m enos un procedim iento con esa carac
terstica, a m enos que com o m nim o un procedim iento sea recursivo. Despus, pue
de evaluarse el tiem po de ejecucin de los procedim ientos que slo llam an a proce
dim ientos que no hacen llam adas, usando los tiem pos de ejecucin de los procedi
m ientos llam ados evaluados antes. Se contina el proceso evaluando el tiem po de
ejecucin de cada procedim iento despus de haber evaluado los tiem pos correspon
dientes a los procedim ientos que llama.
Si hay procedim ientos recursivos, no es posible ordenar las evaluaciones de m odo
que cada una utilice slo evaluaciones ya realizadas. Lo que se debe hacer ahora es
asociar a cada procedim iento recursivo una funcin de tiem po desconocida T(n),
donde n m ide el tam ao de los argum entos del procedim iento. Luego se puede ob
tener una recurrencia para T(n), es decir, una ecuacin para T(n) en funcin de T(k)
para varios valores de k.
Se conocen ya tcnicas para resolver varias clases de recurrencias; algunas de ellas
se presentarn en el captulo 9. Aqu se m ostrar cm o analizar un program a recur
sivo sencillo.
Ejemplo 1.10. La figura 1.14 m uestra un program a recursivo para calcular !, que
es el producto de todos los enteros de 1 a n inclusive.
U na m edida de tam ao apropiado para esta funcin es el valor de n. Sea T(n)
el tiem po de ejecucin para fact(n). El tiem po de ejecucin para las lneas (1) y (2)
es 0(1), y para la lnea (3) es 0 (1 ) + T (n -l). Por tanto, para ciertas constantes c y d,
c + T ( n - 1)
si n >
si n < 1
( 1)
(2)
(3)
function fa c ( n: in te g e r) : integer;
Ifact(n) calcula !}
begin
if n < = 1 then
fa c 1
else
fa c
n * fa c t(n -1)
end; | f a c )
Fig. 1.14.
www.FreeLibros.me
1- 1)
26
si n > 3
si n > i
(1.2)
P o r (1.2) se concluye que T(n) es O(n). Es im portante observar que en este anlisis
se ha supuesto que la m ultiplicacin de dos enteros es una operacin de tiem po 0 ( 1).
En la prctica, no obstante, no se puede em plear el program a de la figura 1.14 para
calcular n! cuando los valores de n son grandes, pues el tam ao de los enteros que
se calculen exceder del tam ao de palabra de la m quina en cuestin.
El m todo general para resolver una ecuacin de recurrencia, tal como se tipifica
en el ejem plo 1.10, consiste en reem plazar en forma repetida trm inos T(k) del lado
derecho de la ecuacin por el lado derecho completo, donde k se reemplaza por n.
hasta obtener una frm ula en la que T no aparezca en el lado derecho como en (1.2).
A m enudo es necesario calcular la sum a de una sucesin o, si no es posible encon
tra r la sum a exacta, obtener una cota superior cercana para la suma a fin de hallar
una cota superior para T(n).
www.FreeLibros.me
27
sta es la nica clase de goto que est justificada.) Puesto que es probable que se eje
cute el goto en form a condicional dentro del ciclo, se puede suponer que nunca se
efecta. Debido a que el goto transfiere el control a una proposicin que se ejecutar
despus de term inado el ciclo, esta suposicin resulta conservadora; no es posible
subestim ar el tiem po de ejecucin del peor caso si se presum e que el ciclo se ejecu
ta por completo. Sin embargo, es raro el program a en el que ignorar el goto es tan
conservador que puede llevar a sobreestim ar la velocidad de crecim iento del tiem po
de ejecucin del program a para el peor caso. Obsrvese que si se presentara un goto
que transfiriera el control a cdigo ejecutado con anterioridad, no sera posible ig
norarlo sin correr riesgos, pues ese goto podra crear un ciclo que consum iera la m a
yor parte del tiem po de ejecucin.
No por esto debe pensarse que el uso de proposiciones goto hacia atrs en s m is
mo hace que los tiem pos de ejecucin sean imposibles de analizar. El enfoque para
analizar tiem pos de ejecucin, que se describi en esta seccin, funcionar bien en la
m edida en que los ciclos de un program a tengan una estructura razonable, es decir,
que cualquier par de ciclos sea siem pre disjunto o anidado. (No obstante, es res
ponsabilidad del analizador descubrir la estructura de los ciclos.) As pues, no debe
dudarse en aplicar estos m todos de anlisis de program as a lenguajes como FO R
TRAN, donde los goto son esenciales, pero los program as tienden a tener una es
tructura de ciclos razonable.
Anlisis de un seudoprograma
Si se conoce la velocidad de crecim iento del tiem po necesario para ejecutar propo
siciones inform ales en espaol, es posible analizar seudoprogram as como si fueran
program as reales. Sin embargo, muchas veces no se conoce el tiem po que dem anda
rn las partes no com pletam ente term inadas de un seudoprogram a. Por ejem plo, si
se tiene un seudoprogram a donde las nicas partes no term inadas son operaciones
con TDA, puede elegirse una de las varias im plantaciones posibles para un TDA y el
tiem po de ejecucin total puede depender en gran m edida de la realizacin elegida.
P or supuesto, una de las razones en favor de la escritura de program as con TD A es
que permite considerar los pros y los contras entre los tiem pos de ejecucin de va
rias operaciones que resultan de efectuar distintas realizaciones.
Para analizar seudoprogram as que contengan proposiciones en algn lenguaje de
programacin y llamadas a procedimientos an no im plantados, tales como operacio
nes con TDA, se calcula el tiem po de ejecucin como una funcin de los tiem pos
de ejecucin no especificados de esos procedim ientos. El tiem po de ejecucin de un
procedim iento obtiene sus parm etros m ediante el tam ao de su argum ento (o ar
gumentos). As como sucede con el tam ao de la entrada, la m edida apropiada
para el tam ao de un argum ento es decisin de quien hace el anlisis. Si el proce
dim iento es una operacin con un TDA, el modelo m atem tico subyacente a m enu
do indica la nocin lgica de tam ao. Por ejem plo, si el TDA est basado en con
juntos, el nm ero de elem entos de los conjuntos es con frecuencia la nocin correc
ta de tam ao. En los captulos siguientes se vern m uchos ejemplos de anlisis del
tiem po de ejecucin de seudoprogramas.
www.FreeLibros.me
28
1 .6
Hay un buen nm ero de ideas que se deberan tener presente al disear un algo
ritm o e im plantarlo com o program a. Estas ideas a m enudo parecen perogrulladas,
porque slo se pueden apreciar en toda su extensin a travs de su empleo acertado
en situaciones prcticas, ms que en el desarrollo de una teora. A pesar de esto, son
lo bastante im portantes para repetirlas aqu. El lector debe observar con detenim ien
to la aplicacin de estas ideas en los program as diseados en este libro, as como bus
car oportunidades para ponerlas en prctica en sus propios programas.
Planificar el diseo de un programa. En la seccin l .l se m ostr cmo disear
un program a partiendo de un esbozo inform al del algoritm o, con el diseo de
un seudoprogram a y luego con el refinam iento gradual del seudocdigo hasta
convertirlo en ejecutable. Esta estrategia de esbozar, y despus detallar, tiende
a la produccin de un program a final ms organizado que facilita su depuracin
y m antenim iento.
2. Encapsular. Emplense procedim ientos y diversos TD A para que el cdigo aso
ciado a cada operacin im portante y a cada tipo de datos quede colocado en un
solo lugar del listado del program a. Despus, si es necesario hacer cambios, la
seccin de cdigo pertinente se localizar con facilidad.
3. Usar o modificar un programa existente. U na de las principales causas de ineficiencia en el proceso de program acin es que m uchas veces un proyecto se abor
da como si fuera el prim er program a que se hubiera escrito. Se debera buscar
prim ero un program a ya elaborado que realice la tarea com pleta o parte de ella.
A la inversa, cuando se escribe un program a, se debera pensar en ponerlo a dis
posicin de otras personas para posibles usos no previstos.
4. Confeccionar herramientas. En lenguaje de com putacin, una herramienta es un
program que tiene una variedad de usos. Cuando se escriba un program a, debe
pensarse en la posibilidad de escribirlo de un m odo ms general sin m ayor es
fuerzo adicional. Por ejem plo, supngase que se pide escribir un program a para
la programacin de exmenes finales; en lugar de eso, escrbase una herramienta
que tome un grafo arbitrario y colorense sus vrtices con el m nim o de colores
posible, de modo que no haya dos vrtices del mismo color unidos por una arista.
En el contexto de la programacin de exmenes, los vrtices son los grupos de es
tudiantes, los colores son los periodos de exmenes, y una arista entre dos gru
pos significa que stos tienen algn estudiante en comn. El program a de colo
racin, ju n to con rutinas que traduzcan las listas de grupos en grafos y los co
lores en das y horas especficos, es el program ador de exmenes. Sin embargo,
el program a de coloracin se puede usar para resolver problem as que no tengan
relacin alguna con la program acin de exmenes, como el problem a de los se
m foros de la seccin l .l .
5. Programar a nivel de mandatos. En ocasiones, es imposible encontrar en una bi
blioteca el program a que se necesita para realizar cierto trabajo, ni adaptar una
herram ienta para tal efecto. Un sistem a operativo bien diseado perm ite conec
ta r entre s una red de program as disponibles sin que sea necesario escribir un
program a nuevo, sino slo una lista de m andatos (commands) del sistema ope
1.
www.FreeLibros.me
BUENAS PRACTICAS DE PR O G R A M A C IO N
29
rativo. Para que los mandatos sean pertinentes, es necesario que cada uno se com
porte como un filtro, o sea com o un program a con un archivo de entrada y otro
de salida. Obsrvese que es posible com poner un nm ero arbitrario de filtros, y
si el sistem a operativo est diseado de form a inteligente, una sim ple lista de
m andatos (dispuestos como han de ejecutarse) ser suficiente como program a.
Ejemplo 1.11. C om o ejem plo de lo anterior, considrese el program a spell, tal como
fue escrito por S. C. Johnson a partir de m andatos de U N IX t- Este program a tom a
com o entrada un archivo a, que contiene un texto en ingls, y produce com o salida
todas aquellas palabras en a, que no se encuentren en un pequeo diccionario t tspell tiende a listar los nom bres propios com o faltas de ortografa, al igual que las
palabras que no figuren en el diccionario, pero dado que la salida tpica del progra
ma es pequea, puede exam inarse visualm ente, y la inteligencia de cualquier ser hu
m ano puede determ inar si una palabra de la salida de spell tiene faltas de ortografa
o no. (La ortografa de la versin original en ingls de este libro se verific con spell.)
El prim er filtro utilizado por spell es un m andato llam ado transate, cuando este
m andato recibe parm etros apropiados, puede reem plazar las letras maysculas
por minsculas y los espacios por saltos de lnea, sin alterar los caracteres restantes.
La salida de transate es un archivo a , que contiene las palabras de a sin m ays
culas y una en cada lnea. A continuacin, aparece el m andato son que clasifica las l
neas de su archivo de entrada en orden lexicogrfico (alfabtico). La salida de sort
es un archivo a 3 que tiene todas las palabras de a2 en orden alfabtico, con repeti
ciones. Entonces, un m andato unique elim ina las lneas duplicadas de su archivo de
entrada y produce un archivo de salida aA que contiene las palabras del archivo ori
ginal, sin m aysculas ni duplicaciones, en orden alfabtico. Por ltimo, se aplica a
aA un m andato diff, con un parm etro que indica un segundo archivo a5 que contie
ne una lista alfabetizada de las palabras del diccionario, una en cada lnea. El resul
tado tiene todas las palabras de aA (y por tanto de a ,) que no estn en a 5, esto es,
todas las palabras de la entrada original que no se encuentran en el diccionario. El
program a spell com pleto no es m s que la siguiente secuencia de mandatos.
spell:
www.FreeLibros.me
30
1 .7
Sper Pascal
La m ayora de los program as de este libro estn escritos en Pascal. No obstante, para
aum entar su legibilidad, en ocasiones se usan tres construcciones que no form an par
te de Pascal estndar, pero que se pueden traducir m ecnicam ente a Pascal puro.
U na de tales construcciones es la etiqueta no num rica. Las pocas veces que se re
quieran etiquetas, sern no num ricas, porque facilitan la com prensin de los pro
gramas. Por ejemplo, goto salida siem pre es m s claro que goto 561. Para con
vertir a Pascal puro un program a que contenga etiquetas no num ricas, se debe reem
plazar cada una de ellas por una etiqueta num rica distinta y despus declarar las
etiquetas num ricas al principio del program a. Este proceso puede llevarse a cabo
m ecnicam ente.
La segunda construccin no estndar es la proposicin de retom o, que se usa por
que perm ite escribir program as m s fciles de entender, sin em plear proposiciones
goto para interrum pir el flujo de control. La proposicin de retom o que aqu se em
plea tiene la forma
return (expresin)
donde (expresin) es opcional. Es fcil convertir a Pascal estndar un procedimiento
que contenga proposiciones return. En prim er lugar, se declara una etiqueta nueva,
com o 999, y con ella se etiqueta la ltim a proposicin end del procedim iento. Si en
una funcin de nom bre y, por ejem plo, aparece la proposicin return(jc), sta se reem
plaza por el bloque
begin
y :- jr ,
goto 999
end
En un procedim iento, la proposicin return, que puede carecer de argum ento, sim
plem ente se reem plaza por goto 999.
Ejemplo 1.12. La figura 1.15 m uestra el program a para calcular factoriales, escrito
con proposiciones return. En la figura 1.16 aparece el program a en Pascal resultante
de la aplicacin sistem tica de la transform acin indicada a la figura 1.15.
function fac ( n: integer ) : integer;
begin
if n < - 1 then
return (1)
else
return (n * fact(n-1))
end; \fact\
Fig. 1.15.
www.FreeLibros.me
EJER CICIOS
31
Ejercicios
1.1
U na liga de ftbol tiene seis equipos que se representarn con las letras A,
B. C. D, E y F. El equipo A ya jug contra los equipos B y C; el equipo B,
www.FreeLibros.me
Considrese un brazo robot fijo por un extremo. El brazo tiene dos articu
laciones; en cada una de ellas, es posible rotarlo 90 grados hacia arriba o ha
cia abajo en un piano vertical. Cmo podra m odelarse m atem ticam ente
la variedad de m ovim ientos posibles del extrem o del brazo? Descrbase un
algoritm o para m over el extrem o del brazo robot de una posicin perm isi
ble a otra.
1.3
1.4
Supngase que se desean dividir las races cuadradas de los enteros del 1
al 100 en dos pilas de 50 nm eros cada una, de m odo que la sum a de los
nm eros de la prim era pila sea lo m s cercana posible a la sum a de los n
m eros de la segunda. Si slo se dispusiera de dos m inutos de tiem po de com
putador para resolver el problem a, qu clculo sera aconsejable realizar?
1.5
Descrbase un algoritm o vido para jugar al ajedrez. Cabe esperar que ten
ga un buen rendim iento?
1.6
1.7
www.FreeLibros.me
E JER CICIO S
33
Se desea desarrollar un program a para form ato de textos que coloque las
palabras en las lneas de m odo que queden justificadas a la izquierda y a
la derecha. El program a tiene dos reas de alm acenam iento transitorio (buffers), uno de palabras y otro de lneas; am bas estn vacas al inicio. Una
palabra se lee al rea transitoria, y si hay espacio suficiente en el rea de l
neas, la palabra se transfiere a sta. En caso contrario, se insertan espacios
adicionales entre las palabras del rea transitoria de lneas para com pletar
una lnea; al im prim ir esta lnea, el rea se vaca.
a) Refnese este algoritm o en la form a de un program a en seudolenguaje.
b) Convirtase el program a en seudolenguaje en un program a en Pascal.
1.9
1.10
n2
f 2(n) -
n2 + 1OOOn
.
Jj(n >~
I n si n es im par
| n j si n es par
\ n si n < 100
\ 3 si > 100
S2(") gi(n) -
www.FreeLibros.me
1.12
procedure p ro d .m a t ( n: integer );
var
i, j, h. integer,
begin
for i
1 to n do
for j
1 to n do begin
C[i. j] > 0;
for k
1 to n do
C[.j] :~ C [i,j) + A[i, k] B[k, f]
end
end
b)
c)
y+i
end
end
*d)
www.FreeLibros.me
EJER CICIOS
1.13
35
i-i
*1.15
1.16
1.17
Supngase que el parm etro ti del procedim iento siguiente es una potencia
positiva de 2, esto es, n - 2, 4, 8, 16,... Proporcinese una frm ula que ex
prese el valor de la variable cuenta en funcin del valor de n cuando ter
m ina el procedim iento.
procedure misterio (n: integer);
var
x, cuenta: integer;
begin
cuenta :- 0;
x :- 2;
www.FreeLibros.me
36
1.18
La siguiente es una funcin m x (i, ri) que devuelve el m ayor elem ento en
las posiciones i a i+ n-l de una m atriz entera A. Por conveniencia, puede su
ponerse que n es una potencia de 2.
function m x (i, n: in te g e r): integer;
var
m i, m i: integer;
begin
if n - 1 then
return (/![/])
else begin
m1
mx(i, n div 2);
mi
mx(i+n div 2, n div 2);
if m 1 < m i then
return (m2)
else
return ( mi )
end
end
a) Sea T(n) el tiem po del peor caso para m x con segundo argum ento igual
a n. Esto es, n es el nm ero de elem entos de entre los cuales se encuen
tra el mayor. Escrbase una ecuacin que exprese T(n) en funcin de
T(j) para uno o m s valores de j m enores que n y una constante o cons
tantes que representen los tiem pos tom ados por las proposiciones indi
viduales del program a mx.
b) Obtngase una cota asinttica superior (notacin o mayscula) lo ms
cercana posible para T\ri). La solucin debe ser igual a una cota asint
tica inferior (notacin omega mayscula), y ser lo ms sencilla posible.
Notas bibliogrficas
El origen del concepto de tipo de datos abstracto se rem onta al tipo class en el len
guaje SIM ULA 67 (Birtwistle el al. [1973]). Desde entonces, se han desarrollado va
rios lenguajes que m anejan tipos de datos abstractos; entre ellos estn Alphard
(Shaw, W ulf y London [1977]), C con clases (Stroustrup [1982]), CLU (Liskov el al.
[1977]), MESA (Geschke, M orris y Satterthw aite [1977]) y Russell (Dem ers y Donahue [1979]). El concepto de TDA se analiza con ms profundidad en trabajos ta
les com o Gotlieb y G otlieb [1978] y W ulf et al. [1981].
K nuth [1968] fue el prim er trabajo im portante en el que se preconiz el estudio
sistem tico del tiem po de ejecucin de program as. Aho, Hopcroft y Ullm an [1974]
relaciona la com plejidad espacial y tem poral de los algoritm os con varios modelos
com putacionales, como las m quinas de T uring y las de acceso aleatorio. Para ms
referencias sobre el tem a del anlisis de algoritm os y program as, vanse tam bin las
notas bibliogrficas del captulo 9.
www.FreeLibros.me
37
Com o m aterial adicional sobre program acin estructurada vanse H oare, Dahl
y D ijkstra [1972], W irth [1973], K ernighan y Plauger [1974], y Y ourdon y Constantine [1975]. Los problem as organizacionales y psicolgicos que se presentan en el de
sarrollo de proyectos grandes de software se tratan en Brooks [1974] y W einberg
[1971], En Kernighan y Plauger [1981] se m uestra cm o construir herram ientas ti
les para un am biente de program acin.
www.FreeLibros.me
138]
Tipos de datos
abstractos fundamentales
2 .1
Las listas constituyen una estructura flexible en particular, porque pueden crecer y
acortarse segn se requiera; los elem entos son accesibles y se pueden insertar y su
prim ir en cualquier posicin de la lista. Las listas tam bin pueden concatenarse en
tre s o dividirse en sublistas; se presentan de m anera rutinaria en aplicaciones como
recuperacin de inform acin, traduccin de lenguajes de program acin y sim ula
cin. Las tcnicas de adm inistracin de m em oria del tipo de las que se analizan en
el captulo 12 hacen uso extensivo de tcnicas de procesam iento de listas. En esta
seccin se presentarn algunas operaciones bsicas con listas, y en el resto del cap
tulo se presentarn estructuras de datos para representar listas que m anejan con efi
ciencia varios subconjuntos de estas operaciones.
M atem ticam ente, una lista es una secuencia de cero o m s elem entos de un tipo
determ inado (que por lo general se denom inar tipo.elem ento). A m enudo se repre
senta una lista com o una sucesin de elem entos separados por comas
a u a2, ..., a
donde n > 0 y cada a, es del tipo tipo.elem ento. Al nm ero n de elem entos se le
llama longitud de la lista. Al suponer que n >l l, se dice que <2, es el prim er elemento
y a el ltim o elemento. Si n - 0, se tiene una lista vaca, es decir, que no tiene ele
mentos.
U n a propiedad im portante de una lista es que sus elem entos pueden estar orde
nados en form a lineal de acuerdo con sus posiciones en la misma. Se dice que a, pre
cede a ah , para i - l, 2,..., n - 1, y que a, sucede a a,_, para i = 2, 3,..., n. Se dice que el
elem ento a, est en la posicin i. Es conveniente postular tam bin la existencia de
www.FreeLibros.me
39
una posicin que sucede a la del ltim o elem ento de la lista. La funcin FIN(L) de
volver la posicin que sigue a la posicin n en una lista L de n elem entos. O bsr
vese que la posicin FIN(L), con respecto al principio de la lista, est a una distan
cia que vara conform e la lista crece o se reduce, m ientras.que las dem s posiciones
guardan una distancia fija con respecto al principio de la lista.
Para form ar un tipo de datos abstracto a partir de la nocin m atem tica de lista,
se debe definir un conjunto de operaciones con objetos de tipo LISTA t- C om o su
cede con m uchos de los TDA que se analizan en este libro, ningn conjunto de ope
raciones es adecuado para todas las aplicaciones. Aqu se dar un conjunto repre
sentativo de operaciones. En la siguiente seccin se m ostrarn varias estructuras de
datos para representar listas y se escribirn procedim ientos para las operaciones ca
ractersticas con listas en funcin de esas estructuras de datos.
Para ilustrar algunas operaciones com unes con listas, considrese una aplicacin
tpica: se tiene una lista de direcciones y se desean elim inar las entradas dobles. En
forma conceptual, este problem a es bastante fcil de resolver: para cada elem ento
de la lista, elim nense todos los elem entos sucesores equivalentes. Para presentar
este algoritmo, sin embargo, es necesario definir operaciones que perm itan encon
trar el prim er elem ento de una lista, recorrer los dem s elem entos sucesivos, y re
cuperar y elim inar elementos.
Se presentar ahora un conjunto representativo de operaciones con listas. Ah, L
es una lista de objetos de tipo tipo_elem ento, x es un objeto de ese tipo y p es de tipo
posicin. Obsrvese que posicin es otro tipo de datos cuya implantacin cam biar
con aquella que se haya elegido para las listas. A unque de m anera informal se pien
sa en las posiciones com o enteros, en la prctica pueden tener o tra representacin.
1. INSERTA (x, p. L). Esta funcin inserta x en la posicin p de la lista L, pasando
los elem entos de la posicin p y siguientes a la posicin inm ediata posterior.
Esto quiere decir que si L es a ,, a 2, ..., a, se convierte en a ,, a 2, ..., a ^ ,, x,
....
a. Si p es FIN(L), entonces L se convierte en a ,, a 2, ..., a, x. Si la lista L no
tiene posicin p, el resultado es indefinido.
2. LOCALIZA(x, L). Esta funcin devuelve la posicin de x en la lista L. Si x fi
gura ms de una vez en L, la posicin de la prim era aparicin de x es la que se
devuelve. Si x no figura en la lista, entonces se devuelve FIN(L).
3. RECUPERAR, L). Esta funcin devuelve el elem ento que est en la posicin p
de la lista L. El resultado no est definido si p - FIN(L) o si L no tiene posicin
p. Obsrvese que si se utiliza RECUPERA, los elem entos deben ser de un tipo
que pueda ser devuelto por una funcin. No obstante, en la prctica siem pre es
posible m odificar RECUPERA para devolver un apuntador a un objeto de tipo
tipo_elem ento.
4. SUPRIM E(p, L). Esta funcin elim ina el elem ento en la posicin p de la lista
L. Si L es a u a2, .... a, L se convierte en a ,, a 2, ...,
a^
a. El resultado
no est definido si L no tiene posicin p o si p - FTN(L).
t En sentido estricto, el tipo e s LISTA d e iip o _ elem en to . Sin em bargo, las realizaciones d e listas que
se proponen no dependen del tipo_elem ento; precisam ente esta independencia es la que justifica la rele
vancia que se da al concepto de lista. Se usar LIST A en lugar de LISTA de tipo_elem ento, y se tra
tar de manera sim ilar a los dem s T D A que dependan de los tip o s de elem entos.
www.FreeLibros.me
40
5.
6.
7.
8.
www.FreeLibros.me
REALIZACION DE LISTAS
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
41
Un aspecto que es im portante observar est relacionado con el cuerpo del ciclo
interno, las lneas (4)-(7) de la figura 2.1. Cuando se elim ina el elem ento de la posi
cin q de la lnea (6), los elem entos que estaban en las posiciones q+1, q+2, ..., etc
tera, avanzan una posicin en la lista. En particular, si q fuera la ltim a posicin de
L, el valor de q sera entonces FIN(L). Si despus de esto se ejecutara la lnea (7),
SIGUIENTE(FIN(L), L ) producira un resultado indefinido. Por tanto, es esencial
que slo alguna de las lneas, (6) o (7), pero no las dos, se ejecute entre las pruebas
para saber si q - FIN (L) en la lnea (4).
2 .2
Realizacin de listas
www.FreeLibros.me
42
1
2
>
lt [
s
> vaco
lo ng-m x
Fig. 2.2.
En la realizacin con arreglos se define el tipo LISTA como un registro con dos
campos; el prim ero es un arreglo de elem entos que tiene la longitud adecuada para
contener la lista de m ayor tam ao que se pueda presentar. El segundo cam po es un
entero lt que indica la posicin del ltim o elem ento de la lista en el arreglo. El
/-simo elem ento de la lista est en la z-sima celda del arreglo, para 1< /< //.
como se m uestra en la figura 2.2. Las posiciones en la lista se representan m ediante
enteros; la z-sima posicin, m ediante el entero z. La funcin FIN(L) slo tiene que
devolver lt + 1. Las declaraciones im portantes son;
const
lo n g - m x - 100 { alguna constante apropiada |;
type
LISTA - record
elementos: array[l ..long-m x] o f tipo.elem ento;
lt: integer
end;
posicin - integer;
function FIN (var L : LISTA): posicint;
begin
return (L.lt + 1)
end; FIN j
La figura 2.3 m uestra cm o se podran im plantar las operaciones INSERTA, SU
PRI ME y LOCALIZA con esta realizacin basada en arreglos. INSERTA pasa los
elem entos de las localidades p, p + 1, ...,lt a las localidades p + 1, p + 2,..., lt + 1 y
despus inserta el nuevo elem ento en la localidad p. Si no hay espacio en el arreglo
para insertar un nuevo elemento, se invoca a la rutina error, que imprim e su argument Aunque L no s e m odifica, pasa por referencia, pues por lo com n es una estructura grande y no se
desea perder tiem p o copindola.
www.FreeLibros.me
REALIZACIO N DE LISTAS
43
www.FreeLibros.me
44
to y da por term inada la ejecucin del program a. SU PRIM E elim ina el elem ento de
la posicin p pasando los elem entos de las posiciones p + 1, p +2,..., lt, a las posi
ciones p, p + 1,..., lt - 1. LOCALIZA revisa el arreglo secuencialmente, en busca de
un elem ento determ inado; si no lo encuentra, LOCALIZA devuelve lt + 1.
D ebera estar claro cm o codificar las restantes operaciones con listas con esta
forma de implantacin. Por ejemplo, PRIM ERO siempre devuelve uno; SIGUIENTE
devuelve uno ms que su argum ento, y AN TERIOR, uno menos;cada uno verifica
prim ero si el resultado est dentro del intervalo permisible; ANULA(L) coloca L.lt
en 0. Si el procedim iento PU R G A de la figura 2.1 va precedido de
1.
2.
3.
4.
www.FreeLibros.me
REALIZACION DE LISTAS
45
zam iento es nii y no se tienen ms celdas. La figura 2.4 m uestra una lista enlazada de
esta m anera.
encabezamiento
v---------------------------------------v
lista
Fig. 2.4.
Lista enlazada.
Para las listas enlazadas sencillas es conveniente usar una definicin de posicin
ligeramente distinta de la que se em ple para las listas logradas m ediante arreglos.
Aqu, la posicin i ser un apuntador a la celda que contiene el apuntador a a, para
i - 2, 3,..., n. La posicin 1 es un apuntador al encabezamiento, y la posicin FIN(L) es
un apuntador a la ltim a celda de L.
El tipo de una lista, en realidad, es el m ism o que el de una posicin; es un apun
tador a una celda particular: el encabezam iento. La siguiente es una definicin formal
de las partes esenciales de una estructura de datos de lista enlazada.
type
tipo-celda = record
elemento: tipo_elem ento;
s ig : tipo-celda
end;
LISTA - t tipo-celda;
posicin - t tipo_celda;
En la figura 2.5 se m uestra la funcin FIN(L); sta funciona m oviendo el apun
tador q por la lista, hasta que alcanza el final, el cual se detecta por el hecho de que
q apunta a una celda con un apuntador nil. Obsrvese que esta realizacin de FIN
es ineficiente, pues requiere revisar la lista entera cada vez que se desea calcular
FIN(L). Si es necesario hacer esto con frecuencia, com o en el program a PU RG A de
la figura 2.1, puede optarse por cualquiera de las opciones siguientes:
function FIN ( L: LISTA ) : posicin;
| FIN devuelve un apuntador a la ltim a celda de L |
var
(1)
(2)
(3)
(4)
q: posicin;
begin
Q--L;
while q \.sig < > nil do
q := qlsig-,
return {q)
end; I FIN i
Fig. 2.5.
La funcin FIN.
www.FreeLibros.me
46
1.
2.
(1)
(2)
(3)
(4)
www.FreeLibros.me
REALIZACIO N DE LISTAS
47
L\
L f. n e x t : - nil;
return(L)
end; j A N U L A )
Fig. 2.6.
(a)
Zh
b
~T~
(2) /
-a )
(3)
tem p
(i)
Fig. 2.7.
(4)
\i
/
(b)
Diagrama de INSERTA.
t Por supuesto, existen m uchas situaciones en las que se podra desear q ue p represente la posicin de c.
www.FreeLibros.me
48
Flg. 2.8.
Diagrama de SUPRIME.
2.
3.
4.
www.FreeLibros.me
REALIZACION DE LISTAS
49
alm acenar todas las listas de elem entos cuyo tipo es tipo-elem ento; cada registro con
tiene un elem ento y un entero que se usa com o cursor. Es decir, se define
var
ESPACIO : array [l..long_m x] of record
elemento: tipo_elem ento;
sig: integer
end
Si L es una lista de elementos, se declara una variable entera, por ejemplo, Lencb, como
encabezamiento para L. Se puede tratar Lencab como un cursor a la celda de encabe
zamiento en ESPACIO con un campo elemento vado. Las operaciones con listas se pue
den implantar, entonces, como en la realizacin basada en apuntadores recin descrita.
Aqu se describir una realizacin alternativa que evita el uso de celdas de en
cabezam iento, al tom ar com o casos especiales las inserciones y supresiones en la po
sicin 1. Esta tcnica se puede usar tam bin con listas enlazadas basadas en apun
tadores, para evitar el em pleo de celdas de encabezam iento. Para una lista L, el va
lor de E SPACIO [Lencab]. elemento es el valor del prim er elem ento de L. El valor
de ESPACIO [Lencab].sig es el ndice de la celda que contiene el segundo elemento,
y as sucesivam ente. Un valor de 0 ya sea en Lencab o en el cam po sig, representa
un apuntador nil, esto es, no hay un elem ento siguiente.
Una lista tendr tipo entero, ya que el encabezamiento es una variable entera que re
presenta la lista com o un todo. Las posiciones sern tam bin de tipo entero. Se adop
ta aqu la convencin de que la posicin i de la lista L es el ndice de la celda de
ESPACIO que contiene el elem ento i - 1 de L, ya que el cam po sig de esa celda con
tendr el cursor al elem ento i. Com o caso especial, la posicin 1 de cualquier lista
se representa por 0. D ado que el nom bre de la lista es siem pre un parm etro de las
operaciones que usan posiciones, es posible distinguir entre las prim eras posiciones
de distintas listas. La posicin FIN(L) es el ndice del ltim o elem ento de L.
La figura 2.9 m uestra dos listas, L - a, b, c y M - d, e, que com parten el arreglo
ESPACIO con long^m x = 10. Obsrvese que las celdas del arreglo no contenidas
disponible
Fig. 2.9.
1
2
3
4
5
6
7
8
9
10
ESPACIO
d
7
4
c
0
6
a
8
0
e
0
b
3
10
2
elemento
sig
www.FreeLibros.me
50
en L ni en M estn enlazadas en otra lista llam ada disponible. Tal lista es necesaria
para obtener una celda vaca cuando se desee hacer una insercin, y disponer de lu
gar donde poner las celdas suprim idas para su uso posterior.
Para insertar un elem ento x en la lista L, se tom a la prim era celda de la lista dis
ponible y se coloca en la posicin correcta en la lista L. El elem ento x se pone en
tonces en el cam po elemento de esta celda. Para suprim ir un elem ento x de la lista
L , se quita de L la celda que contiene x y se devuelve al principio de la lista dispo
nible. Estas dos acciones pueden verse como casos especiales del acto de tom ar una
celda C apuntada por un cursor p y hacer que otro cursor q apunte a C, a la vez que
se hace que p quede apuntando hacia donde C apuntaba y C quede apuntando hacia
donde q apuntaba. De esta form a, C se inserta entre q y aquello hacia lo que apun
taba q. Por ejemplo, si se suprim e b de la lista L en la figura 2.9, C es la fila 8 de
ESPACIO, p es ESPACIO[5].s y q es disponible. Los cursores antes (en lneas de
trazo continuo) y despus (en lneas punteadas) de esta accin se m uestran en la fi
gura 2.10, y el cdigo est incluido en la funcin mueve de la figura 2.11, que rea
liza el m ovim iento si C existe y devuelve falso si C no existe.
La figura 2.12 m uestra los procedim ientos INSERTA y SUPRIM E, y un proce
dim iento val-inicial que enlaza las celdas del arreglo E SPACIO para form ar una lis
ta de espacio disponible. Estos procedim ientos no incluyen verificaciones para de
tectar errores; es aconsejable insertarlas com o ejercicio para el lector. Se dejan tam
bin como ejercicios otras operaciones sim ilares a las de las listas enlazadas basadas
en apuntadores.
Fig. 2.10.
www.FreeLibros.me
REALIZACION DE LISTAS
51
ESPA CIO[q).sig.
E S P A C IO [ q ] .s ig te m p \
return (true)
end
end; { mueve I
Fig. 2.11.
www.FreeLibros.me
52
procedure val-inicial\
I val-inicial enlaza ESPACIO en una lista de celdas disponibles 1
var
i: integer;
begin
for i l o n g - m x - 1 downto 1 do
ESPACIO [ i ] . s i g i + l ;
d i s p o n i b l e 1;
ESPACIO [long-mx] .sig :**0 m arca el final de la lista de celdas dispo
nibles}
end; I v a l-in icia l}
Fig. 2.12.
Fig. 2.13.
O tra ventaja im portante de las listas doblem ente enlazadas es que perm iten usar
un apuntador a la celda que contiene el i-simo elem ento de una lista para repre
sentar la posicin i, en vez de usar el apuntador a la celda anterior, que es menos
natural. El nico precio que se paga por estas caractersticas es la presencia de un
apuntador adicional en cada celda, y los procedim ientos algo m s lentos para algu
nas de las operaciones bsicas con listas. Si se usan apuntadores (en vez de cursores)
se puede declarar que las celdas contienen un elem ento y dos apuntadores, m ediante
type
tipo-celda - record
elemento: tipo_elem ento;
sig, ant: t tipo-celda
end;
posicin - t tipo-celda;
En la figura 2.14 se da un procedim iento para suprim ir un elem ento en la posicin
p en una lista doblem ente enlazada. La figura 2.15 m uestra los cam bios causados en
los apuntadores por este procedim iento; los apuntadores anteriores se representan
con lneas de trazo continuo, y los nuevos con lineas punteadas, en el supuesto de
que la celda suprim ida no es la prim era ni la ltim a t- Prim ero se localiza la celda
precedente, usando el cam po ant. Se hace que el cam po sig de esta celda apunte a
t A tal efecto, e s prctica c o m n hacer que el encabezam iento d e una lista doblem ente enlazada sea una
celda que efectivam ente cierre el crculo. Esto es, que el cam p o a n t del encabezado apunte a la ltima
celda y que su cam p o s ig apunte a la primera. D e esta manera no se necesita hacer verificaciones de cam
pos nil en la figura 2.14.
www.FreeLibros.me
p il a s
53
la celda que sigue a la que ocupa la posicin p. Despus se hace que el cam po an
de esta celda siguiente apunte a la celda que precede a la que ocupa la posicin p.
La celda apuntada por p queda sin usar y el sistem a de tiem po de ejecucin de Pas
cal debe de usarla de nuevo autom ticam ente.
procedure SU PRIM E (var p: posicin );
begin
f p \.a n i < > nil then
i la celda a suprim ir no es la prim era 1
p l a n t l s i g p \ . sig,
f p \.sig < > nil then
{la celda a suprim ir no es la ltimaj
p \.sig t .ant :== p].ant
end; I SU PRIM E |
Fig. 2.14.
Fig. 2.15.
2 .3
Pilas
U na pila es un tipo especial de lista en la que todas las inserciones y supresiones tie
nen lugar en un extrem o denom inado tope. A las pilas se les llama tam bin listas
LIFO (last in first out) o listas ltim o en entrar, prim ero en salir. El m odelo in
tuitivo de una pila es precisam ente una pila de fichas de pquer puesta sobre una
mesa, o de libros sobre el piso, o de platos en una estantera, situaciones todas en
las que slo es conveniente quitar o agregar un objeto del extrem o superior de la
pila, al que se denom inar en lo sucesivo tope. U n tipo de datos abstracto de la
familia PILA incluye a m enudo las cinco operaciones siguientes:
1. ANULA(P) convierte la pila P en una pila vaca. Esta operacin es exactam ente
la m ism a que para las listas generales.
2. TO PE(/0 devuelve el valor del elem ento de la parte superior de la pila P. Si se
identifica la parte superior de una pila con la posicin l , como suele hacerse,
entonces TOPEP) puede escribirse en funcin de operaciones con listas como
RECUPERA(PRIMERCKP), P).
3. SACA(P), en ingls POP, suprim e el elem ento superior de la pila, es decir, equi
vale a SUPRIME(PRIMERO(.P), P). Algunas veces resulta conveniente im plantar
www.FreeLibros.me
54
4.
5.
SACA com o una funcin que devuelve el elem ento que acaba de suprim ir, aun
que aqu no se har eso.
M ETER, P), en ingls PUSH, inserta el elem ento x en la parte superior de la
pila P. El anterior tope se convierte en el siguiente elem ento, y as sucesivamen
te. En funcin de operaciones prim itivas con listas, esta operacin es INSER
T A R , PR IM ER O (P), P).
VACIA(P) devuelve verdadero si la pila P est vaca, y falso en caso contrario.
Ejemplo 2.2. Los editores de textos siem pre perm iten usar un carcter (por ejem
plo, b a cksp a ce) com o carcter de borrado que cancela el carcter anterior no can
celado. Por ejemplo, si
es el carcter de borrado, la cadena a b c # d # # e es en rea
lidad la cadena ae. El prim er *# cancela la c, el segundo la d y el tercero la b.
Los editores de textos tam bin tienen un carcter de eliminacin de lnea, que
cancela todos los caracteres anteriores de la lnea actual. A efectos de este ejemplo,
se usar ' @ com o carcter de elim inacin de lnea.
U n editor puede procesar una lnea de texto usando una pila. El editor lee un ca
rcter a la vez. Si el carcter ledo no es de borrado ni de elim inacin de lnea, el
editor lo m ete en la pila. Si el carcter es de borrado, el editor saca un carcter de
la pila, y si es de elim inacin de lnea, vaca la pila. En la figura 2.16 se m uestra un
program a que ejecuta estas acciones.
procedure EDITA;
var
P. PILA;
c. char;
begin
ANULA (P);
while not eoln do begin
read{c)\
fe then
SACA (P)
else if c - @ then
ANULA (P)
else I c es un carcter norm al i
METE (c, P)
end;
im prim e P en orden inverso
end; i EDITA I
Fig. 2.16.
En este program a, el tipo PILA debe declararse como una lista de caracteres. El
proceso de escribir la pila en orden inverso en la ltim a lnea del program a tiene un
objetivo: sacar de la pila un carcter a la vez da com o resultado la inversin de la
www.FreeLibros.me
PILAS
55
tope
long^m x _________
elementos
Fig. 2.17.
Para esta realizacin de pilas basada en arreglos, el tipo de datos abstracto PILA
se define como
type
PILA - record
tope, integer;
elementos: wnvy[ \ ..lo n g -m x ] o f tipo_elem ento
end;
www.FreeLibros.me
56
www.FreeLibros.me
COLAS
2 .4
57
Colas
U na cola es otro tipo especial de lista en el cual los elem entos se insertan en un ex
trem o (el posterior) y se suprim en en el otro (el anterior o frente). Las colas se cono
cen tam bin com o listas FIFO (first-in first-out) o listas prim ero en entrar, pri
mero en salir. Las operaciones para una cola son anlogas a las de las pilas; las di
ferencias sustanciales consisten en que las inserciones se hacen al final de la lista, y
no al principio, y en que la term inologa tradicional para colas y listas no es la mis
ma. Se usarn las siguientes operaciones con colas.
1.
2.
4.
5.
www.FreeLibros.me
58
Por tanto, es posible definir una cola com o una estructura que consiste en apunta
dores al extrem o anterior de la lista y al extrem o posterior. La prim era celda de una
cola es una celda de encabezamiento cuyo campo elemento se ignora. Como se mencio
n, esta convencin perm ite representar de m anera simple una cola vaca. Se define:
type
COLA - record
ant, post: t tipo-celda
end;
La figura 2.19 m uestra program as para las cinco operaciones con colas. En ANU
LA, la prim era proposicin new(C.ant) crea una variable de tipo tipo_celda y asigna
su direccin a C.ant. La segunda proposicin coloca nil en el cam po sig de esa celda.
La tercera proposicin hace que el encabezamiento quede como primera y ltima celda
de la cola.
El procedim iento QUITA_DE_COLA(C) suprim e el prim er elem ento de C des
conectando el encabezado antiguo de la cola. El prim er elem ento de la lista se con
vierte en la nueva celda ficticia de encabezam iento.
La figura 2.20 m uestra los resultados originados por la sucesin de m andatos
A N U L A Q , PO NE_EN_COLA(x, O , PONE_EN_COLA(y, Q , QUITA_DE_COL A (Q . Obsrvese que despus de la supresin, el elem ento x ya no se considera par
te de la cola, por estar en el cam po elem ento de la celda de encabezam iento.
t O bsrvese que la palabra consecu tivas debe interpretarse en un sen tid o circular. Esto es, una cola
de longitud cuatro puede ocupar, por ejem plo, las dos ltim as y las d o s prim eras posiciones del arreglo.
www.FreeLibros.me
COLAS
59
www.FreeLibros.me
60
ANULA ( O
C. ant
C. post
Fig. 2.20.
www.FreeLibros.me
C O R R ESPO N D EN CIA S
61
Se escribirn ahora los cinco m andatos para colas usando esta representacin.
Form alm ente, las colas se definen:
type
COLA - record
elementos: array[l ..ong-m x] o f tipo_elem ento;
ant, post: integer
end;
Los m andatos aparecen en la figura 2.22. La funcin sum a-uno() sum a uno a la po
sicin i, en el sentido circular.
long-m x
2 .5
Correspondencias
www.FreeLibros.me
62
www.FreeLibros.me
C O R R ESPO N D EN CIA S
63
se desee introducir nuevos elem entos en el dom inio actual de M y establecer sus va
lores asociados de contradom inio. C om o solucin distinta, se podra desear cam biar
el valor de M(d). T am bin se necesita una m anera de asignar valor inicial a una
correspondencia com o la correspondencia nula o vaca, cuyo dom inio est vaco. Es
tas operaciones se resum en en los tres m andatos siguientes:
Hace que M sea la correspondencia nula.
1.
ANULA (A/).
2.
ASIGNA (A/, d, r). Define M(d) como r, tanto s M(d) est definido previa
mente como si no.
CALCULA (A/, d, r). Devuelve verdadero y da a r el valor M(d) si este ltim o
est definido; en caso contrario, devuelve falso.
3.
www.FreeLibros.me
64
www.FreeLibros.me
2 .6
65
www.FreeLibros.me
66
r
RECUPERAR, M). contradominio\
return (true)
end;
p
S IG U IE N T E ^. M)
end;
return (false) | si d no est en el dom inio I
end; ) CALCULA j
Fig. 2.24.
www.FreeLibros.me
67
cin existe, todo el problem a est resuelto y la solucin incluye a p de m odo que
ste se im prim e. Si no hay solucin, se efecta la llam ada a mochila(s, i + 1), para
ver si existe una solucin que no use p,.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
writeln(pesos [candidato]);
return (true)
end
else i la nica solucin posible es sin candidato (
return (mochila(objetivo, candidato+ 1))
end; t mochila |
Fig. 2.25.
Este cam bio funciona, porque volver a ejecutar P con el nuevo valor de x equi
vale exactam ente a llam ar a P(y) y luego volver de esa llam ada. Obsrvese que el he
cho de que algunas de las variables locales de P tengan valores en la segunda llam a
da no tiene consecuencias. P no podra usar ninguno de esos valores, pues si se hu
biera llam ado a P(y) com o se intentaba en un principio, esos valores no habran es
tado definidos.
En la figura 2.25 se ilustra otra variante de la recursin de cola; ah, el ltim o
paso de la funcin mochila slo devuelve el resultado de llam arse a s m ism a con
otros parm etros. En una situacin tal, suponiendo que los parm etros se pasan por
t A lternativam ente, x podra pasarse por referencia si y es x.
www.FreeLibros.me
68
valor (o por referencia, si el m ism o parm etro es el que se pasa a la llam ada), se pue
de reem plazar la llam ada por asignaciones a los parm etros y un salto al principio
de la funcin. En el caso de la figura 2.25, se puede reem plazar la lnea (8) por
candidato
candidato + 1;
goto principio
donde principio es una etiqueta que se va a asignar a la proposicin (1). Obsrvese
que no se necesita ningn cam bio a objetivo, puesto que su valor pasa intacto como
prim er parm etro. De hecho, se puede advertir que, al no haber cam biado objetivo,
las pruebas de las proposiciones (1) y (3) que lo incluyen estn destinadas a fallar y,
por tanto, es posible o m itir las lneas (1) y (2), realizar slo la prueba candidato > n
en la lnea (3) y luego proseguir directam ente a la lnea (5).
ninguno, que indica que la llam ada procede de fuera de la funcin mochila.
incluido, que indica la llam ada de la lnea (5), la cual incluye pesos[candidato]
d entro de la solucin, o
excluido, que indica la llam ada de la lnea (8), la cual excluye a pesos[candidato].
www.FreeLibros.me
69
cam bia de incluido a excluido. Com o ayuda para representar el efecto del retom o de
mochila cuando indican si se ha hallado la solucin, se usa una variable global ban
dera-xito. U na vez que bandera-xito tom a el valor verdadero, lo conserva y hace
que se saquen de la pila los registros, im prim iendo aquellos pesos que tienen aso
ciado un estado incluido. C on estas m odificaciones, se puede declarar la pila como
una pila de estados, m ediante.
type
estados - (ninguno, incluido, excluido)-,
PILA - I declaracin adecuada para una pila de estados 1
La figura 2.26 m uestra el procedim iento resultante no recursivo mochila, que opera
en un arreglo de pesos com o antes. A unque este procedim iento puede ser m s r
pido que la funcin mochila original, es claram ente m s largo y m s difcil de en
tender. Por ello slo se debe elim inar la recursin cuando la velocidad sea muy im
portante.
procedure mochila (objetivo: integer );
var
candidato: integer;
bandera-xito: boolean;
P-. PILA;
begin
c a n d i d a t o 1;
bandera-xito := false;
ANULA(P);
METE (ninguno, P)\ f asigna valor inicial a la pila considerando p e so s[\])
repeat
if bandera-xito then begin
I saca de la pila e im prim e los pesos incluidos en la solucin }
if TOPE(P) - incluido then
writeln (pesos[candidato])\
candidato := candidato-i-,
SACA (P)
end
else if objetivo *=0 then begin { se encontr la solucin I
bandera-xito := true;
candidato
candidato -1;
SACA(P)
end
else if (((objetivo < 0) and (TOPE(P) - ninguno))
or (candidato > n)) then begin
i no hay solucin posible con las elecciones hechas |
candidato := candidato -1;
SACA (F)
www.FreeLibros.me
70
end
else 1 an no hay decisin, se considera el estado del candidato actual I
if TOPE(P) - ninguno then begin I se intenta prim ero incluyendo al
candidato I
objetivoobjetivo-pesos[candidato]\
candidato
candidato +1;
SACA(P); METE (incluido, P)\ METE (ninguno, P)
end
else if TOPE(P) - incluido then begin f se intenta excluyendo al
c a n d id a to }
objetivo
objetivo + pesos[candidato];
c a n d id a to c a n d id a to +1;
SACA(P); M ETE (excluido, P)\ M ETE(ninguno, P)
end
else begin I T O PE(P) - excluido; la eleccin actual no da resultado (
SACA (F)\
candidato := candidato -1
end
until VACIA (P)
end; i mochila 1
Fig. 2.26.
Ejercicios
2.1
Escrbase un program a que im prim a los elem entos de una lista. En los ejer
cicios siguientes sense operaciones con listas para realizar los programas.
2.2
2.3
2.4
2.5
Supngase que se desea m an ip u lar polinom ios de la form a p(x) - cxf' + cpC1+ ... + c j ? \ donde e, > e2 > ... > e > 0. Un polinomio de
ese tipo se puede representar mediante una lista enlazada en la que cada celda
www.FreeLibros.me
EJER CICIOS
71
tiene tres cam pos: uno para el coeficiente c otro para el exponente e y
otro para el apuntador a la siguiente celda. Escrbase un program a para di
ferenciar polinom ios representados de esta m anera.
2.6
*2.7
Escrbanse program as para sum ar y m ultiplicar polinom ios sim ilares a los
del ejercicio 2.5. Cul es el tiem po de ejecucin de los program as en fun
cin del nm ero de trm inos?
Supngase que se declaran celdas m ediante
type
tipo_celda - record
bit: 0..1;
sig: f tipo_celda
end;
U n nm ero binario 6,62 ... b, donde cada b es 0 1, tiene el valor numn
rico 2 ) 6,2""'. Este nm ero se puede representar por la lista 6,, >2, ... bn.
-l
Esta lista, a su vez, puede representarse com o una lista enlazada de celdas
de tipo tipo_celda. Escrbase un procedim iento incrementa(nmero~bin)
que sum e uno al nm ero binario apuntado por nm ero-bin. Sugerencia:
Hgase incrementa recursivo.
2.8
Escrbase un procedim iento para intercam biar los elem entos de las posicio
nes p y S IG U IE N T E ^) de una lista enlazada sencilla.
*2.9
www.FreeLibros.me
72
2.10
Se desea alm acenar una lista en un arreglo A cuyas celdas contienen dos
cam pos: datos, que contiene un elem ento, y posicin, que da la posicin (en
tera) del elem ento. U n entero ltim o indica que la lista ocupa las posicio
nes /1[1] a A[llimo]. El tipo LISTA se puede definir como:
type
LISTA - record
ltimo: integer;
elementos-. array[l ..long-m dx] of record
datos: tipo_elem ento;
posicin: integer
end
end;
Escrbase un procedim iento SUPRIM E(p, L ) que elim ine el elem ento de la
posicin p. Inclyanse todas las verificaciones necesarias para detectar erro
res.
2.11
2.12
2.13
2.14
www.FreeLibros.me
EJER CICIOS
73
2.15
Supngase que se desea utilizar un bit extra en los registros de colas, que
indique si una cola est vaca o no. M odifiqense las declaraciones y las
operaciones para una cola circular, de m anera que se tenga en cuenta esta
caracterstica. Cabe esperar que el cam bio valga la pena?
2.16
2.17
Defnase un TD A que m aneje las operaciones PO E_EN_COLA, Q U ITA_DE_COLA y ESTA_EN_COLA. ESTA_EN_COLA(x) es una funcin
que devuelve verdadero o falso dependiendo de si x est o no en la cola.
2.18 Cmo podra obtenerse una cola cuyos elem entos son cadenas de longitud
arbitraria? Cunto tiem po lleva poner en cola una cadena?
2.19
2.20
2.21
Es posible guardar dos pilas en un solo arreglo, si una de ellas crece desde
la posicin 1 del arreglo y la otra lo hace desde la ltim a posicin. Escr
base un procedim iento METE(x, P) que inserte el elem ento x en la pila P,
donde P es una u otra de las dos pilas. Inclyanse en el procedim iento to
das las verificaciones de error necesarias.
2.22
www.FreeLibros.me
74
b)
2.23
2.24
Usese una pila para elim inar la recursin de los siguientes procedimientos.
a)
Fig. 2.27.
www.FreeLibros.me
NOTAS BIBLIOGRAFICAS
b)
*2.25
75
Es posible elim inar la recursin de cola de los program as del ejercicio 2.24?
De ser as, hgase.
Notas bibliogrficas
Knuth [ 1968] contiene inform acin adicional sobre la realizacin de listas, pilas y co
las. Ciertos lenguajes de program acin com o LISP y SNOBOL, m anejan listas y ca
denas de m anera apropiada. Vanse Sam m et [1969], Nicholls [1975], Pratt [1975]
o W exelblat [1981] sobre una historia y una descripcin de m uchos de estos lengua
jes.
www.FreeLibros.me
176)
Arboles
Un rbol im pone una estructura jerrquica sobre una coleccin de objetos. Los r
boles genealgicos y los organigram as son ejem plos com unes de rboles. Entre otras
cosas, los rboles son tiles para analizar circuitos elctricos y para representar la
estructura de frm ulas m atem ticas. T am bin se presentan naturalm ente en diver
sas reas de com putacin. Por ejem plo, se usan para organizar informacin en sis
tem as de bases de datos y para representar la estructura sintctica de un programa
fuente en los com piladores. En el captulo 5 se describe el uso de rboles en la re
presentacin de datos. En este libro se usan m uchas variantes de rboles. En este ca
ptulo se presentan las definiciones bsicas y algunas de las operaciones m s com u
nes con rboles. Despus se describen algunas de las estructuras de datos ms fre
cuentem ente usadas para representar rboles que perm iten m anejar esas operacio
nes con eficiencia.
3 .1
U n rbol es una coleccin de elem entos llam ados nodos, uno de los cuales se distin
gue com o raz, ju n to con una relacin (de paternidad) que im pone una estructura
jerrquica sobre los nodos. U n nodo, com o un elem ento de una lista, puede ser del
tipo que se desee. A m enudo se representa un nodo por m edio de una letra, una ca
dena de caracteres o un crculo con un nm ero en su interior. Form alm ente, un r
bol se puede definir de m anera recursiva com o sigue:
1.
2.
U n solo nodo es, por s m ism o, un rbol. Ese nodo es tam bin la raz de dicho
rbol.
Supngase que n es un nodo y que A u A 2, ..., A k son rboles con races n t, n2,
..., nk, respectivam ente. Se puede construir un nuevo rbol haciendo que n se
constituya en el padre de los nodos /*,, n2, .... nk. En dicho rbol, n es la raz y
A |, A 2, ..., A k son los subrboles de la raz. Los nodos n n2, ..., nk reciben el nom
bre de hijos del nodo n.
A veces, conviene incluir entre los rboles el rbol nulo, un rbol sin nodos que
se representa m ediante A.
Ejemplo 3.1. Considrese el ndice general de un libro, que se representa en la
figura 3.1(a). Tal ndice es un rbol. Se puede redibujar en la form a m ostrada en la
www.FreeLibros.me
TER M IN O LO G IA FU N D A M EN TA L
77
figura 3. l(b). La relacin padre-hijo entre dos nodos se representa por una lnea que
los une. Los rboles norm alm ente se dibujan de arriba hacia abajo, com o en la fi
gura 3.1(b), con el padre encim a de los hijos.
La raz, el nodo llam ado Libro, tiene tres subrboles que corresponden a los
captulos C l, C2 y C3. Esta relacin se representa por m edio de las lneas descen
dentes que unen a Libro con C l, C2 y C3. Libro es el padre de C l, C2 y C3, y estos
tres nodos son los hijos de Libro.
Libro
Cl
sl . l
s i.2
C2
s2 .1
s2.1.1
52.1.2
s2.2
s2.3
C3
Libro
C1
sl.l
C2
s i.2
s2.1.1
s2.1
s2.2
s2.3
s2.1.2
(a)
Fig. 3.1.
C3
(b)
Un ndice general y su representacin com o rbol.
El tercer subrbol de Libro, que tiene raz C3, es un rbol de un solo nodo, en
tanto que los otros dos subrboles tienen una estructura no trivial. Por ejem plo, el
subrbol con raz C2 tiene tres subrboles que corresponden a las secciones s2 .l,
s2.2 y s2.3; estas dos ltim as son rboles de un solo nodo, m ientras que la prim era
tiene dos subrboles que corresponden a las subsecciones s2.1. 1 y s2 .1.2.
El ejem plo 3.1 es tpico de cierta clase de datos cuya mejor representacin se lo
gra m ediante un rbol. En el ejem plo, la relacin de paternidad representa inclu
sin: un nodo padre est constituido por sus hijos, com o Libro est constituido por
C l, C2 y C3. En esta obra se encontrarn otras relaciones que se pueden representar
por la relacin de paternidad en un rbol.
Si /i,, n2, ..., nk , es una sucesin de nodos de un rbol tal que n, es el padre de
n, + 1 para 1 < i < k, entonces la secuencia se denom ina cam ino del nodo n, al nodo
nk. La longitud de un cam ino es el nm ero de nodos del cam ino m enos 1. Por tanto,
hay un cam ino de longitud cero de cualquier nodo a s m ismo. Por ejem plo, en la
figura 3.1 hay un cam ino de longitud 2, a saber, (C2, s2.1, s2 .1.2), de C2 a s2 .1.2.
Si existe un cam ino de un nodo a a otro b, entonces a es un antecesor de b, y b
es un descendiente de a. Por ejemplo, en la figura 3.1, los antecesores de s2.1 son l
mismo, C2 y Libro. Obsrvese que cada nodo es a la vez un antecesor y un descen
diente de s mismo.
Un antecesor o un descendiente de un nodo que no sea l mismo recibe el nom
bre de antecesor propio o descendiente propio, respectivam ente. En un rbol, la raz
es el nico nodo que no tiene antecesores propios. Un nodo sin descendientes pro-
www.FreeLibros.me
78
ARBOLES
pios se denom ina hoja. Un subrbol de un rbol es un nodo ju n to con todos sus des
cendientes.
La altura de un nodo en un rbol es la longitud del cam ino m s largo de ese nodo
a una hoja. En la figura 3.1 el nodo C1 tiene altura 1, C2 altura 2 y el nodo C3 al
tura 0. La altura del rbol es la altura de la raz. La profundidad de un nodo es la
longitud del cam ino nico desde la raz a ese nodo.
Flfl. 3.2.
El orden de izquierda a derecha de los hermanos (hijos del m ismo nodo) se pue
de extender para com parar dos nodos cualesquiera entre los cuales no exista la re
lacin antecesor-descendiente. La regla que se aplica es que si a y b son herm anos
y a est a la izquierda de b, entonces todos los descendientes de a estn a la izquier
da de todos los descendientes de b.
Ejemplo 3.2. Considrese el rbol de la figura 3.3. El nodo 8 est a la derecha del
nodo 2, a la izquierda de los nodos 9, 6, 10, 4 y 7, y no est a la izquierda ni a la
derecha de sus antecesores 1, 3 y 5.
4
5
i
10
Fig. 3.3.
Un rbol.
www.FreeLibros.me
TER M IN O LO G IA FU N D A M EN TA L
79
Dado un nodo n, una regla sencilla para determ inar qu nodos estn a su izquier
da y cules a su derecha, consiste en dibujar el cam ino de la raz a n. T odos los no
dos que salen a la izquierda de este cam ino, y todos sus descendientes, estn a la iz
quierda de n. Los nodos, y sus descendientes, que salen a la derecha, estn a la de
recha de n.
El lisiado en orden previo (o recorrido en orden previo) de los nodos de A est for
m ado por la raz de A , seguida de los nodos de A , en orden previo, luego por
los nodos de A 2 en orden previo y as sucesivam ente hasta los nodos de A k en
orden previo.
2. El listado en orden simtrico de los nodos de A est constituido por los nodos
de A, en orden sim trico, seguidos de n y luego por los nodos de A 2, A k, con
cada grupo de nodos en ofden sim trico.
3. El listado en orden posterior de los nodos de A tiene los nodos de A s en orden
posterior, luego los nodos de A 2 en orden posterior y as sucesivam ente hasta los
nodos de A k en orden posterior y por ltim o la raz n.
1.
La figura 3.5(a) m uestra el esbozo de un procedim iento para listar los nodos de
un rbol en orden previo. Para convertirlo en un procedim iento de recorrido en o r
den posterior, basta invertir el orden de los pasos (1) y (2). La figura 3.5(b) es un es
bozo de un procedim iento de recorrido en orden sim trico. En los tres casos, el or
www.FreeLibros.me
80
ARBOLES
denam iento deseado de un rbol se produce llam ando al procedim iento apropiado
en la raz del rbol.
Ejemplo 3.3. Lstense en orden previo los nodos del rbol de la figura 3.3. Primero
se lista 1, y luego se llama recursivam ente a O R D _PR E en el prim er subrbol
de 1, o sea el subrbol con raz 2. Este subrbol tiene un solo nodo, de m anera que
sim plem ente se lista. Luego se sigue con el segundo subrbol de 1, el que tiene raz 3.
Se lista 3 y luego se vuelve a llam ar a O R D -P R E en el prim er subrbol de 3. Esta
llam ada origina que se listen 5, 8 y 9, en ese orden. C ontinuando de esta forma, se
obtiene el recorrido com pleto en orden previo de la figura 3.3: 1, 2, 3, 5, 8, 9, 6, 10,
4, 7.
procedure O R D .P R E ( r : nodo );
begin
(1)
(2)
lista n;
for cada hijo c de n, si los hay, en orden desde la izquierda do
ORD_PRE(c)
end;
fO R D .P R E )
(a) procedim iento O RD _PRE.
lista n
else begin
De m anera similar, sim ulando la figura 3.5(a) con el orden de los pasos inverti
do, se puede descubrir que el recorrido en orden posterior de la figura 3.3 es 2, 8,
9, 5, 10, 6, 3, 7, 4, 1. Sim ulando la figura 3.5(b), se encuentra que el listado en orden
sim trico de la figura 3.3 es 2, 1, 8, 5, 9, 3, 10, 6, 7, 4.
U n truco til para producir los tres ordenam ientos de nodos es el siguiente. Ima
ginse que se cam ina por la periferia del rbol, partiendo de la raz, y que se avanza
en sentido contrario al de las m anecillas del reloj, m antenindose tan cerca del rbol
www.FreeLibros.me
TER M IN O LO G IA FU N D A M EN TA L
81
como sea posible; el cam ino previsto para la figura 3.3 est representado en la figura
3.6.
Para el orden previo se lista un nodo la prim era vez que se pasa por l. En el
caso del orden posterior, se lista un nodo la ltim a vez que se pasa por l, conform e
se sube hacia su padre. T ratndose del orden sim trico, se lista una hoja la prim era
vez que se pasa por ella, y un nodo interior, la segunda vez que se pasa por l. A
m anera de ejemplo, en la figura 3.6 se pasa por el nodo 1 al em pezar, y otra vez al
pasar por la baha entre los nodos 2 y 3. Obsrvese que el orden de las hojas en
los tres ordenam ientos corresponde al m ismo ordenam iento de izquierda a derecha
de las hojas. Slo el orden de los nodos interiores y su relacin con las hojas vara
entre los tres ordenam ientos.
V
x'
Fig. 3.6.
Recorrido de un rbol.
1.
2.
Cada hoja est etiquetada con un operando y slo consta de ese operando. Por
ejemplo, el nodo rc4 representa la expresin a.
Cada nodo interior n est etiquetado con un operador. Supngase que n est eti
quetado con el operador binario 0, como + o *, y que el hijo izquierdo de n re
www.FreeLibros.me
82
ARBOLES
Fig. 3.7.
www.FreeLibros.me
EL TDA ARBOL
83
3 .2
El TDA ARBOL
www.FreeLibros.me
84
ARBOLES
3.
4.
5.
6.
7.
Tam bin se desarrollar un procedim iento no recursivo para im prim ir las eti
quetas en orden previo. Para ubicarse en el rbol se usar una pila P, cuyo tipo PILA
es, en realidad, pila de nodos. La idea bsica del algoritm o es que cuando se est
en un nodo n, la pila contendr el cam ino de la raz a n, con la raz en la base de la
pila y el nodo n en la parte superior +.
t R ecurdese el anlisis sobre recursividad de la seccin 2 .6 , dond e se m ostr que la im plantacin de
un procedim ien to recursivo requiere una pila de registros de activacin . Si analiza la figura 3.8, se observa
www.FreeLibros.me
REALIZACIONES DE ARBOLES
85
3 .3
Realizaciones de rboles
Ejemplo 3.6.
que cuando se llam a a O R D .P R E (n), las llam adas a procedim ien tos activas, y por tanto la pila de regis
tros de activacin , corresponden a las llam adas a O R D _ P R E para to d o s los antecesores de n. A s, el pro
cedim iento no recursivo de orden previo, c o m o el ejem plo de la seccin 2.6. m odela con exactitud la for
ma de implantar el procedim ien to recursivo.
www.FreeLibros.me
86
ARBOLES
RAIZ(/1);
while true do
f m < > A then begin
pr/n/(ETIQUETA(m , A))\
METE(m, P),
I explora el hijo m s a la izquierda de m )
m
HIJO_M A S_IZQ(m , A)
end
else begin
nodo = integer;
ARBOL - array [\..nodos-m x) of nodo;
Para esta representacin se supone que el nodo nulo A se representa por 0.
www.FreeLibros.me
REALIZACIONES DE ARBOLES
7
(a)
l
0
(b)
Fig. 3.10.
2
1
3
1
87
un rbol
4
5
2 | 2
6
5
7
8
9
10
5 1 5 | 3 | 3 |
i, padre, nodo;
begin
padreA[ri\\
for /':-/+ 1 to nodos-m x do
derecho |
end; ! H E R M A N O .D E R
Fig. 3.11.
www.FreeLibros.me
88
ARBOLES
que estn num erados del 1 al 10. C ada encabezam iento apunta a una lista enlazada
de elem entos que son nodos del rbol. Los elem entos de la lista encabezada por
encabezamiento[/] son los hijos del nodo /; por ejemplo. 9 y 10 son los hijos de 3.
encabezamiento
Fig. 3.12.
nodo - integer;
LISTA = definicin apropiada para listas de nodos |;
posicin = I definicin apropiada para posiciones en lis ta s);
ARBOL = record
encabezamiento: array [ \ ..nodos-m x) of LISTA;
etiquetas: array [l..nodos-m dx] of tipo.etiq u eta;
rair. nodo
end;
Se supone que la raz de cada rbol est alm acenada explcitam ente en el campo
raz, y que se usa 0 para representar el nodo nulo.
La figura 3 .13 m uestra el cdigo para la operacin H IJO -M A S -IZ Q . Com o ejer
cicio. sera til escribir el cdigo para las restantes operaciones.
function H IJO_M A S_IZQ ( n: nodo; A: ARBOL ) : nodo;
www.FreeLibros.me
REALIZACIONES DE ARBOLES
89
begin
L
A .encabezamento[n];
if VACIA(Z-) then | n es una hoja (
return (0)
else
Ahora se elegir una implantacin particular para las listas, en la cual tanto LISTA
como posicin sean enteros, em pleados com o cursores a un arreglo espacio-celdas
de registros:
var
Para simplificar, no se insistir en que las listas de hijos tienen celdas de encabeza
miento. Ms bien, se har qut A.encabezamiento[n] apunte directam ente a la prim era
celda de la lista, como se sugiere en la figura 3.12. La figura 3.14(a) muestra la funcin
HIJO_MAS_IZQ de la figura 3.13, escrita otra vez para esta realizacin en particu
lar. La figura 3.14(b) m uestra el operador PADRE, que es ms difcil de escribir usan
do esta representacin de listas, puesto que se requiere una bsqueda en todas ellas
para determ inar en cul aparece un nodo dado.
function H IJO_M A S_IZQ ( n: nodo; A: ARBOL ) : nodo;
A.encabezado[n]\
(a)
www.FreeLibros.me
90
ARBOLES
var
1 to n odos-m x do begin
iA .e n c a b e z a d o [ p ] \
while / < > 0 do I verifica si n est entre los hijos de p }
if espacio-celdas[i].nodo - n then
return (p)
else
ie s p a c io -c e ld a s[).sig
end;
(b)
Fig. 3.14.
La funcin PADRE.
Entonces, puesto que ya no hay nodos con nom bres 1, 2, ..., n, sino que los nodos
estn representados por ndices arbitrarios de espacio-nodos, no es posible que el
cam po nodo de espacio-celdas represente el nm ero de un nodo; en cam bio, nodo
es ahora un cursor a espacio-nodos, que indica la posicin de ese nodo. El tipo AR
BOL es sencillam ente un cursor a espacio-nodos que indica la posicin de la raz.
www.FreeLibros.me
REALIZACIONES DE ARBOLES
91
Ejemplo 3.7.
espacio-celdas
(b)
Fig. 3.15.
Estructura de datos
La estructura de la figura 3 .15(b) es adecuada para com binar rboles por medio
de operaciones CREA/. Sin embargo, esta estructura se puede sim plificar de modo
significativo. Prim ero, se observa que las cadenas de apuntadores sig de espacio-celdas son en realidad apuntadores a herm anos derechos.
U sando estos apuntadores, se pueden obtener los hijos m s a la izquierda como
sigue. Supngase que e s p a c t O - c e l d a s [ i ] . n o d o = n . (Recurdese que el nom bre de
un nodo, en oposicin a su etiqueta, es en realidad su ndice en espacio-nodos, que
es el valor de e s p a c i O - c e ld a s [ i] .n o d o .) Entonces, espacio-nodos[n\.encabezamienio indica
la celda ocupada por el hijo m s a la izquierda de n en e s p a c i - c e l d a s , en el sentido
de que el cam po n o d o de esa celda es el nom bre de tal nodo en espacio-nodos.
Se pueden sim plificar las cosas si se identifica un nodo no por su ndice en es
pacio-nodos. sino por el ndice de la celda de espacio-celdas que lo representa como
hijo. Entonces los apuntadores sig de espacio-celdas apuntarn en realidad a her
m anos derechos, y la inform acin contenida en el arreglo espacio-nodos se podr
guardar introduciendo un cam po h ijo -m s-izq en espacio-celdas. El tipo de datos
ARBOL se convertir en un entero em pleado como cursor a espacio-celdas para in
dicar la raz del rbol. Se declara espacio-celdas para tener la siguiente estructura:
www.FreeLibros.me
92
ARBOLES
var
izq
der
espacioceldas
Fig. 3.16.
www.FreeLibros.me
REALIZACIONES DE ARBOLES
93
tem p
disp:
disp
espacio-celdas[disp).hermano-der,
espacio-celdas[temp].hijo-ms_ izq
A 1;
espacio-celdas{temp].etiqueta := v;
espacio-celdas[temp].hermano-der := 0;
espacio-celdas[A 1].hermano-der
A2\
espacio-celdas[A2].hermano-der
0; ] no es necesario; ese
cam po debera valer 0, pues la celda era una raz !
return (temp)
end; I CREA2 |
Fig. 3.17.
Fig. 3.18.
La funcin CREA2.
Com o alternativa, se puede usar m enos espacio, pero m s tiem po, si se coloca
en el cam po herm ano derecho del hijo m s a la derecha un apuntador al padre, en
lugar del apuntador nulo que, de lo contrario, estara ah. Para evitar confusiones,
se necesitara en cada celda un bit que indicase si el cam po herm ano derecho tiene
un apuntador al herm ano derecho o al padre.
As, dado un nodo, se encontrara su padre siguiendo apuntadores herm ano de
recho hasta encontrar uno que fuera apuntador al padre. Com o todos los herm anos
tienen el m ismo padre, se encontrara el cam ino al padre del nodo del que se parti.
El tiem po necesario para encontrar el padre de un nodo en esta representacin de
pende del nm ero de herm anos que tenga el nodo.
www.FreeLibros.me
94
3 .4
ARBOLES
Arboles binarios
El rbol que se defini en la seccin 3.1 recibe a veces el nom bre de rbol ordenado
orientado, porque los hijos de cada nodo estn ordenados de izquierda a derecha, y
porque existe un cam ino orientado (un cam ino en una direccin particular) de cada
nodo a sus descendientes. O tro concepto til y m uy distinto de rbol es el de r
bol binario, que define un rbol vaco o un rbol en el que cada nodo no tiene hijos,
tiene un hijo izquierdo, un hijo derecho o un hijo izquierdo y un hijo derecho. El he
cho de que cada hijo se designe en este caso com o hijo izquierdo o como hijo dere
cho hace que un rbol binario sea distinto de un rbol ordenado orientado, tal como
se defini en la seccin 3.1.
Ejemplo 3.9. Si se adopta la convencin de que los hijos izquierdos se dibujan ha
cia la izquierda de su padre y los hijos derechos hacia la derecha, las figuras 3 .19(a)
y (b) representan dos rboles binarios distintos, aunque am bos se parecen al rbol
ordinario (ordenado orientado) de la figura 3.20. Sin embargo, se hace hincapi en
que los de la figura 3.19 no son iguales entre si ni son en ningn sentido iguales al
de la figura 3.20, por la sencilla razn de que los rboles binarios no son directa
m ente com parables con los rboles ordinarios. Por ejem plo, en la figura 3.19(a).
2 es el hijo izquierdo de 1, que no tiene hijo derecho; en cam bio, en la figura 3.19(b),
1 no tiene hijo izquierdo, pero tiene a 2 com o hijo derecho. En am bos rboles bi
narios, 3 es el hijo izquierdo de 2 y su hijo derecho es 4.
Los listados en rdenes previo y posterior de un rbol binario son sim ilares a los
de un rbol ordinario dados en la pgina 79. El listado en orden sim trico de los no
dos de un rbol binario con raz n, subrbol izquierdo A y subrbol derecho A 2, es
el listado en orden sim trico de A, seguido de n y del listado en orden sim trico de
A 2. Por ejemplo, 35241 es el listado en orden sim trico de los nodos del rbol de la
figura 3.19(a).
www.FreeLibros.me
ARBOLES BINARIOS
95
(a)
(b)
Fig. 3.19.
5
Fig. 3.20.
Un rbol ordinario.
www.FreeLibros.me
96
ARBOLES
hijo-izq
hijo-der
2
3
0
0
0
0
4
5
0
0
1
2
3
4
5
Fig. 3.21.
Ejemplo 3.11. La figura 3.22 m uestra dos cdigos posibles para el alfabeto de cin
co sm bolos que se est utilizando. Es evidente que el cdigo 1 tiene la propiedad
de prefijos, puesto que ninguna sucesin de tres bits puede ser prefijo de otra suce
sin con igual nm ero de bits. El algoritm o de decodificacin para el cdigo 1 es sen
cillo. Basta to m ar tres bits de cada vez y traducir cada grupo de stos en un carcter.
Por supuesto, las sucesiones 101, 110 y 111 no pueden presentarse si la cadena de
bits codifica realm ente caracteres de acuerdo con el cdigo 1. Por ejemplo, si se re
cibe el m ensaje codificado 001010011, se puede saber que el m ensaje original era
bcd.
Smbolo
a
b
c
d
e
Probabilidad
0.12
0.40
0.15
0.08
0.25
Fig. 3.22.
Cdigo 1
000
001
010
011
100
Cdigo 2
000
11
01
001
10
www.FreeLibros.me
ARBOLES BINARIOS
97
Ejemplo 3.12.
www.FreeLibros.me
98
ARBOLES
(b)
(a)
Fig. 3.23.
b
(a)
0.20
a
(b)
Inicial
www.FreeLibros.me
0.40 0.15
0.25
Com bina a y d
0 .3 5
d
(c)
99
0 .6 0
0.40
0.25
0.40
b
1.00
d
(d)
d
(e)
Flg. 3.24.
Arbol final
para asociar a cada sm bolo del alfabeto a codificar la hoja que le corresponda. Este
arreglo tam bin registra la probabilidad de cada carcter. En tercer lugar, se necesita
un arreglo BOSQU E de registros que representen los rboles mismos. El tipo de
esos registros es
record
peso: real;
rair. integer I cursor a un rbol [
end
Los valores iniciales de todos los arreglos correspondientes a los datos de la figura
3.24(a) se m uestran en la figura 3.25. En la figura 3.26 se m uestra un esbozo del pro
grama para construir el rbol de Huffman.
1 0.12
0.12
0.40
0.40
3 0.15
0.15
0.08
0.25
0.08
5 0.25
peso
raz
BO SQ U E
A LF AB E TO
F ig . 3 .2 5 .
www.FreeLibros.me
100
ARBOLES
(1)
(2)
(3)
(4)
(5)
(6)
Fig. 3.26.
Para aplicar la lnea (4) de la figura 3.26, la cual increm enta el nm ero de celdas
em pleadas del arreglo ARBO L, y las lneas (5) y (6), que dism inuyen el nm ero de
celdas utilizadas de BOSQUE, se introducen los cursores lt-rbol y ll-nodo. que
apuntan hacia BO SQ U E y A R B O L . respectivam ente. Se supone que las celdas 1 a
lt-rbol de BO SQ U E y 1 a lt-nodo de A R B O L estn ocupadas f. Se supone tam
bin que los arreglos de la figura 3.25 tienen declaradas sus longitudes, pero en lo
que sigue se om itirn las com paraciones entre esos lm ites y los valores de los cur
sores.
procedure m sJigeros ( var menor, segundo: integer );
I asigna menor y segundo a los ndices en BO SQ U E de los dos rboles
de m enor peso; se supone que lt-rbol > 2. |
var
i: integer;
begin
| asigna valor inicial a m enor y a segundo teniendo en cuenta
los dos prim eros rboles I
if BOSQUE[\].peso < = BOSQUE[2].peso then
begin menor := 1; segundo := 2 end
else
begin menor
2; segundo
lend;
{ Ahora recorre i desde 3 a lt-rbol. En cada iteracin, menor es
el rbol de m enor peso entre los / prim eros de BOSQU E; y
segundo, el siguiente en peso entre los m ismos i
for i := 3 to lt-rbol do
if BOSQUE[i].peso < BOSQUE[menor].peso then
begin segundo
menor, m enor
i end
else if BOSQUE[i].peso < BOSQUE[segundo).peso then
segundo
i
end; \ m sJigeros I
t En la fase de lectura, aqu om itid a, tam bin se requiere un cursor para el arreglo A L F A B E T O , m ien
tras se llena con los sm bolos y sus probabilidades.
www.FreeLibros.me
ARBOLES BINARIOS
101
La figura 3.27 m uestra dos procedim ientos tiles; el prim ero es una realizacin
de las lneas (2) y (3) de la figura 3.26, en las que se seleccionan los ndices de los
dos rboles de m enor peso. El segundo es la orden crea(nt,n2), que crea un nuevo
nodo y hace que n t y n2 se conviertan en sus hijos izquierdo y derecho.
Ahora es posible describir con m s detalles los pasos de la figura 3.26. En la fi
gura 3.28 se puede ver un procedim iento H uffm an, que no tiene parm etros sino
que trabaja con las estructuras globales de la figura 3.25.
procedure H uffm an4,
var
i, j: integer; i los dos rboles de m enor peso en B O SQ U E (
nueva-raz: integer;
begin
while lt-rbol > 1 lo begin
m sJigeros(i, ;
nu eva -ra z: - crea(i, j)\
I Ahora reem plaza el rbol i por el rbol cuya raz es nue
va-raz !
BOSQUE[i].peso := BOSQUE[i).peso + BOSQUE\j).peso4,
BO SQ UE[/].raz :- nueva-raz4,
luego reem plaza el rbol j, que ya no se necesita,
por lt-rbol, y acorta B O SQ U E en uno i
BOSQUE[f] := BO SQU E[lt-rbol];
lt-rbol := lt-rbol - 1
end
end; I H uffm an )
Fig. 3.28.
Algoritm o de Huffman.
www.FreeLibros.me
102
ARBOLES
ALFABETO
6
3
0
hijo-izq hijo-der padre
ARBOL
Fig. 3.29.
www.FreeLibros.me
EJERCICIOS
103
Por otro lado, si se usara este tipo de nodos para un rbol binario, la funcin crea
de la figura 3.27 se escribira como se muestra en la figura 3.30.
function crea ( rboLizq, rbol-der. f nodo ) : f nodo;
var
raz: * nodo;
begin
new{raiz)\
raz] .hijo Jzq
rboLizq-,
raz] .h ijo -d e r r b o l-d e r ,
r a z ] . p a d r e 0;
rb o L izq ].p a d re ra z-,
rbol-der] .padre raz;
return (raz)
end; ( crea}
Fig. 3.30. Realizacin de rboles binarios basada en apuntadores.
Ejercicios
3.1
g)
h)
i)
j)
www.FreeLibros.me
104
ARBOLES
3.2
3.3
3.4
3.5
Mustrese que s i m y n son dos nodos distintos del mismo rbol, exacta
mente una de las siguientes afirm aciones es verdadera:
a)
b)
c)
d)
3.6
m
m
m
m
est a la izquierda de n
est a la derecha de n
es un antecesor propio de n
es un descendiente propio de n.
o rd s im (n )
< o rd s im (m )
ord-post(n)
< ord-posl(m)
n est a la
izquierda de m ______________________________________________
n est a la
derecha de r t i ______________________________________________
n es un antecesor
propio de m
______________________________
n es un descen
diente propio de m ______________________________ ________________
Por ejemplo, pngase una marca en la interseccin de la fila 3 y la co
lumna 2 si se cree que n puede ser a la vez un antecesor propio d e m y pre
ceder a m e n orden simtrico.
3.7
*3.8
www.FreeLibros.me
EJERCICIOS
3.9
105
3.10
3.11
El listado en orden de nivel de los nodos de un rbol lista prim ero la raz,
luego todos los nodos de profundidad 1, despus todos los de profundi
dad 2, y as sucesivamente. Los nodos que estn a la misma profundidad
se listan en orden de izquierda a derecha. Escrbase un programa para lis
tar los nodos de un rbol en orden de nivel.
Convirtase la expresin ((a + b) + c * (d + ) + / ) * (g + h) en
a) expresin prefija
b) expresin postfija.
3.12
3.13
Sea A un rbol en el que cada nodo que no es hoja tiene dos hijos. Escr
base un program a para convertir
a) un listado en orden previo de A en un listado en orden posterior;
b) un listado en orden posterior de A en un listado en orden previo;
c) un listado en orden previo de A en un listado en orden simtrico.
3.14
www.FreeLibros.me
106
ARBOLES
3.18
*3.19
Supngase que los rboles estn realizados por medio de apuntadores al hijo
ms a la izquierda, al hermano derecho y al padre. Elabrense algoritmos
no recursivos de recorrido en los rdenes previo, posterior y simtrico, que
no utilicen estados ni una pila, como se hace en la figura 3.9.
3.20
*3.21
*3.22
Notas bibliogrficas
Berge [1958] y Harary [1969] analizan las propiedades matemticas de los rboles.
Knuth [1973] y Nievergelt [1974] contienen informacin adicional sobre los rboles
de bsqueda binarios. Muchos de los trabajos sobre grafos y sus aplicaciones, a las
que se hace referencia en el captulo 6, tambin contienen material sobre rboles.
El algoritmo dado en la seccin 3.4 para encontrar un rbol con mnima longi
tud ponderada de camino es de Huffman [1952], Parker [1980] contiene algunas ex
ploraciones ms recientes en ese algoritmo.
www.FreeLibros.me
1107]
Operaciones bsicas
con conjuntos
Los conjuntos constituyen la estructura bsica que fundam enta las m atemticas. En
el diseo de algoritmos, los conjuntos se utilizan como la base de una gran cantidad
de tipos de datos abstractos y se han desarrollado muchas tcnicas para la implanta
cin de tipos de datos abstractos basadas en conjuntos. En este captulo se hace una
revisin de las operaciones bsicas con conjuntos y se presentan algunas de las for
mas ms sencillas de realizacin de conjuntos; se estudian los diccionarios y las co
las de prioridad, dos tipos de datos abstractos basados en el modelo de conjunto.
Las realizaciones de estos tipos de datos abstractos se cubren en este captulo y
el siguiente.
4 .1
Los enteros, reales, caracteres y cadenas tienen un orden lineal natural que en Pas
cal se designa con el smbolo < . Se puede definir un orden lineal sobre los objetos
que consisten en conjuntos de objetos ordenados. Como ejercicio, determnese una
forma de desarrollar un orden de este tipo. Por ejemplo, una pregunta que se debe
contestar al desarrollar un orden lineal para un conjunto de enteros es si el conjunto
que contiene los enteros 1 y 4 debe considerarse m enor o m ayor que el conjunto que
contiene los enteros 2 y 3.
www.FreeLibros.me
108
Notacin de conjuntos
Un conjunto de tom os por lo general se representa encerrando sus miembros entre
llaves; as, 1, 4| denota el conjunto cuyos nicos m iem bros son 1 y 4. Debe recor
darse que un conjunto no es una lista, a pesar de que se representen los conjuntos
como si fueran listas; en el caso de los conjuntos, el orden en que se listan los ele
m entos no es im portante, y se pudo haber escrito 4, 1 en lugar de !1, 4|. Se debe
observar tam bin que cada elemento aparece en un conjunto slo una vez, de modo
que i 1. 4, l| no es un conjunto f.
Algunas veces se representan los conjuntos m ediante una expresin de la forma
t.t I proposicin sobre x
donde la proposicin sobre x es un predicado que dice con exactitud qu se necesita
para que un objeto arbitrario x pertenezca al conjunto. Por ejemplo, |x I x es un en
tero positivo y x < 10001 es otra m anera de representar el conjunto j 1, 2, ..., 1000},
y lx I para algn entero y. x = > designa el conjunto de los cuadrados perfectos. Ob
srvese que el conjunto de los cuadrados perfectos es infinito y no se puede repre
sentar listando sus miembros.
La relacin fundamental en teora de conjuntos es la de pertenencia, que se in
dica por el smbolo e . Esto es, x e A significa que x pertenece a A o que el elemento
x es un m iem bro del conjunto A, y puede ser un tom o u otro conjunto, pero A no
puede ser un tom o. Se utiliza x $ A para sealar que x no es un m iem bro de .4.
Existe un conjunto especial que no tiene miembros, y se simboliza con 0 . que se
denom ina conjunto nulo o conjunto vaco. Obsrvese que 0 es un conjunto y no un
tom o, a pesar de no tener miembros. La diferencia radica en que x e 0 es falso
para toda x, m ientras que si y es un tom o, entonces x e y no tiene sentido, porque
ms que una afirm acin falsa, es un error de sintaxis.
Se dice que un conjunto A est incluido (o contenido) en un conjunto B. y se es
cribe A B o B
.4, si todo miembro de A tam bin es m iem bro de B. Tambin se
dice en este caso que A es un subconjunto de B o que B es un supraconjunlo de .4.
Por ejemplo, ll, 2i 11, 2, 3, pero l, 2, 3 no es un subconjunto de i 1, 2 porque 3
pertenece al primero de estos conjuntos, pero no al segundo. Todo conjunto est in
cluido en s mismo, y el conjunto vaco est incluido en todo conjunto. Dos conjun
tos son iguales si cada uno de ellos est incluido en el otro, esto es, si sus miembros
son los mismos. Un conjunto ,4 es un subconjunto propio o un supraconjunlo propio
de otro B. si .4 ^ B y A
o A fj B, respectivamente.
Las operaciones elementales con conjuntos son unin, interseccin y diferencia.
Si .4 y B son conjuntos, entonces A U B. la unin de A y B. es el conjunto de los ele
mentos que son m iem bros de .4, de B o de ambos. La interseccin de A y B. que se
escribe .4 n B. es el conjunto de los elem entos que pertenecen tanto a A como a B.
y la diferencia. A - B. es el conjunto de los elementos de A que no pertenecen a B.
t Algunas veces el trm ino c o n ju n to m ltip le se aplica a un conjunto con repeticiones, es decir, el
conjunto m ltiple : I, 4, I ) tiene (d o s veces) 1 y (una vez) 4 com o m iem bros. U n conjunto m ltiple tam
poco es una lista, por lo que el anterior se pudo haber escrito 4, I, I 1, I, 4
www.FreeLibros.me
IN TR O D U CC IO N A LOS C O N JU N TO S
109
5.
6.
7.
El procedim iento INSERTAR, A), donde A es una variable cuyos valores son
conjuntos y x es un elemento del tipo de los m iem bros de A, hace de x un m iem
bro de A. Esto es, el nuevo valor de A es A U W- Obsrvese que si x ya es miem
bro de A, entonces INSERTAR, A ) no modifica el conjunto A.
8.
9.
10.
11.
IG U ALR, B) es una funcin cuyo valor es verdadero si, y slo si, los conjun
tos A y B contienen los mismos elementos.
12.
www.FreeLibros.me
110
4 .2
Para empezar, se definir un TDA para el modelo m atem tico conjunto con las
tres operaciones bsicas de la teora de conjuntos, unin, interseccin y diferencia.
Prim ero se dar un ejemplo en el que un TDA es til y despus se analizarn varias
realizaciones sencillas del mismo.
Ejemplo 4.1. Se desea escribir un program a que efecte una forma sencilla de an
lisis de flujo de datos sobre diagramas de flujo que representen procedimientos. El
program a usar variables de un tipo de datos abstracto CON JUN TO , cuyas opera
ciones son UNION, INTERSECCION, DIFERENCIA, IGUAL, ASIGNA Y ANU
LA, segn se definieron en la seccin anterior.
En la figura 4.1 se observa un diagrama de flujo cuyas casillas tienen los nom
bres B, ..., Bs y contienen definiciones de dalos (proposiciones de lectura y asigna
cin) num eradas del 1 al 9. Este diagrama de flujo es una aplicacin del algoritmo
de Euclides para calcular el m xim o comn divisor de sus entradas p y q, pero los
detalles del algoritmo no tienen im portancia para el ejemplo.
En general, un anlisis de flujo de dalos se refiere a la parte de un compilador
que examina la representacin de un programa fuente en forma de un diagrama de flu
jo, como la figura 4.1, y rene informacin acerca de lo que puede ser cierto con
forme el control llega a cada casilla del diagrama. A menudo, las casillas reciben el
nom bre de bloques o bloques bsicos y representan grupos de proposiciones a travs
de los cuales el flujo de control procede en form a secuencial. La informacin que se
colecta en el anlisis de flujo de datos sirve para m ejorar el cdigo generado por el
compilador. Por ejemplo, si el anlisis perm iti determ inar que cada vez que el con
trol lleg al bloque B, la variable x tuvo el valor 27, entonces se podra sustituir x
por 27 en el bloque B, a m enos que se hubiera asignado un nuevo valor a x dentro
de ese bloque. Si el acceso a las constantes fuera ms rpido que el acceso a las va
riables, este cam bio hara que el cdigo generado por el compilador se ejecutara a
m ayor velocidad.
En el ejemplo se desea determ inar el lugar donde una variable pudo haber reci
bido, por ltim a vez, un valor nuevo. Esto es, se desea calcular para cada bloque B,
el conjunto DEF-ENT[i] de definiciones de datos d, de modo que exista un camino
de 5 , a B, en el cual aparezca d, pero que no est seguida de otra definicin de la
misma variable que define d. El conjunto DEF-ENT[i] recibe el nom bre de defini
ciones de alcance de B,.
Para ver cmo podra ser til esa informacin, considrese la figura 4.1. El pri
m er bloque B , es un bloque ficticio con tres definiciones de datos que hacen que
las variables /, p y q tomen valores indefinidos. Si, por ejemplo, se descubre que
D E F -E N T \1] incluye la definicin 3, la cual da a q un valor indefinido, entonces el
program a podra tener un error, puesto que aparentem ente podra im prim ir q sin an
tes haberle asignado un valor vlido. Por fortuna, se descubrir que es imposible al
canzar el bloque B-, sin haber hecho una asignacin a q, es decir, 3 no pertenece a
D EF-ENT\1].
Varias reglas ayudan a calcular los DEFJENT[i\. Primero, se hace un clculo pre
www.FreeLibros.me
111
vio, para cada bloque i, de los conjuntos GW[i] y E U M [i]. GEN[i] es el conjunto
de las definiciones de datos del bloque i, con la excepcin de que si B, contiene dos
o ms definiciones de una variable x , entonces slo la ltim a de ellas pertenece a
GEN\i\. As i, GEN[i] es el conjunto de las definiciones de B , que son generadas
por B-, alcanzan el final de B, sin que sus variables sean redefinidas.
GEN - il, 2, 3|
ELIM = |4, 5, 6, 7, 8, 9l
GEN - |4, 5|
ELIM - |2, 3, 7, 8|
GEN - ELIM - 0
y
GEN - lf
E L IM -{ 1 ,9 }
GEN - |7, 8|
ELIM - |2, 3, 4, 5|
GEN - ELIM - 0
GEN - ELIM - 0
GEN - |9l
ELIM - 11, 6}
Fig. 4.1.
www.FreeLibros.me
112
(4.1)
Esto es, la definicin d alcanza el final de B , si, y slo si, d alcanza el principio de
B , y no es elim inada por B, o es generada en B. La segunda regla que relaciona
D E F -E N T y D E F -SA L es que D E F -EN T\i] es la unin, sobre todos los predeceso
res p de B de DEF-SAL[p], es decir:
D E F -EN T[i) -
DEF-SAL[p]
(4.2)
B precede a B t
La regla 4.2 establece que una definicin de datos entra en B, si, y slo si, alcanza
el final de uno de los predecesores de B r Como caso especial, si B, no tiene prede
cesores, como ocurre con fi, en la figura 4.1, entonces D EF-ENT[i] - 0 .
Como ya se han presentado varios conceptos nuevos en este ejemplo, no se pro
fundizar al escribir un algoritm o general para calcular las definiciones de entrada
de un diagram a de flujo arbitrario. En vez de ello, se escribir una parte de un pro
grama que supone que G7V[/] y ELIM[i] se conocen para i - 1,
8, que calcula
D E F -EN T[i) y D EF-SAL[i) para I , ..., 8, en el caso particular del diagrama de flujo
de la figura 4.1. Este fragmento de program a supone la existencia de un TDA CON
JU N T O con las operaciones UN IO N , INTERSECCION, DIFERENCIA, IGUAL,
ASIGNA y ANULA. Ms adelante se darn varias im plantaciones alternativas de
este TDA.
El procedim iento propaga(GEN, ELIM , D E F -E N T , D E F -SA L ) aplica la re
gla 4.1. al clculo de D E F -SA L para un bloque, dado D E F -E N T . En el caso de un
program a sin ciclos, el clculo de D E F -SA L sera directo. La presencia de un ciclo
en este caso exige un procedim iento iterativo. La aproxim acin a D EF-ENT[i] da
comienzo con D E F -EN T[i] - 0 y DEF-SAL[i] - GEN\i] para toda i, y despus apli
ca repetidas veces (4.1) y (4.2) hasta que ya no ocurran ms cambios en los
D E F -E N T y DEF-SAL. Como puede m ostrarse que cada nuevo valor asignado a
los DEF-ENT[i] y DEF-SAL[i] es un supraconjunto (no necesariamente propio) de
su valor anterior, y dado que en cualquier program a hay solamente un nmero fi
nito de definiciones de datos, el proceso debe converger finalmente a una solucin
de (4.1) y (4.2).
www.FreeLibros.me
113
4 .3
www.FreeLibros.me
114
repeat
hay ^ c a m b i o s false;
I las ocho proposiciones siguientes aplican (4.2) al diagrama de la figura
4.1
solamente I
ANULA(D_N7T1]);
ASlGNA(Z)F_Ar712], D E F S A L [ 1]);
ASIGNA(DF_A^713], D E F S A L [2]);
ASIGNA(D-F_A^7T4), DEF-SAL[3]);
UN IO N (D ,/ r_5^L(4], DEF-SAL[S], DEF-ENT\5))\
UNION(DF_S/lZ.[3), D E F S A U S ], DEF_ENT[6])\
ASIGNA(Z)_ATI7], D E F S A L [6]);
ASIGNA(Z)F_A^718], D E F S A L [6]);
for i
1 to 8 do
propaga(GEN[i], E LIM \i), DEF-ENT[i], D E F SA L [i))\
until
not hay-cambios
end.
Fig. 4.2.
paso 1
paso 2
paso 3
paso 4
1
2
3
4
5
6
7
8
0
11,2,3)
14,5}
0
i6,9)
{7,8}
0
0
0
{1,2,3}
11,4,5}
(4,5}
(6,9)
(4,5,6,7,8,9}
(7,8)
(7,8}
0
(1,2,3}
(1,4,5}
(1,4,5}
(4,5,6,7,8,91
(1,4,5,6,7,8,9}
(4,5,6,7,8,9}
14,5,6,7,8,9}
0
(1,2,3}
(1,4,5}
1,4,5}
(4,5,6,7,8,91
(1,4,5,6,7,8,91
11,4,5,6,7,8,9}
11,4,5,6,7,8,9}
Fig. 4.3.
www.FreeLibros.me
115
4 .4
Realizacin de UNION.
Debe ser evidente que tam bin los conjuntos se pueden representar por medio de
listas enlazadas, cuyos elem entos son los m iem bros del conjunto. A diferencia de la
representacin m ediante vectores de bits, la representacin m ediante listas utiliza
un espacio proporcional al tam ao del conjunto representado, y no al del conjunto
universal. Ms an, la representacin m ediante listas es m s general, puesto que pue
de m anejar conjuntos que no necesitan ser subconjuntos de algn conjunto univer
sal finito.
Cuando hay operaciones como INTERSECCION con conjuntos representados
por listas enlazadas, se presentan varias opciones. Si el conjunto universal tiene un
www.FreeLibros.me
116
orden lineal, puede representarse un conjunto por m edio de una lista clasificada.
Esto es, se supone que todos los m iem bros d e un conjunto son comparables por me
dio de una relacin < y los m iem bros de un conjunto aparecen en una lista en el
orden e, e2, ..., e, donde e < e2 < ... < e. La ventaja de una lista clasificada ra
dica en que no es necesario revisarla toda para determ inar si un elem ento se encuen
tra en la lista.
Un elem ento est en la interseccin de las listas L, y L 2 si, y slo si, aparece en
ambas listas. Para determ inar la interseccin con listas no clasificadas, es necesario
parear cada elemento de L, con cada elem ento de L 2 en un proceso de O (n2) pasos
con listas de longitud n. La razn por la cual la clasificacin de listas facilita la in
terseccin y algunas otras operaciones, consiste en que si se desea parear un elemen
to e de una lista L, con los elem entos de otra lista L2, slo es necesario observar los
elem entos de L 2 hasta que se encuentre e o un elem ento m ayor que e, en el prim er
caso, se habr encontrado el par, m ientras que en el segundo, se sabe que no existe.
Es ms, si d es el elem ento de L , que precede inm ediatam ente a e, y ya se ha en
contrado en L 2 el prim er elemento, por ejemplo f tal que d < f para buscar en L 2
una aparicin de e, se puede em pezar con f La conclusin de este razonam iento es
que se pueden encontrar pares para todos los elementos de L u si existen, buscando
en L, y L 2 una sola vez, siempre que se hagan avanzar los m arcadores de posicin
de las dos listas en el orden apropiado, es decir, avanzando siempre el que apunta
al elem ento ms pequeo. La rutina para realizar INTERSECCION se muestra en la
figura 4.5. Ah, lo conjuntos se representan m ediante listas enlazadas de celdas
cuyo tipo se define como
type
tipo_celda = record
elemento: tipo_elemento;
sig: t tipo-celda
end
En la figura 4.5, se supone que tipo_elem cnto es un tipo, por ejemplo un entero,
que se puede com parar mediante < . En caso contrario, es necesario escribir una fun
cin que, dados dos elementos, determ ine cul de ellos precede al otro.
Las listas enlazadas de la figura 4.5 estn encabezadas por celdas vacas que sir
ven como puntos de entrada a las listas. Com o ejercicio, escrbase este programa en
una forma abstracta ms general, usando prim itivas de listas. Sin embargo, el pro
grama de la figura 4.5 puede ser ms eficiente que el programa ms abstracto. Por
ejemplo, en la figura 4.5 se usan apuntadores a celdas particulares, en vez de varia
bles de posicin que apunten a celdas anteriores. Se puede hacer esto porque slo
se agrega al final de la lista C, y las listas A y B slo se revisan sin hacer en ellas in
serciones ni supresiones.
Las operaciones UNION y DIFERENCIA se pueden escribir de modo que se ase
mejen en forma sorprendente al procedimiento INTERSECCION de la figura 4.5.
Para UNION, se deben agregar todos los elem entos de la lista A o de la B, a la lis
ta C en el orden apropiado de clasificacin, de modo que cuando los elementos no
sean iguales (lneas 12-14) se agregue el m enor a la lista C, como se hace cuando los
www.FreeLibros.me
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
117
elementos son iguales. Tam bin se deben agregar a la lista C todos los elementos de
la lista que no se haya agotado cuando la prueba de la lnea (5) falle. Para DIFE
RENCIA, no se agrega un elem ento a la lista C cuando se encuentren elem entos igua
les; slo se agrega el elem ento actual de la lista A a la lista C cuando sea m enor que
el elemento actual de la lista B, porque entonces se sabe que el primero no puede
encontrarse en la lista B. Adems, se aaden a C los elementos de A cuando, y si la
prueba de la lnea (5) falla porque B se agot.
El operador ASIGNA R, B) copia la lista A en la lista B. Obsrvese que este ope
rador no se puede implantar haciendo simplemente que la celda de encabezamiento de
A apunte al mismo lugar que la celda de encabezamiento de B. porque en tal caso cual
quier cam bio posterior en B causara cambios no esperados en A. El operador MIN
www.FreeLibros.me
118
4 .5
Procedimiento de insercin.
El diccionario
www.FreeLibros.me
EL DICCIONARIO
119
actual
ceLnue
Fig. 4.7.
Representacin de la insercin.
www.FreeLibros.me
120
4 .6
Un diccionario puede implantarse m ediante una lista enlazada, clasificada o no. Otra
posible implantacin de un diccionario es mediante un vector de bits, siempre que los
elementos del conjunto en cuestin estn restringidos a los enteros 1, 2,
A para
algn A. o a un conjunto que se pueda hacer corresponder con ese conjunto de
enteros.
Una posible tercera implantacin de diccionarios consiste en usar un arreglo de
longitud fija con un apuntador a la ltim a entrada del arreglo en uso. Esta realiza
cin slo es factible si se puede suponer que los conjuntos nunca sern ms grandes
que la longitud del arreglo. Tiene la ventaja de la sencillez sobre la representacin
con listas enlazadas, m ientras sus desventajas son que I) los conjuntos no pueden
crecer arbitrariam ente, 2) la supresin es ms lenta, y 3) el espacio no se utiliza en
forma eficiente si los conjuntos son de tam ao variable.
A causa de la ltim a razn, no se estudi la realizacin m ediante arreglos en
relacin con conjuntos cuyas uniones e intersecciones se realizan con frecuencia. No
obstante, dado que los arreglos, al igual que las listas, se pueden clasificar, podra
considerarse la realizacin con arreglos que ahora se describe para los diccionarios
como una posible realizacin para conjuntos en general. La figura 4.9 muestra las de
claraciones y procedimientos necesarios para com plem entar la figura 4.8, haciendo
de ella un program a ejecutable.
program atn ( input, o u tp u t);
I base de datos de legisladores (
type
tipo_nom bre = array[1..10] of char;
var
mandato: char;
legislador. tipo_nom bre;
chicos-buenos, chicos-malos: DICCIONARIO;
procedure favorable ( amigo: tipo_nom bre );
begin
INSERTA(am/ 0, chicos-buenos)\
SUPRIME(zm/0, chicos-malos)
end; Ifavorable!
procedure desfavorable ( enemigo: tipo_nom bre );
begin
INSERT A(enemigo, chicos-malos)\
SU PRI ME(enemigo, chicos-buenos)
end; I desfavorable!
procedure consulta ( sujeto: tipo_nom bre );
begin
if MIEMBRO(sujeto, chicos-buenos) then
write!n(sujeto, 'es un amigo)
www.FreeLibros.me
121
const
tam ao-m x - j algn nm ero adecuado I;
type
DICCIONARIO - record
lt: integer;
datos: array[ 1..tam ao-m x] of tipo_nom bre
end;
procedure ANULA ( var A: DICCIONARIO );
begin
A.lt := 0
end; {ANULA t
function MIEMBRO ( x: tipo_nom bre; var A: DICCIONARIO ) : boolean;
var
i: integer;
begin
for i := 1 to A.lt do
if A.datos[i] = x then return (true);
return (false) { si no se encuentra x I
end; | M IE M B R O }
www.FreeLibros.me
122
4 .7
www.FreeLibros.me
123
cada operacin, un tiem po proporcional al tam ao del conjunto, como sucede con
las realizaciones m ediante arreglos y listas. Sin embargo, con un diseo cuidadoso
es posible hacer que sea arbitrariam ente pequea la probabilidad de que la disper
sin dem ande ms de un tiem po constante para cada operacin.
Se considerarn dos form as de dispersin algo diferentes. La primera, llamada
dispersin abierta o externa, permite que el conjunto se almacene en un espacio po
tencialmente ilimitado, por lo que no im pone un lm ite al tam ao del conjunto. La
segunda, llamada dispersin cerrada o interna, usa un espacio fijo para el almace
namiento, por lo que lim ita el tam ao de los conjuntos t-
Dispersin abierta
En la figura 4.10 se puede ver la estructura de datos bsica para la dispersin
abierta. La idea fundamental es que el conjunto (posiblemente infinito) de m iem
bros potenciales se divide en un nm ero finito de clases. Si se desea tener B clases,
numeradas de 0 a 5 -1 , se usa una funcin de dispersin h tal que para cada ob
jeto x del tipo de datos de los m iem bros del conjunto que se va a representar, h{x)
sea uno de los enteros de 0 a B - 1. Lgicamente, el valor de h(x) es la clase a la cual
x pertenece. A m enudo se da a x el nom bre de clave y a h(x) el de valor de dis
persin de x. A las clases se les da el nom bre de cubetas y se dice que x pertenece
a la cubeta h(x).
En un arreglo llamado tabla de cubetas, indizado por los nmeros de cubeta 0,
1,..., B - 1, se tienen los encabezam ientos de B listas. Los elem entos de la z-sima lista
son los miembros del conjunto que se est representando y que pertenecen a la clase
i, esto es, aquellos elementos x del conjunto tales que h(x) = i.
Se espera que las cubetas tengan casi el mismo tam ao, de m odo que la lista para
lista de elem entos en
cada cubeta
encabezam ientos de la
tabla de cubetas
Fig. 4.10.
t Es posible hacer cam bios en la estruciura de dalos para acelerar la dispersin abierta y permitir
que la cerrada m aneje conjuntos ms grandes. Estas tcnicas se describirn despus de estudiar los m to
dos bsicos.
www.FreeLibros.me
124
cada cubeta sea corta. Entonces, si hay N elem entos en el conjunto, en promedio,
cada cubeta tendr N /B miembros. Si se puede estim ar N y elegir B aproxim ada
mente igual de grande, entonces una cubeta tendr en prom edio slo uno o dos
miembros, y las operaciones con el diccionario tendrn, en prom edio, un nmero
pequeo y constante de pasos, independiente del valor que tenga N (o, en forma equi
valente, B).
No siempre est clara la posibilidad de elegir h de m odo que un conjunto tpico
tenga sus m iem bros distribuidos de form a relativam ente uniform e entre las cubetas.
Ms adelante se estudiar otra vez la forma de elegir h de modo que, en verdad,
disperse su argumento, es decir, para que h(x) sea un valor aleatorio que no
dependa de x de ninguna forma trivial.
www.FreeLibros.me
125
const
B - i constante adecuada i
type
tipo_celda - record
elemento-. tipo_nombre;
sig. t tipo_celda
end;
DICCIONARIO array[0..5-1] of t tipo_celda;
procedure ANULA ( var A: DICCIONARIO );
var
i: integer;
begin
for i : 0 to B - 1 do
A[i) := nil
end; | A N U L A }
function MIEMBRO ( x : tipo_nom bre; var A: DICCIO NARIO ) : boolean;
var
actual'. tipo_celda;
begin
actual := A[h{x)]\
i actual es inicialm ente el encabezado de la cubeta para x 1
while actual < > nil do
if actual].elemento - a then
return (true)
else
a c tu a la c tu a l].sig -,
return (false) | si no se encuentra x }
end; MIEMBRO (
procedure INSERTA ( jc tipo.nom bre; var A: DICCIONARIO );
var
cubeta: integer;
encab-ant: ] tipo_celda;
begin
if not M IEM BRO S, A) then begin
cubeta
h(x)\
encab-ant
A[cubeta] ;
new(A[(ubeta])-,
A[cubeta]].elemento x;
A [ c u b e ta \].s ig e n c a b -a n t
end
end; | IN SE R T A )
procedure SUPRIM E ( x: tipo.nom bre; var A: DICCIO NARIO );
var
www.FreeLibros.me
126
actual, t tipo_celda;
cubeta: integer;
begin
cubeta: - h(x)\
if A [cubeta\ < > nil then begin
if A[cubeta) *.elemento = x then I x est en la prim era celda |
A[cubel\ := A[cubet\\.sig I suprim e x de la lista I
else begin | x , si est, no ocupa la primera celda de la cubeta )
actual := A[cubeta]\ I actual apunta a la celda anterior
while actual].sig < > nil do
if actual] .sig] .elemento = x then begin
actual].sig := actual].sig*.sig
I suprim e x de la lista 1
return j salida del ciclo !
end
else lan no se encuentra x\
a c tu a la c tu a l] .s ig
end
end
end; I SUPRIM E \
Fig. 4.12.
Dispersin cerrada
U na tabla de dispersin cerrada guarda los m iem bros del diccionario en la tabla de
cubetas, en vez de usar esa tabla para alm acenar encabezam ientos de listas. En conse
cuencia, parece que slo es posible colocar un elem ento en una cubeta; sin embargo,
la dispersin cerrada tiene asociada una estrategia de redispersin. Si se intenta co
locar x en la cubeta h(x) y esta ya tiene un elem ento situacin denom inada coli
sin, la estrategia de redispersin elige una sucesin de localidades alternas /i,(x),
hx), ... dentro de la tabla de cubetas, en la cual es posible colocar x. Se prueba en
todas esas localidades, en orden, hasta encontrar una vaca. Si ninguna est vacia,
la tabla est llena y no es posible insertar x.
Ejemplo 4.3. Supngase que B = 8 y que las claves a. b. c y d tienen valores de dis
persin h(a) = 3, h{b) = 0, h(c) - 4, h{d) - 3. Se usar la estrategia de redisper
sin ms sencilla, denom inada dispersin lineal, en la que h,(x) = (h(x) + i)
mod B. As, por ejemplo, si se deseara insertar a y se encontrara que la cubeta 3 ya
est llena, se probara con las cubetas 4, 5, 6, 7, 0, 1 y 2, en ese orden.
En principio, se supone que la tabla est vaca, esto es, que cada cubeta guarda
un valor especial vacio, que no es igual a ningn valor que podra intentarse inser
tar f. Si se insertan a, b, c y d, en ese orden, en una tabla inicialmente vaca, resulta
t Si el tipo de los m iem bros del diccionario no sugiere un valor adecuado para vaco, se puede hacer
que cada cubeta tenga un cam po adicional de un bit que inform e si est vacia o no.
www.FreeLibros.me
LA ESTRUCTURA
127
3
4
5
6
7
Fig. 4.13.
Sin embargo, obsrvese que si se perm iten las supresiones, nunca puede existir
la seguridad, si se alcanza una cubeta vaca sin encontrar x, de que x no se encuen
tra en alguna otra parte, y la cubeta ahora vaca estaba ocupada cuando se insert
x. Cuando deban hacerse supresiones, el enfoque ms efectivo para resolver este pro
blema es colocar una constante llamada suprimido en una cubeta que contenga un
elemento que se desee suprimir. Es im portante que haya una diferencia entre supri
mido y vacio, la constante que se encuentra en todas las cubetas que nunca se han
llenado. De esta m anera, es posible perm itir supresiones sin tener que buscar en la
tabla completa durante la prueba MIEMBRO. En el m om ento de la insercin, es po
sible tratar suprimido como un espacio disponible, de m odo que con suerte el espa
cio de un elemento suprim ido puede volver a utilizarse. Sin embargo, como el es
pacio de un elemento suprim ido no es reclamable de inmediato, cosa que s ocurre
en la dispersin abierta, puede preferirse el esquema abierto al cerrado.
Ejemplo 4.4. Supngase que se desea probar si e est en el conjunto representado
en la figura 4.13. Si h(e) - 4, se prueba con las cubetas 4, 5 y luego 6. La cubeta 6
est vaca y como e no se ha encontrado, la conclusin es que no est en el conjunto.
Si se suprime c, es necesario colocar la constante suprim ido en la cubeta 4. As,
www.FreeLibros.me
128
vacio - *
i 10 espacios !
suprimido - '*********; | io asteriscos f
type
i: integer;
begin
for i
0 to B - 1 do
A[\
vacio
end; I ANULAl
function localiza ( x: tipo_nom bre ) : integer;
inicial, i: integer;
inicial guarda A(x); i cuenta el nm ero de cubetas examinadas
hasta el momento cuando se busca x !
begin
inicial := h(x)\
i
0;
while (/ < B ) and (A[(inicial + i) mod B] < > x) and
(A[(inicial + i) mod B) < > vaci) do
i
/ + 1;
return ((inicial + i) mod B)
end; ! localiza I
www.FreeLibros.me
129
I como localiza, pero tam bin se detiene en una entrada con suprimido
y devuelve ese valor |
function MIEMBRO ( x. tipo_nom bre; var A: DICCIONARIO ) : boolean;
begin
if A[localiza(x)] - x then
return (true)
else
return (false)
end; I MIEMBRO I
procedure INSERTA ( x tipo_nombre; var A: DICCIONARIO );
var
cubeta; integer;
begin
if A[localiza(x)] = x then
return; I x ya est en A
cubeta
localiza l(x);
A[cubeta\
else
jINSERTA 1
cubeta; integer;
begin
cubeta
locahza(x)\
if A[cubeta] - x then
Afcubeta]
suprimido
end; | SUPRIM E
Fig. 4.14.
4 .8
www.FreeLibros.me
130
en una constante para cada operacin. Por tanto, el tiem po prom edio para insertar,
suprim ir y probar la pertenencia de un elemento al conjunto, suponiendo que un ele
m ento cualquiera tiene la misma probabilidad de ser dispersado en cualquier cu
beta, es una constante que no depende de N.
Supngase que se tiene un program a escrito en algn lenguaje como Pascal y se
desea insertar todos los identificadores que aparecen en el programa en una tabla
de dispersin. Cada vez que se encuentra la declaracin de un nuevo identificador, ste se inserta en la tabla de dispersin despus de verificar que ya no se
encuentra ah. D urante esta fase, es razonable suponer que un identificador tiene la
misma probabilidad de ser dispersado en cualquier cubeta. Por tanto, se puede
construir una tabla de dispersin de N elem entos en tiem po 0 (N (l + N/B)). Al
elegir B igual a N, este tiem po es 0(N).
En la siguiente fase, los identificadores se hallan en el cuerpo del programa; es
necesario localizarlos en la tabla de dispersin para recuperar informacin aso
ciada con ellos. Pero, cul es el tiem po estim ado para localizar un identificador?
Si el elem ento que se busca tiene la misma probabilidad que cualquiera de los ele
mentos de la tabla, entonces el tiem po estim ado para buscarlo es simplemente el
tiempo prom edio que dem anda la insercin de un elemento. Para com prender esto,
obsrvese que el tiem po que dem anda buscar una vez cada elemento en la tabla es
el empleado en insertarlo, suponiendo que los elementos siempre se agregan al final
de la lista de la cubeta apropiada. Entonces, el tiem po estim ado para una bsqueda
es tam bin 0 ( 1 + N/B).
El anlisis anterior supone que una funcin de dispersin distribuye los ele
mentos de m anera uniform e en las cubetas. Existen funciones de esta clase? Una
funcin como la de la figura 4.11 (que convierte caracteres en enteros, suma y toma
el residuo m dulo B) puede considerarse una funcin tpica de dispersin. El si
guiente ejemplo exam ina su funcionamiento.
Ejemplo 4.5. Supngase que se emplea la funcin de la figura 4.11 para dispersar
100 claves que consisten en las cadenas de caracteres A0, A l, ..., A99, en una tabla
de 100 cubetas. Si se establece que ord(0), ord( 1)
ord(9) forman una progresin
aritm tica, como ocurre con los cdigos de caracteres ms comunes ASCII y EBC
DIC, es fcil verificar que las claves se dispersan hasta en 29 de las 100 cubetas f
y que la cubeta ms grande contiene A 18, A27, A36......A90, es decir, 9 de los 100
elementos. Si se calcula el nm ero prom edio de pasos para una insercin, partiendo
del hecho de que la insercin del i-simo elemento en una cubeta requiere i+1 pa
sos, se obtienen 395 pasos para las 100 claves. En comparacin, el estimado
iV( 1+N/B) sugiere 200 pasos.
La funcin de dispersin sencilla de la figura 4.11 puede tratar ciertos con
juntos de entradas, como las cadenas consecutivas del ejemplo 4.5, de m anera no
aleatoria. Hay funciones de dispersin ms aleatorias; como ejemplo, puede
usarse la idea de elevar al cuadrado y tom ar los dgitos medios. As, si se tiene como
t O bsrvese que A2 y A 20 no necesariam ente se dispersan en la m ism a cubeta, pero, por ejem plo, A23
y A41 deben hacerlo.
www.FreeLibros.me
131
Para usar la estrategia de elevar al cuadrado y tom ar el medio cuando las cla
ves son cadenas de caracteres, prim ero se agrupan los caracteres en la cadena de de
recha a izquierda, en bloques de un nm ero fijo de caracteres, como 4, rellenando
a la izquierda con espacios si es necesario. Se trata cada bloque como un solo entero
formado al concatenar los cdigos binarios de los caracteres. Por ejemplo, ASCII ma
neja un cdigo de caracteres de 7 bits, de modo que los caracteres pueden consideraise como dgitos de base 27 128. De este modo, se puede considerar la cadena
de caracteres abcd como el entero (128)3a + (128)2 b + (128)c + d. Despus de con
vertir todos los bloques a enteros, se sum a t y se procede como se sugiri con ante
rioridad para los enteros.
www.FreeLibros.me
132
llenas que si los elem entos llenaran las cubetas al azar. Ms an, las sucesiones de
bloques llenos causan largas secuencias de intentos antes de que un elem ento en
cuentre una cubeta vaca, de m odo que tener grupos de cubetas llenas extraordina
riam ente grandes hace ms lentas la insercin y otras operaciones.
Podra desearse saber cuntos intentos (o sondeos) se necesitan en prom edio para
insertar un elem ento cuando N de las B cubetas estn llenas, al suponer que todas
las posibles combinaciones de N de las B cubetas tienen la misma probabilidad de
estar llenas. Por lo general se presume, aunque no se demuestre, que ninguna estra
tegia de dispersin cerrada puede tener un rendim iento tem poral medio mejor
que sa para operaciones con diccionarios. Se derivar entonces una frmula para
el costo de insercin cuando las localidades alternas em pleadas por la estrategia de
redispersin se elijan al azar. Por ltimo, se considerarn algunas estrategias de
redispersin, que se aproxim an a ese com portam iento aleatorio.
La probabilidad de una colisin en el sondeo inicial es N /B. Suponiendo una
colisin, la prim era redispersin intentar con una de B - 1 cubetas, de las cua
les jV - 1 estarn llenas, de m anera que ia probabilidad de al menos dos coiiM N -l)
siones es ------------ . De m odo similar, la probabilidad de al menos i colisiones es
B ( B - 1)
N ( N - 1 ) - (N - i + \)
B(B - 1) (fi - i + 1)
Si B y N son grandes, esta probabilidad se aproxim a a (N /B )'. El nm ero promedio
de sondeos es uno (para insercin exitosa) ms la sum a con todos los / > 1 de la pro
babilidad de al m enos i colisiones, esto es, alrededor de 1 +
(A/B )\ o
i-!
D
.Se puede dem ostrar que el valor exacto de la sum atoria, cuando la frmula
f + 1
/
www.FreeLibros.me
133
Fig. 4.15.
www.FreeLibros.me
134
uno. Esto es, sea h,(x) = (h(x) + ci) mod B para algn c > 1. Por ejemplo, si B - 8,
c = 3 y h(x) - 4, se sondearan las cubetas 4, 7, 2, 5, 0, 3, 6 y 1, en ese orden. Por
supuesto, si c y B tienen un factor comn m ayor que uno, esta estrategia no permite
siquiera buscar en todas las cubetas; como ejemplo, prubese con B - 8 y c - 2. Pero
todava ms significativo es el hecho de que, aun si c y B son primos relativos (no
tienen factores comunes), se tiene el m ismo problem a de am ontonam iento que
con la dispersin lineal, aunque aqu tienden a aparecer las secuencias de cube
tas llenas, separadas por una distancia c. Este fenmeno hace ms lentas las opera
ciones, como en la dispersin lineal, puesto que un intento de insercin en una cu
beta llena originar un desplazam iento en una cadena de cubetas llenas separadas
por la distancia c, y la longitud de esa cadena se increm entar en uno.
En realidad, cualquier estrategia de redispersin en la que el blanco de un son
deo slo dependa del blanco del sondeo anterior (en lugar de depender del nmero
de sondeos no exitosos ya realizados, la cubeta original h(n), o el valor x de la clave
misma) exhibir la propiedad de am ontonam iento de la dispersin lineal. Quiz
la estrategia ms simple en la que no se presenta este problem a sea hacer que h,(x) = (h{x) + d) mod B, donde d u d2, .... dB_,, es una perm utacin aleatoria de los en
teros 1, 2 ,..., B - 1. Desde luego, en todas las inserciones, supresiones y pruebas de
pertenencia se usa la misma sucesin d u ..., /fl_ l a disposicin aleatoria de los
enteros se decide una sola vez, al disear el algoritmo de redispersin.
La generacin de nm eros aleatorios es un asunto complejo, pero por fortuna
m uchos m todos comunes producen una sucesin de ellos que van de 1 a cierto l
mite. Estos generadores de nm eros aleatorios, cuando se reajustan sus valores ini
ciales para cada operacin con la tabla de dispersin, sirven para generar la su
cesin deseada d {, ..., dB_v
Un enfoque efectivo utiliza sucesiones de registros de desplazamiento. Sea B una
potencia de 2, y k una constante entre 1 y B - 1. Empiezan con algn nm ero d en
el intervalo de 1 a B - 1, generan los nm eros siguientes de la sucesin tom ando el
valor anterior, lo doblan y, si el resultado es m ayor que B, le sustraen B y tom an la
sum a mdulo 2 bit a bit del resultado y la constante seleccionada k. La suma mdu
lo 2 bit a bit de x e y, que se escribe x y , se calcula escribiendo x e y e n binario,
con ceros a la izquierda si hace falta, para que am bos sean de la misma longitud, y
form ando los nm eros cuya representacin binaria tenga un 1 en las posiciones en
que x o y, pero no ambos, tam bin lo tengan.
Ejemplo 4.7.
11001
01101
2 5 13 =
10100
Obsrvese que esta suma se puede considerar como una sum a binaria ordinaria
en la que se ignora el residuo.
No todo valor de k produce una perm utacin de 1, 2, ..., 5 - 1 ; algunas veces,
un nm ero se repite antes de generarlos todos. Sin embargo, para una B dada, existe
www.FreeLibros.me
135
una probabilidad pequea, pero finita, de que algn valor particular de k funcione,
y slo hace falta encontrar una k para cada B.
Sea B - 8. Si se toma k - 3, ser fcil generar todos los enteros del
1 al 7. Por ejemplo, si se comienza con d x - 5, se calcula luego d2. doblando primero
4 para obtener 10. Como 10 > 8, se resta 8 para obtener 2 y luego se calcula
d2 - 2 3 - 1. Obsrvese que x 3 se puede calcular al tom ar el com plem ento de
los dos ltimos bits de x.
Es bueno observar las representaciones binarias en 3 bits de d, d2, ..., 4 que se
muestran en la figura 4.16, ju n to con su mtodo de clculo. Obsrvese que la mul
tiplicacin por 2, en binario corresponde a un desplazam iento hacia la izquierda.
De ah se obtiene una indicacin acerca del origen del trm ino sucesin de regis
tros de desplazamiento.
Se deber verificar que tam bin se genera una permutacin de 1 ,2 , ..., 7 si se
elige k - 5, pero que otros valores de k fracasan.
Ejemplo 4.8.
desplazamiento
supresin del prim er 1
3
desplazamiento
desplazamiento
desplazamiento
supresin del prim er 1
3
desplazam iento
desplazam iento
supresin del prim er 1
3
Fig. 4.16.
101
1010
010
4-001
4-010
4 - oo
1000
000
4-011
4-110
1100
100
4 -iu
www.FreeLibros.me
136
4 .9
donde tipo_dom inio y tipo-contradom inio son cualesquiera tipos que tengan los ele
mentos del dom inio y contradom inio de la correspondencia. La declaracin de
CORRESPONDENCIA queda como
type
www.FreeLibros.me
COLAS DE PRIORIDAD
4 .1 0
137
Colas de prioridad
a c t u a l a c t u a l f. sig-,
en este punto, d no se encontr en la lista i
actual -.= A[cubet[, ( usa actual para alm acenar la prim era celda |
new{A[cubet])\
A [cubeta] t. elem ento-dom inio :*= d\
Afcubeta] t. contradominio > r ;
A[cubeta] f. sig
actual
end; i ASIGNA !
Fig. 4.17.
Ejemplo 4.9. El trm ino cola de prioridad proviene de la siguiente forma de usar
este TDA. La palabra cola sugiere la espera de cierto servicio por ciertas personas
u objetos, y la palabra prioridad sugiere que ese servicio no se proporciona por
medio de la disciplina prim ero en llegar, prim ero en ser atendido, que es la base
del TDA COLA, sino que cada persona tiene una prioridad basada en la urgencia
de su necesidad. Un ejemplo es la sala de espera de un hospital, donde los pacientes
www.FreeLibros.me
138
con problemas potencialmente m ortales sern atendidos antes que los dems, sin im
portar el tiem po de espera.
Como ejemplo ms corriente del uso de las colas de prioridad, un sistema de cm
puto de tiem po com partido necesita m antener un conjunto de procesos que esperan
servicio. En general, los diseadores de estos sistemas desean hacer que los procesos
cortos parezcan instantneos (en la prctica, una respuesta en uno o dos segundos
parece instantnea), de modo que a estos procesos se les da prioridad sobre los que
ya tienen un consum o sustancial de tiempo. Un proceso que requiera varios segun
dos de tiem po de cm puto no puede ser instantneo, por lo que es razonable la es
trategia de diferir estos procesos hasta que todos los que tienen posibilidades de pa
recer instantneos hayan sido atendidos. Sin embargo, si no se tiene cuidado, los pro
cesos que ya hayan tom ado un tiem po mucho m ayor que el promedio, quiz no vuel
van a obtener una porcin de tiem po y queden esperando para siempre.
U na posible m anera de favorecer los procesos cortos sin bloquear los largos, con
siste en dar a un proceso P la prioridad 100tcon,(P) - t,mc(P). El parm etro fcon, es el
tiem po consum ido hasta el m om ento por el proceso, y tmk es el momento en que se
inici el proceso, m edido a partir de cierto instante cero. Obsrvese que, en ge
neral, las prioridades sern enteros negativos grandes, a m enos que se elija medir
tinic a partir de un instante en el futuro. Obsrvese tam bin que 100 en la frmula
anterior es un nm ero mgico; se selecciona de forma que sea algo m ayor que el
m ayor nm ero de procesos que puedan estar activos a la vez. As, si siempre se es
coge el proceso con el nm ero de prioridad ms bajo y no hay demasiados procesos
cortos, a la larga, un proceso que no term ine rpido recibir el 1% del tiempo de pro
cesador. Si esto es mucho o muy poco, otra constante puede reem plazar el 100 de
la frmula de la prioridad.
Los procesos se representan m ediante registros con un identificador de proceso
y un nm ero de prioridad. Esto es, se define
type
tipo-proceso - record
id: integer;
prioridad: integer
end;
www.FreeLibros.me
139
se llama al procedim iento inicial, el cual coloca un registro para ese proceso en ES
PERA. El procedim iento selecciona es llamado cuando el sistema dispone de una
porcin de tiempo asignable a algn proceso. El registro del proceso que resulte se
leccionado se elim ina de ESPERA, pero selecciona lo retiene para reingresarlo en la
cola con una nueva prioridad, que es la anterior increm entada en 100 veces la can
tidad de tiempo utilizada.
Se emplea la funcin tiem po-actual, que devuelve el tiem po actual en cuales
quiera unidades que el sistem a use, como microsegundos, y el procedim iento ejecu
ta (P) que hace que el proceso con identificador P se ejecute durante una porcin
de tiempo. La figura 4.18 m uestra los procedim ientos inicial y selecciona.
procedure inicial ( P. integer );
| inicial coloca un proceso con identificador P en la cola i
var
proceso: tipo_proceso;
begin
proceso, i d P ,
p ro c e so .p rio rid a d -tiem p o -a ctu a l,
INSERTA (proceso, ESPERA)
end; inicial I
procedure selecciona-,
I selecciona asigna una porcin de tiem po al proceso de m ayor prioridad
var
tiempo-inicio, tiempo-fin: integer;
proceso: tipo_proceso;
begin
proceso :- t SUPRIM E_M IN(ESPERA)
I SUPRIM E_M IN devuelve un apuntador al elem ento elim inado
tiem po-inicio := tiempo-actual-,
ejecuta(proceso. id)\
tiem po-fin := tiempo-actual:
proceso, prioridad := proceso, prioridad + 100* (tiem po-fin tiem po-inicio);
ajusta la prioridad para incorporar la cantidad de tiem po usado
INSERTA (proceso, ESPERA)
i devuelve el proceso seleccionado a la cola con la nueva prioridad
end; j selecciona (
Fig. 4.18.
4 .1 1
|
I
www.FreeLibros.me
140
www.FreeLibros.me
141
est en una hoja o en una posicin cuya prioridad no sea m ayor que la de cualquiera
de sus hijos.
En la figura 4.2l(a) se debe intercam biar la raz con su hijo de m enor prioridad,
el cual tiene prioridad 5. El resultado de este intercam bio se m uestra en la figura
4.2 l(b). El elem ento que se est desplazando hacia abajo es todava m ayor que sus
hijos, los cuales tienen prioridades 6 y 8. Al intercam biarlo con el m enor de los dos,
6, se logra el rbol de la figura 4.21 (c). Este rbol tiene ya la propiedad de ser par
cialmente ordenado.
En esta filtracin, si un nodo v tiene un elem ento con prioridad a y sus hijos tie
nen prioridades b y c, y si al m enos b o c son menores que a, el intercam bio de a
con el m enor de b y c logra que v tenga un elem ento cuya prioridad sea m enor que
la de cualquiera de sus hijos. Para dem ostrar esto, supngase que b < c. Despus
del intercambio, el nodo v adquiere la prioridad b, y sus hijos, las prioridades a y c.
Se supuso que 6 < c y se dijo que a es m ayor que b o c. Por tanto, es seguro que se
cumplir que b < a. As, el proceso de insercin esbozado con anterioridad filtrar
un elemento hacia abajo en el rbol hasta que no haya ms violaciones de la pro
piedad de orden parcial.
type
tipo_celda - record
elemento: tipo_proceso;
siguiente, t tipo.celda
end;
COLA_CON_PRIORIDAD = f tipo.celda;
I la celda apuntada es un encabezado de lista }
function SU PR IM E.M IN ( var A: COLA_CON_PRIORIDAD ) : ] tipo_celda;
var
else begin
m e n o r -p r io r id a d p (A f .siguiente].elemento)-,
i p devuelve la prioridad del prim er elemento. Obsrvese que
A apunta a una celda de encabezado que no contiene un
elem ento |
p reg a n a d o rA \
a c t u a l A ] .siguiente,
while actual] .siguiente < > nil do begin
com para las prioridades del ganador actual con las del elemento
siguiente |
www.FreeLibros.me
142
/ \ 18
10
Fig. 4.20.
10
www.FreeLibros.me
143
Se podra dem ostrar que los pasos anteriores dan como resultado un rbol par
cialmente ordenado. No se intentar una demostracin rigurosa de este hecho, pero
s se observar que un elem ento con prioridad a puede llegar a ser el padre de un
elemento con prioridad b de tres m aneras. (En el razonam iento siguiente se identi
ficar un elemento con su prioridad.)
1.
2.
3.
6
10
9
8
10
18
10
10
18
(b)
9
10
18
(c)
Fig. 4.21.
www.FreeLibros.me
10
144
/ \8
/I l\
10
18 9
/ \10
/ \4
/ \ \
10
(a)
18 9
/ \10
/\5
A l\
10
(b)
Fig. 4.22.
18 9
/\10
(c)
Insercin de un elemento.
COLA_DE_PRIORIDAD - record
contenido-. array[l../am_m<x] of tipo-proceso;
lt: integer
end;
www.FreeLibros.me
145
A . lt0
end; | ANULA \
procedure INSERTA ( x: tipo_proceso; var A: COLA_DE_PRIORIDAD );
var
i: integer;
temp: tipo_proceso;
begin
if A.lt > - longmx then
A . lt:- A.lt + 1;
A .c o n te n id o [A . lt]x \
i A . l t , | / es el ndice de la posicin actual de x
while (/ > 1) and (p(A.contenido{\) < p(A.contenido[i div 2])) do
begin |sube x en el rbol y lo intercam bia con su padre
de m ayor prioridad. Recurdese que p calcula
la prioridad de un elem ento de tipo_proceso |
te m p A .c o n te n id o [ ] \
A.contenido[/]:- A.contenido[i div 2);
A.contenido[i div 2 ] temp:
i i div 2
end
end
end; ) INSERTA |
i.
j: integer;
temp: tipo.proceso;
m nim o: tipo_proceso;
begin
if A.lt - 0 then
neM.minimo)',
m nim ot A.contenido[ 1);
I debe devolverse un apuntador a una copia de la raz de A
A.contenido[ 1] ;= A.contenido[A.ll]\
A . l t A . l t - I;
! mueve el ltim o elemento, hacia el principio (
i :- 1; | / es la posicin actual del que antes era
el ltimo elem ento 1
www.FreeLibros.me
146
j
2*/ + 1;
\ j ser el hijo de i que tiene la m enor prioridad o bien,
si 2*/ - A.lt, j ser el nico hijo de i I
if p(A. conten ido[i]) > p{A.contenido\j]) then begin
I intercam bia el anterior ltim o elem ento con el hijo
de m enor prioridad |
te m p A .c o n te n id o [i]\
A.contenido[i] A.contenido[f]\
A.contenido I/) temp.
i :-j
end
else
return (m nim o) I no puede meterlo ms I
end;
return (m nim o) | se meti hasta llegar a una hoja I
end
end; I S U P R IM E _ M IN |
Fig. 4.23.
4 .1 2
www.FreeLibros.me
Alan
Alejandro
Alicia
Amanda
Andrs
Anglica
CS101
CS202
147
CS 303
X
X
X
X
X
X
X
Inscripcin
Fig. 4.24.
De vez en cuando, el responsable de los cursos puede desear insertar o elim inar
estudiantes de los cursos, determ inar cules estudiantes estn tom ando un curso
dado, o saber qu cursos est tom ando un estudiante dado. La estructura de datos
ms simple con la que es posible responder estas preguntas es obvia; basta usar el
arreglo bidim ensional sugerido por la figura 4.24, donde el valor 1 (o verdadero)
reemplaza las X y el valor 0 (o falso) reemplaza los espacios.
Por ejemplo, para insertar un estudiante en un curso se necesita una correspon
dencia, CE, tal vez aplicada m ediante una tabla de dispersin, que traduzca nom
bres de estudiante a ndices del arreglo y otra, CC, que traduzca nom bres de curso a
ndices del arreglo. Entonces, para insertar al estudiante e en el curso c. simplemente
se asigna
Inscripcin[CE(e), CC(c)\
1.
Las supresiones se realizan haciendo que este elem ento tome el valor 0. Para hallar
los cursos que tom a un estudiante de nom bre e, se recorre la fila CE(e) y, de mane
ra similar, se recorre la colum na CC(c) para hallar los estudiantes que estn en el
curso c.
Por qu sera deseable buscar una estructura de datos m s apropiada? Consid
rese una universidad grande con, tal vez, 1000 cursos y 20 000 estudiantes, que to
man en prom edio tres cursos cada uno. El arreglo sugerido por la figura 4.24 tendra
20 000 000 de elementos, de los cuales 60 000, o el 0.3 %, tendran el valor 1 f- Un
arreglo as, que recibe el nombre de dispersa, para indicar que casi todos sus elementos
valen cero, se puede representar en m ucho menos espacio con slo listar las entra
das que no son nulas. Ms an, se puede gastar mucho tiem po revisando una co
lumna de 20 000 entradas en busca de, en promedio, 60 que no son nulos y las re
visiones de filas pueden llevar tam bin mucho tiempo.
U na forma de m ejorar esto, consiste en plantear el problem a como si se tratara
del m antenim iento de una coleccin de conjuntos. Dos de esos conjuntos son E y
C, los conjuntos de todos los estudiantes y todos los cursos. Cada elem ento de E es
en realidad un registro de un tipo como
t S i sta fuera una base d e d atos real, el arreglo s e guardarla en a lm acenam iento secu ndario. Sin e m
bargo, esta estructura de datos malgastara m ucho espacio.
www.FreeLibros.me
148
ty p e
tipo_estudiante - record
ident: integer;
nombre, array [1..30] of char;
end
y habr que inventar un tipo de regisjro parecido para los cursos. Para obtener la es
tructura pensada, se necesita un tercer conjunto, I, cuyos elementos representen las
inscripciones. Cada uno de los elem entos de I representar una de las celdas del
arreglo de la figura 4.24 que contenga una X. Los elem entos de I seran registros de
un tipo fijo. Hasta este punto no se sabe qu cam pos van en esos registros f, pero
pronto se sabr de ellos. Por el m omento, basta postular que hay un registro de ins
cripcin por cada entrada m arcada con X en la m atriz y que los registros de inscrip
cin son distinguibles unos de otros de alguna manera.
Tam bin se requieren conjuntos que representen respuestas a las preguntas cru
ciales: dado un estudiante o un curso, cules son los cursos o estudiantes, segn el
caso, asociados? Sera interesante tener, para cada estudiante e, un conjunto C, de
todos los cursos que e estuviera tom ando y, por otro lado, un conjunto Ec de todos
los estudiantes que siguen el curso c. Tales conjuntos seran difciles de obtener, por
que no habra lmite para el nm ero de conjuntos en los que podra estar cualquier
elemento, lo cual dara lugar a complicados registros de estudiantes y cursos. En cam
bio, s se podra hacer que Ec y Ce fueran conjuntos de apuntadores, en vez de re
gistros, pero existe un mtodo que permite un ahorro significativo de espacio y ofre
ce respuestas igual de rpidas a las preguntas sobre estudiantes y cursos.
Sea cada conjunto Ce el conjunto de registros de inscripcin correspondientes al
estudiante e y algn curso c. Es decir, si se considera una inscripcin como un par
(e, c), entonces
Ce = | ( -,
c)
www.FreeLibros.me
149
guir una lista en particular sin que haya confusin con respecto a cul de los dife
rentes apuntadores de una celda en particular se debe seguir.
Para el caso en cuestin, es posible colocar un cam po apuntador en cada registro
de estudiante y curso que apunte al prim er registro de inscripcin en Ce o E c, res
pectivamente. Cada registro de inscripcin necesita dos campos apuntadores: uno
que se llamar c s i g , para apuntar a la siguiente inscripcin en la lista que repre
senta al conjunto C al cual pertenece el registro, y otro, e~sig, para apuntar al si
guiente elemento del conjunto E c al que pertenece.
Resulta que un registro de inscripcin no indica en forma explcita el estudiante
ni el curso que representa. Esa informacin est implcita en las listas en las cuales
aparece el registro de inscripcin. Llmese propietarios del registro de inscripcin a
los registros de estudiante y de curso que encabezan estas listas. Entonces, para po
der decir qu cursos toma el estudiante e, es preciso exam inar los registros de ins
cripcin de C, y hallar para cada uno su registro de curso propietario. Esto podra
hacerse colocando un apuntador en cada registro de inscripcin para el registro de
curso propietario, y podra necesitarse tam bin un apuntador para el registro de es
tudiante propietario.
Si bien se pueden usar esos apuntadores con el objeto de responder a las pregun
tas en el m enor tiem po posible, existe la alternativa de lograr un ahorro considera
ble de espacio t . al costo de hacer ms lentos algunos clculos, si se elim inan los
apuntadores y se coloca al final de cada lista Ec un apuntador al registro de curso
propietario, y al final de cada lista C un apuntador al registro de estudiante pro
pietario. En esta forma, cada registro de estudiante y de curso ser parte de un ani
llo que incluya todos los registros de inscripcin de los cuales es propietario. Estos
anillos estn representados en la figura 4.25, para los datos de la figura 4.24. Obsr
vese que los registros de inscripcin tienen como prim er apuntador c s i g , y como
segundo, e s ig .
Fig. 4.25.
t Obsrvese que es probable que haya m uchos m s registros de inscripcin que registros de estudian
tes o cursos, de m odo que reducir de tam ao los registros de inscripcin perm ite dism inuir la necesidad
total de espacio casi en la m ism a proporcin.
www.FreeLibros.me
150
La operacin del ejemplo 4.11 se puede expresar en trm inos abstractos como
sigue:
for cada registro de inscripcin en el conjunto para CS101 do begin
e
el estudiante propietario del registro de inscripcin;
imprim e (e)
end
t Se debe lener alguna form a d e identificar los tipos d e registro y se dar m om entneam ente una ma
nera de hacerlo.
www.FreeLibros.me
151
cursos e inscripciones. En Pascal esto tiene que ser as, ya que los cam pos c s i g y
e~sig tienen la capacidad de apuntar a tipos de registro distintos. Sin embargo, esta
estructura resuelve uno de los problemas que quedan, pues ahora es fcil decir a qu
tipo de registro se llega conform e se recorre un anillo. La figura 4.26 m uestra una
posible declaracin de los registros y un procedim iento que imprim e los nom bres de
los estudiantes inscritos en un curso en particular.
type
www.FreeLibros.me
152
c, e, f. tipo_registro;
begin
f: - f\.c - s ig
until
f\.c la s e - estudiante,
I ahora / apunta al estudiante a quien pertenece la inscripcin e\ 1
w ntelnif t .nombre-estudiant)\
e:~ e t .e s ig
end
end
Fig. 4.26.
www.FreeLibros.me
EJERCICIOS
153
de cubetas
Fig. 4.27.
Ahora se puede agregar un nom bre m ediante una insercin en la tabla de dis
persin en un tiem po 0(1) en prom edio, colocando tam bin un apuntador a la
celda recin creada dentro del arreglo ESCALA en la posicin m arcada por el cur
sor sig.peldao de la figura 4.27. Para los retos, se busca el nom bre en la tabla de
dispersin en un tiem po 0(1 ) en prom edio, obtenindose el peldao i correspon
diente al jugador dado y luego se sigue el apuntador en ESCALA[i - 1] a la celda del
jugador que se va a retar. La consulta de ESCALA[i - 1] lleva un tiem po constante
en el peor caso y la bsqueda en la tabla de dispersin dem anda un tiempo 0 ( 1)
en promedio, de modo que RETA es 0(1) en el caso promedio.
A CAMBIA(Z) le lleva un tiem po 0(1) hallar las celdas de los jugadores en los
peldaos / e / 1, intercam biar los nm eros de peldao de esas celdas, e intercam
biar en ESCALA los apuntadores a las dos celdas. As, CAMBIA requiere un tiempo
constante incluso en el peor caso.
Ejercicios
4.1
U N IO N R , B. O
IN T E R SE C C IO N ^, t. Q
DIFERENCIA R, t. Q
M IEM BRO(l, A)
INSERTA(1, A)
SUPRIME(1, A)
M IN R )?
www.FreeLibros.me
154
*4.2
4.3
4.4
4.5
4.6
Para cada una de las operaciones y aplicaciones de los ejercicios 4.4 y 4.5,
proporcinese el orden de magnitud del tiempo de ejecucin con conjuntos
de tam ao n.
4.7
4.8
Supngase que se est usando una tabla de dispersin cerrada con cinco cu
betas y la funcin de dispersin h(i) - i mod 5. Mustrese la tabla de dis
persin cerrada con resolucin lineal de colisiones que resulta de insertar
la sucesin 23, 48, 35, 4, 10, en una tabla inicialmente vaca.
4.9
www.FreeLibros.me
EJERCICIOS
155
4.10
4.11
2d,_i
si 2dhl < B
(2dhl- B ) k
si 2rf(_, > B
a) Mustrese el rbol parcialm ente ordenado que resulta cuando los ente
ros 5, 6, 4, 9, 3, 1 ,7 se insertan en un rbol vaco,
b) Cul es el resultado de tres operaciones SU PR IM E-M IN sucesivas en
el rbol de a)?
4.16
www.FreeLibros.me
156
4.17
4.18
Notas bibliogrficas
K nuth [1973] es una buena fuente de informacin adicional sobre dispersin. La dis
persin se desarroll en la segunda m itad de la dcada de 1950, y Peterson [1957]
es de los prim eros artculos fundam entales sobre el tema. Morris [1968] y M aurer y
Lewis [1975] dan buena informacin sobre la dispersin.
La lista m ltiple es la estructura de datos central de los sistemas de bases de da
tos basados en redes propuestos en DBTG [1971], Ullman [1982] proporciona in
formacin adicional sobre las aplicaciones, en bases de datos, de las estructuras de
ese tipo.
La aplicacin m ediante montculos de los rboles parcialm ente ordenados se basa
en una idea de Williams [1964]. Las colas de prioridad se estudian ms a fondo en
Knuth [1973].
Reingold [1972] analiza la complejidad com putacional de las operaciones bsi
cas con conjuntos. Las tcnicas de anlisis de flujo de datos basadas en conjuntos
se tratan con detalle en Cocke y Alien [1976] y en Aho y Ullm an [1977],
www.FreeLibros.me
1157|
Mtodos avanzados
de representacin de conjuntos
Este captulo presenta estructuras de datos para conjuntos que perm iten obtener co
lecciones comunes de operaciones sobre conjuntos ms eficientes que las pre
sentadas en el captulo anterior. Sin embargo, estas estructuras son ms complejas
y con frecuencia slo son apropiadas para conjuntos muy grandes. Todas estn ba
sadas en varias clases de rboles, como rboles binarios de bsqueda, tries (rboles
de recuperacin de informacin) y rboles balanceados.
5 .1
Se comenzar con los rboles binarios de bsqueda, una estructura de datos bsica
para la representacin de conjuntos cuyos elementos estn clasificados de acuerdo
con algn orden lineal. Como de costumbre, se designar ese orden por medio del sig
no < . Esta estructura de datos es til cuando se tiene un conjunto de elem entos de
un universo tan grande, que no es prctico em plear los propios elem entos del con
junto como ndices de arreglos. Un ejemplo de tal universo puede ser el conjunto
de identificadores en un program a en Pascal. Un rbol binario de bsqueda puede
m anejar las operaciones de conjuntos INSERTA, SUPRIM E. MIEMBRO y MIN. to
mando en prom edio 0(logn) pasos por operacin para un conjunto de n elementos.
Un rbol binario de bsqueda es un rbol binario en el cual los nodos estn eti
quetados con elementos de un conjunto. La propiedad im portante de este tipo de
rboles es que todos los elem entos alm acenados en el subrbol izquierdo de cual
quier nodo x son menores que el elem ento alm acenado en x, y todos los elementos
almacenados en el subrbol derecho de a: son mayores que el elemento almacenado
en ese sitio. Esta condicin, conocida como propiedad deI rbol binario de bsqueda,
se cumple para todo nodo de un rbol binario de bsqueda, incluyendo la raz.
La figura 5.1 m uestra dos rboles binarios de bsqueda que representan el mis
mo conjunto de enteros. Obsrvese la interesante propiedad de que si se listan los
nodos del rbol en orden simtrico, los elementos alm acenados en dichos nodos que
dan clasificados.
Supngase que se usa un rbol binario de bsqueda para representar un conjun
to. La propiedad del rbol binario de bsqueda hace que sea simple la prueba de per
tenencia al conjunto. Para determ inar si x es un m iem bro del conjunto, prim ero se
compara x con el elem ento r que se encuentre en la raz. Si x = r, no hay problema,
la respuesta a la pregunta de pertenencia es cierto. Si x < r, entonces x, si existe.
www.FreeLibros.me
158
slo puede ser un descendiente del hijo izquierdo de la raz, a causa de la propiedad
del rbol binario de bsqueda f- De igual modo, si x > r. x slo puede ser un des
cendiente del hijo derecho de la raz.
10
15
14
14
7
12
18
15
10
7
(a)
F ig . 5 .1 .
12
(b)
Dos rboles binarios de bsqueda.
tipo_nodo = reco rd
elemento: tipo-elem ento;
hijo-izq, hijo-der. t tipo_nodo
end;
CO N JU N TO = t tipo-nodo;
Ahora se puede especificar en su totalidad la funcin MIEMBRO de la figura 5.2.
Obsrvese que debido a que CO N JU N TO y apuntador a tipo_nodo son sinnit Recurdese que el hijo izquierdo de la ra(z es un descendiente de si m ism o, asi que no debe elim i
narse la posibilidad de que x sea hijo izquierdo de la raiz.
www.FreeLibros.me
159
www.FreeLibros.me
160
La elim inacin presenta algunos problemas. Prim ero, se debe localizar el elemen
to x que se elim ine del rbol. Si x est en una hoja, tal vez baste elim inar esa hoja.
Sin embargo, x puede estar en un nodo interior nodo-i, y elim inar nodo-i podra
desconectar el rbol.
Si no d o -i tiene slo un hijo, como el nodo 14 de la figura 5.1(b), es posible sus
titu ir n o d o -i por ese hijo, y el rbol binario de bsqueda quedar bien construido.
Si nodo-i tiene dos hijos, como el nodo 10 de la figura 5. l(a), es necesario encontrar
el m enor elem ento de los descendientes del hijo derecho t- Por ejemplo, en el caso
de que el elem ento 10 sea borrado de la figura 5.1(a), se debe reem plazar por 12, el
descendiente del hijo derecho de 10 con valor m s bajo.
Para escribir SUPRIM E, es til tener una funcin SUPRIME_MIN(/1) que eli
mine el elem ento ms pequeo de un rbol no vaco y devuelva el valor del elemen
to elim inado. El cdigo de SU PR IM E-M IN se m uestra en la figura 5.4. El cdigo
de SUPRIM E usa SU PRIM E_M IN y se m uestra en la figura 5.5.
fu n c tio n SU PR IM E-M IN ( v a r A: CO N JU N TO ) : tipo_elemento;
SU PRIM E_M IN
en d ; I SU PR IM E-M IN |
Fig. 5.4.
www.FreeLibros.me
161
Ejemplo 5.1. Supngase que se intenta elim inar 10 de la figura 5. l(a). Entonces, en
la ltim a proposicin de SUPRIM E se llama a SU PR1M E-M IN con un argumento
apuntador al nodo 14. Ese apuntador es el cam po hijo-der de la raz. Esa llamada
produce otra llamada a SU PR IM E-M IN . El argum ento es ahora un apuntador al
nodo 12; este apuntador se encuentra en el cam po hijo-izq del nodo 14. Se encuen
tra que 12 no tiene hijo izquierdo, as que se devuelve el elem ento 12 y se hace
que el hijo izquierdo de 14 sea el hijo derecho de 12, el cual resulta ser nil. Despus,
SUPRIM E toma el valor 12 devuelto por SU PR IM E-M IN , que reemplaza a 10. El
rbol resultante se m uestra en la figura 5.6.
12
15
Fig. 5.6.
5 .2
En esta seccin se analiza el com portam iento prom edio de distintas operaciones para
rboles binarios de bsqueda. Se dem uestra que al insertar n elem entos aleatorios
en un rbol binario de bsqueda inicialm ente vaco, la longitud de cam ino prom e
dio de la raz a una hoja es 0(log). La prueba de pertenencia, por tanto, lleva un
tiempo 0(log).
Es fcil ver que si un rbol binario de n nodos est com pleto (todos los nodos,
excepto los que estn en el nivel ms bajo, tienen dos hijos), ningn cam ino tendr
ms de 1 + logn nodos t- As, los procedim ientos MIEMBRO, INSERTA, SU PR I
ME y SU PR IM E-M IN llevan un tiem po <9(log). Para comprenderlo, obsrvese que
todos toman una cantidad de tiem po constante en un nodo, por lo que pueden lla
marse a s mismos en form a recursiva a lo sum o en un hijo. Por tanto, la secuencia
t Recurdese que lod o s los logaritm os son de base 2, a m enos que se indique lo contrario.
www.FreeLibros.me
162
de nodos en la cual se realizan las llamadas form a un cam ino desde la raz. Como
el cam ino es de longitud O(log/i), el tiem po total consum ido para seguir el camino
es 0(logrt).
Sin embargo, al insertar n elementos en un orden aleatorio, no es forzoso que
se acomoden en form a de rbol binario completo. Por ejemplo, si sucede que el pri
mer elem ento insertado en orden clasificado es el ms pequeo, el rbol resultante
ser una cadena de n nodos, donde cada nodo, excepto el ms bajo en el rbol, ten
dr un hijo derecho, pero no un hijo izquierdo. En este caso, es fcil mostrar que
como lleva 0 (i) pasos insertar el -simo elem ento y i - r(n +1 )/2, dicho proceso
t-1
de n inserciones necesita 0 (n 2) pasos, u 0(n ) pasos por operacin.
Es preciso determ inar si el rbol binario de bsqueda prom edio con n nodos
se acerca en estructura al rbol completo y no a la cadena, esto es, si el tiempo pro
m edio por operacin en un rbol aleatorio necesita 0(log/i) pasos, 0(n) pasos, o
un tiem po interm edio. Como es difcil saber la verdadera frecuencia de inserciones
y supresiones, o si los elem entos elim inados poseen alguna propiedad especial (por
ejemplo, si siempre se elim ina el m nim o), slo se puede analizar la longitud del ca
m ino prom edio de rboles aleatorios adoptando algunas suposiciones: los rboles
se form an slo a partir de inserciones, y todas las m agnitudes de los n elementos in
sertados tienen igual probabilidad.
Con esas suposiciones naturales, se puede calcular P(n), el nm ero promedio de
nodos del cam ino que va de la raz hacia algn nodo (no necesariamente una hoja).
Se supone que el rbol se form con la insercin de n nodos aleatorios en un rbol
que se encontraba vaco en un inicio. Es evidente que F(0) - 0 y .P(l) - 1. Supngase
que se tiene una lista de n > 2 elem entos para insertar en un rbol vaco. El primer
elem ento en la lista, llam ado a, es probable que sea el prim ero, el segundo o el
n-simo en el orden de clasificacin. Considrese que i elementos en la lista son meno
res que a, de modo que n - i -1 son mayores que a. Al construir el rbol, a apare
cer en la raz, los i elem entos m s pequeos sern descendientes izquierdos de la
raz, y los restantes n - i - 1 sern descendientes derechos. (Vase Fig. 5.7.)
Com o todos los rdenes de los i elem entos pequeos y de los n - i -1 elementos
ms grandes tienen igual probabilidad, se espera que los subrboles izquierdo y de
recho de la raz tengan longitudes de cam ino prom edio P(i) y P(n - i - 1), respecti
vamente. Como es posible acceder a esos elem entos desde la raz del rbol comple-
Fig. 5.7.
www.FreeLibros.me
163
to, es necesario agregar 1 al nm ero de nodos de cada cam ino. As, para todo / entre
0 y n - 1, P(n) puede calcularse obteniendo el prom edio de la suma
J _ W ) + i)+
n
( P ( n - - I ) +1) +
n
( ~ *l i l
n
El primer trm ino es la longitud de cam ino prom edio en el subrbol izquierdo, pon
derando su tam ao. El segundo trm ino es la cantidad anloga del subrbol derecho
y el trm ino \/n representa la contribucin de la raz. Al prom ediar la suma anterior
para toda i entre 1 y n, se obtiene la recurrencia
f \ n ) ~ \ + J _ ( /J (0 + ( _ ! _ ! ) / > ( _ ; _ ! ) )
n~ 1-0
(5 1 )
n-i
La primera parte de la sum atoria (5.1), \ iF\i), se puede hacer idntica a la se-i
to
gunda parte
- i - l)P (n - i - 1) si se sustituye i por n - i - 1 en la segunda pari-0
ii-1
te. Adems, el trm ino para i = 0 del sum atorio iP[i) es cero, por lo que es poi-O
sible em pezar el sum atorio en 1. As, (5.1) puede escribirse
P(n) = 1 + V iP(i)
2 T t
para n > 2
(5.2)
Se demuestra, por induccin sobre n, empezando en n - 1, que P(ri) < 1 + 41ogn. Con
seguridad esta proposicin es verdadera para n - 1, ya que P{ 1) = I.Supngase que
es verdadera para toda i < n. Entonces, por (5.2)
F\n) < 1 + - y
(4/log/ + /)
Tt
<
2 iL*
? n-'
1+ V 4i1og/ +
y i
Tt
n2
(5.3)
8 n_l
< 2+ y iiog
2 h
n -1
i-i
de la segunda lnea es a lo sum o 1. Al dividir los trm inos del sum atorio de (5.3) en
dos partes, aquellos para los que i < fn/2] - 1, lo cual no excede de /log(/i/2), y aque
llos para los que i > \n/2] - 1, que no excede de /log. As, (5.3) puede escribirse
otra vez
8
f ln/21-l
P(n) < 2 +
n2 [ i-i
/log(n/2) +
/logzi
Ho/21
www.FreeLibros.me
( 5 .4 )
164
Sea n par o impar, es posible dem ostrar que la prim era sum a de (5.4) no excede de
(n2/8)log(n/2), lo cual es (n2/8)logn - (n2/ 8), y la segunda suma no excede de
(32/8)logn. As, (5.4) se puede escribir
Pin) < 2 +
n
n
nl
logn -
2
< 1 + 41og
como se deseaba probar. Este paso completa la induccin y demuestra que el tiem
po prom edio para seguir un cam ino de la raz a un nodo aleatorio de un rbol bi
nario de bsqueda construido m ediante inserciones aleatorias es 0(logn \ lo cual es,
en un factor constante, tan bueno como si el rbol fuera completo. Un anlisis ms
cuidadoso demuestra que la constante 4 es en realidad cercana a 1.4.
Se concluye de lo anterior que el tiem po de la prueba de pertenencia de un miem
bro aleatorio del conjunto lleva un tiem po 0(logn). Un anlisis similar muestra que
si se incluyen en la longitud de cam ino prom edio slo aquellos nodos que carecen
de am bos hijos o slo aquellos que no tienen hijo izquierdo, la longitud del camino
prom edio an se ajustar a una ecuacin similar a (5.1) y es, por tanto, 0(logn). Es
posible aseverar entonces que la prueba de pertenencia de un elemento aleatorio que
no est en el conjunto, la insercin de un nuevo elem ento aleatorio y la eliminacin
de un elem ento aleatorio tam bin llevan un tiem po 0(\ogn) en promedio.
www.FreeLibros.me
TRIES
5 .3
165
Tries
tipo_palabra - | a definir 1
CO N JU N TO - | a definir m ediante la estructura de trie i;
var
i a definir (
procedure SUPRIM E ( x: tipo_palabra; var A: CO N JU N TO );
I a d e fin ir)
procedure ANULA ( var A: CO N JU N TO );
a definir
t Trie se pens originalm ente c o m o un hom nim o de tree (que en ingls se pronuncia tri), pero para
distinguir estos trm inos, m ucha gente prefiere pronunciarlo igual que p ie (que en ingls se pronuncia
pay).
www.FreeLibros.me
166
procedure IM P R IM E ( var A: CO N JU N TO );
i a definir I
begin
AN U LA R);
while not eofiinput) do begin
toma-palabra(siguiente-palabra, input)\
IN S E R T A{siguiente-palabra, A)
end
while not eofidiccionario) do begin
toma-palabra(siguiente-palabra, diccionario);
SUPRIME(s/u/,nfe_/?a/a>ra. A)
end;
IMPRIME(zl);
end; I orto (
Fifl. 5.8.
La estructura trie m aneja esas operaciones cuando los elementos del conjunto
son palabras, esto es, cadenas de caracteres. Es apropiada cuando muchas palabras
comienzan con la m ism a secuencia de letras, es decir, cuando el nmero de prefijos
distintos entre todas las palabras del conjunto es mucho m enor que la longitud total
de todas las palabras.
En un trie, cada cam ino de la raz a una hoja corresponde a una palabra del con
ju n to representado. De esta form a, los nodos del trie corresponden a los prefijos de
las palabras del conjunto. Para evitar confusin entre palabras como ELLO y
ELLOS, se aade un smbolo especial m arca-fin, $, al final de todas las palabras, y
as ningn prefijo de una palabra puede ser una palabra por s mismo.
F ig . 5.9.
Un trie.
Ejemplo 5.3. En la figura 5.9 hay un trie que representa el conjunto de las palabras
iTHE, THEN, T H IN , THIS, TIN , SIN, SING!. Esto es, la raz corresponde a la ca-
www.FreeLibros.me
TR IES
167
dena vaca y sus dos hijos corresponden a los prefijos T y S. La hoja que est ms
a la izquierda representa la palabra THE, la siguiente, la palabra THEN, y as sucesi
vamente.
Considrense las siguientes observaciones sobre la figura 5.9.
1.
2.
3.
Tcnicamente, tam bin se requiere un procedim iento ANULA(noo) para hacer que
nodo sea la correspondencia nula. U na realizacin simple de los nodos de un trie es
mediante un arreglo nodo de apuntadores a nodos, siendo el conjunto de ndices
|A, B, ..., Z, $). Esto es, se define
type
cars - (A, *B\ ..., Z \ '$);
N O D O -T R IE - array [cars] of tNODO_TRIE;
Si nodo es un nodo de trie, nodo[c] es VALOR_DE(/io 0, c) para cualquier c del con
junto de caracteres. Para evitar la creacin de muchas hojas que sean hijos corres
pondientes a '$, se adoptar la convencin de que rt0<fo[$] es nil o un apuntador
al propio nodo. En el prim er caso, nodo no tiene hijos que correspondan a
y en
el segundo caso, se determ ina que tiene tal hijo, aunque nunca se haya creado. En
tonces, se pueden escribir los procedim ientos para nodos de trie como en la figura
5.10.
www.FreeLibros.me
168
c. char;
begin
for c
nodo[c)
end; | ASIGNA I
function VALOR_DE ( var nodo: N O D O -T R IE ; c. char ) : t NO DO-TRIE;
begin
return (nodo[c\)
end; | VA LO R-DE i
procedure TOM A_NUEVO ( var nodo: NODO_TRIE; c. char );
begin
new{nodo[c])\
ANULA(noo[c])
end; fTO M A -N U EV O
Fig. 5.10.
Ahora, se define
type
TRIE - t N O D O -TR IE;
Se supondr que tipo.palabra es un arreglo de caracteres de cierta longitud fija.
Siempre se partir del supuesto de que el valor de tal arreglo contiene al menos
se considerar como fin de la palabra representada el prim er $ \ sin im portar lo que
siga (quiz m s '$ ). Con esta suposicin, se escribe el procedim iento INSERTA(x,
palabras) para insertar x en el conjunto palabras representado por un trie, como se
m uestra en la figura 5.11. Se deja como ejercicio la escritura de ANULA, SUPRI
ME e IM PRIM E para tries representados como arreglos.
procedure INSERTA ( x: tipo.palabra; var palabras: TRIE );
var
www.FreeLibros.me
TRIES
169
begin
i
/
1;
palabras;
end;
Procedimiento INSERTA.
tipo-celda = record
dominio: char;
valor, t tipo-celda;
iapuntador a la prim era celda de la lista para el nodo hijo!
siguiente-, ttipo_celda;
{apuntador a la siguiente celda de la lista;
end;
Se dejan como ejercicios los procedim ientos ASIGNA, VALOR_DE, ANULA y
TOMA_NUEVO para esta realizacin de nodos de trie. Despus de escribir esos pro
www.FreeLibros.me
170
cedimientos, las operaciones sobre tries como INSERTA, de la figura 5.11, y otras
que quedaron como ejercicios, deben funcionar correctamente.
8n bytes para las celdas de las cubetas, siendo una celda para cada una de las n
palabras; una celda tiene dos apuntadores u 8 bytes.
I + n bytes para que el arreglo de caracteres almacene las n palabras de longitud
total / y sus marcas de final.
www.FreeLibros.me
C:
C
slevel-
www.FreeLibros.me
[200|
Grafos dirigidos
6 .1
Definiciones fundamentales
cos.
Los vrtices de un grafo dirigido pueden usarse para representar objetos, y los
arcos, relaciones entre los objetos. Por ejemplo, los vrtices pueden representar ciu
dades, y los arcos, vuelos areos de una ciudad a otra. En otro ejemplo, como el que
se present en la seccin 4.2, un grafo dirigido puede emplearse para representar el
flujo de control en un programa de com putador. Los vrtices representan bloques
bsicos, y los arcos, posibles transferencias del flujo de control.
Un camino en un grafo dirigido es una secuencia de vrtices v,, v2, ..., v, tal que
V, vj, v2 v3, . .., v , v son arcos. Este cam ino va del vrtice v, al vrtice v.
www.FreeLibros.me
201
pasa por los vrtices v2, v3, v _ , , y term ina en el vrtice v. La longitud de un ca
m ino es el nm ero de arcos en ese cam ino, en este caso, n - 1. Como caso especial,
un vrtice sencillo, v, por s mismo denota un cam ino de longitud cero de v a v. En
la figura 6.1, la secuencia 1, 2, 4 es un cam ino de longitud 2 que va del vrtice 1 al
vrtice 4.
Un cam ino es simple si todos sus vrtices, excepto tal vez el prim ero y el ltimo,
son distintos. Un ciclo simple es un cam ino simple de longitud por lo m enos uno,
que empieza y term ina en el m ismo vrtice. En la figura 6.1, el cam ino 3, 2, 4, 3 es
un ciclo de longitud 3.
En muchas aplicaciones es til asociar informacin a los vrtices y arcos de un
grafo dirigido. Para este propsito es posible usar un grafo dirigido etiquetado, en el
cual cada arco, cada vrtice o ambos pueden tener una etiqueta asociada. U na eti
queta puede ser un nom bre, un costo o un valor de cualquier tipo de datos dado.
La figura 6.2 m uestra un grafo dirigido etiquetado en el que cada arco
est etiquetado con una letra que causa una transicin de un vrtice a otro. Este gra
fo dirigido etiquetado tiene la interesante propiedad de que las etiquetas de los ar
cos de cualquier ciclo que sale del vrtice 1 y vuelve a l producen una cadena de
caminos a y b en la cual los nm eros de a y de b son pares.
Ejemplo 6.2.
6 .2
www.FreeLibros.me
202
GRAFOS DIRIGIDOS
Fig. 6.2.
Algo muy relacionado con esto es la representacin con m atriz de adyacencia eti
quetada de un grafo dirigido, donde A[i, j ] es la etiqueta del arco que va del vrti
ce i al vrtice j. Si no existe un arco de i a j , debe emplearse como entrada para A[i, j)
un valor que no pueda ser una etiqueta vlida.
La figura 6.3. m uestra la m atriz de adyacencia etiquetada para el gra
fo dirigido de la figura 6.2. Aqu, el tipo de la etiqueta es un carcter, y un espacio
representa la ausencia de un arco.
Ejemplo 6.3
1
2
3
4
Fig. 6.3.
www.FreeLibros.me
203
el nmero de arcos es mucho m enor que n2. Sin embargo, una desventaja potencial
de la representacin con lista de adyacencia es que puede llevar un tiempo 0(n) de
term inar si existe un arco del vrtice i al vrtice j, ya que puede haber 0(n ) vrtices
en la lista de adyacencia para el vrtice i.
La figura 6.4 muestra una representacin con lista de adyacencia
para el grafo dirigido de la figura 6.1, donde se usan listas enlazadas sencillas. Si los
arcos tienen etiquetas, stas podran incluirse en las celdas de la lista ligada.
Ejemplo 6.4.
Fig. 6.4.
~ l
- I
(6.1)
t Esta es otra m anifestacin del viejo problema de Pascal de hacer insercin y supresin en posiciones
arbitrarias d e listas enlazadas sencillas.
www.FreeLibros.me
204
GRAFOS DIRIGIDOS
9|
0
ADY
F ig . 6 .5 .
Ejemplo 6.5. Si se escoge la representacin con m atriz de adyacencia, VERTICE(v, /') devuelve i. PRIMERO(v) y SIGUIENTE(v, i) pueden escribirse como en la
figura 6.6, para operar en una m atriz booleana A de n x n definida de m anera ex
tem a. Se supone que A est declarada como
a r r a y [l..n, l..w] of boolean
i: integer;
www.FreeLibros.me
205
begin
for i
1 to n do
if[v, /] then
return(i);
return (0) I si se llega aqu, v no tiene vrtices adyacentes i
end; i P R IM E R O I
j : integer;
begin
for j := i+ 1 to n do
if A[v,j] then
return (/);
return (0)
end; I SIGUIENTE |
F ig . 6 .6 .
PRIMERO(v);
while i O A d o begin
w :
=V E R T I C E ! v, i);
I alguna accin en w i
S I G U I E N T E ! v, i)
end
F ig . 6 .7 .
6 .3
www.FreeLibros.me
206
GR AFO S D IRIG ID OS
arco v tv, una ruta area de la ciudad v a la ciudad w. La etiqueta del arco v w
es el tiempo que se requiere para volar de v a w f. La solucin del problema de los
caminos ms cortos con un solo origen para este grafo dirigido determ inara el tiem
po de viaje m nim o para ir de cierta ciudad a todas las dems del mapa.
Para resolver este problema se m anejar una tcnica vida conocida como
algoritmo de Dijkstra, que opera a partir de un conjunto 5 de vrtices cuya distancia
ms corta desde el origen ya es conocida. En principio, S contiene slo el vrtice de
origen. En cada paso, se agrega algn vrtice restante v a S, cuya distancia desde el
origen es la m s corta posible. Suponiendo que todos los arcos tienen costo no ne
gativo, siempre es posible encontrar un camino ms corto entre el origen y v que
pasa slo a travs de los vrtices de 5, y que se llama especial. En cada paso del al
goritmo, se utiliza un arreglo D para registrar la longitud del camino especial ms
corto a cada vrtice. U na vez que 5 incluye todos los vrtices, todos los caminos son
especiales, as que D contendr la distancia ms corta del origen a cada vrtice.
El algoritmo se da en la figura 6.8, donde se supone que existe un grafo dirigido
G = (V, A) en el que V = 11, 2, ..., n\ y el vrtice 1 es el origen. C es un arreglo bidimensional de costos, donde C[i, j ] es el costo de ir del vrtice i al vrtice j por el ar
co i j. Si no existe el arco i -* j , se supone que C[i, j] es oo, un valor mucho mayor
que cualquier costo real. En cada paso, D[] contiene la longitud del cam ino especial
ms corto actual para el vrtice i.
Ejemplo 6.6. Apliqese Dijkstra al grafo dirigido de la figura 6.9. En principio,
S = 11(, Z>[2] - 10, D[3] = oo, D[4] = 30 y Z>[5] = 100. En la primera iteracin del ci
clo for de las lneas (4) a (8), w = 2 se selecciona como el vrtice con el m nim o va
lor D. Despus se hace Z)[3] - mn(co, 10 + 50) - 60. D[4] y Z)[5] no cambian por
que el cam ino para llegar a ellos directam ente desde 1 es ms corto que pasar por
el vrtice 2. La secuencia de valores D despus de cada iteracin se muestra en la
figura. 6.10.
Para reconstruir el cam ino ms corto del origen a cada vrtice, se agrega otro arre
glo P de vrtices, tal que P[v] contenga el vrtice inm ediato anterior a v en el cami
no ms corto. Se asigna I\v] valor inicial 1 para toda v * 1. El arreglo P puede
actualizarse despus de la lnea (8) de Dijkstra. Si )[w) + C[h>, v] < D[v] en la lnea
(8), despus se hace P t v ] w . Al trm ino de Dijkstra. el cam ino a cada vrtice pue
de encontrarse regresando por los vrtices predecesores del arreglo P.
procedure Dijkstra;
| Dijkstra calcula el costo de los caminos ms cortos entre el vrtice 1
y todos los dem s de un grafo dirigido !
begin
(1)
S := I 1 h
(2)
for i
2 to n do
t Cabra suponer que puede usarse un grafo no dirigido, ya que la eliqueta de los arcos v w y w v
seria la m ism a. Sin embargo, los tiem pos de viaje son diferentes en direcciones diferentes, debido a los
vientos. D e cualquier forma, aunque las etiquetas v -* w y w v fueran idnticas, esto no ayudarla
a resolver el problema.
www.FreeLibros.me
(3)
(4)
(5)
(6)
(7)
for i
(8 )
207
end
end; | Dijkstra I
Fig. 6.8.
Algoritmo de Dijkstra.
Fig. 6.9.
Ejemplo 6.7. Para el grafo dirigido del ejemplo 6.6, el arreglo P debe tener los valores P[2\= 1, Pt3] - 4, F\4] - 1 y P15] - 3. Para encontrar el cam ino ms corto del
vrtice 1 al vrtice 5, por ejemplo, se siguen los predecesores en orden inverso co
menzando en 5. A partir del arreglo P, se determ ina que 3 es el predecesor de 5, 4
el predecesor de 3 y 1 el predecesor de 4. Asi, el cam ino ms corto entre los vrti
ces i y 5 es 1, 4, 3, 5.
Iteracin
inicial
1
2
3
4
il
11,2}
!1,2,4!
11,2,4,3!
11,2,4,3,5}
Fig. 6.10.
2
4
3
5
D[ 2]
D[ 3]
D[ 4]
D[ 5]
10
10
10
10
10
co
60
50
50
50
30
30
30
30
30
100
100
90
60
60
www.FreeLibros.me
208
GRAFOS D IRIG ID OS
est fuera de S, pero tiene el cam ino especial ms corto. Para ver por qu en este
caso no puede haber un cam ino no especial ms corto desde el origen hasta w, ob
srvese la figura 6.11, en la que se m uestra un cam ino hipottico ms corto a w que
prim ero sale de S para ir al vrtice x , despus (tal vez) entra y sale de 5 varias veces
antes de llegar finalm ente a w.
Pero si este cam ino es m s corto que el cam ino especial ms corto a w, el seg
m ento inicial del cam ino entre el origen y x es un cam ino especial a x ms corto que
el cam ino especial m s corto a w. (Obsrvese lo im portante que es el hecho de que
los costos no sean negativos; sin ello, este argum ento no sera vlido, y de hecho, el
algoritmo de Dijkstra no funcionara correctam ente.) En este caso, se debi selec
cionar x en vez de w en la lnea (5) de la figura 6.8, porque D[x] fue m enor que D[w\.
Para com pletar la demostracin de que la figura 6.8 funciona, se verifica que en
todos los casos >[v] es realmente la distancia m s corta de un cam ino especial al vr
tice v. La clave de este razonam iento est en observar que al agregar un nuevo vr
tice w a S en la lnea (6), las lneas (7) y (8) ajustan D para tener en cuenta la posi
bilidad de que exista ahora un cam ino especial ms corto a v a travs de w. Si ese
cam ino va a travs del anterior S a w, e inm ediatam ente despus a v, su costo,
D[w] + Qtv, v], ser com parado con D[v] en la lnea (8), y >[v] se reducir si el nue
vo cam ino especial es ms corto. La otra posibilidad de un camino especial ms cor
to se m uestra en la figura 6.12, donde el cam ino va a w, despus regresa al anterior
S. a algn m iem bro x del 5 anterior, y luego a v.
Pero en realidad no puede existir tal cam ino; puesto que x se coloc en 5 antes
que w, el ms corto de todos los caminos entre el origen y x pasa slo a travs del
S anterior. Por tanto, el camino hacia x a travs de w, m ostrado en la figura 6.12,
no es ms corto que el cam ino que va directo a x a travs de S. Como resultado, la
longitud del cam ino de la figura 6.12 entre el origen y w, x, y v no es m enor que el
anterior valor de D[v], ya que >[v] no fue m ayor que la longitud del camino ms cor
to hasta x a travs de 5 y despus directam ente a w. As, )[v] no puede reducirse en
la lnea (8) por m edio de un cam ino que pase por w y x, como el de la figura 6.12,
y no es necesario considerar la longitud de esos caminos.
Fig. 6.11.
www.FreeLibros.me
\ origen (
anterior S
Fig. 6.12.
209
--------
6 .4
Supngase que se tiene un grafo dirigido etiquetado que da el tiempo de vuelo para
ciertas rutas entre ciudades, y se desea construir una tabla que brinde el m enor tiem
po requerido para volar entre dos ciudades cualesquiera. Este es un ejemplo del pro
blema de los caminos ms cortos entre todos los pares (CMCP). Para plantear el pro
blema con precisin, se emplea un grafo dirigido G - ( V , A) en el cual cada arco
v * w tiene un costo no negativo Qv, wj. El problema CM CP es encontrar el cam i
no de longitud ms corta entre v y w para cada par ordenado de vrtices (v, w).
www.FreeLibros.me
210
GR AFO S D IRIG ID OS
Podra resolverse este problema por medio del algoritmo de Dijkstra, tomando
por tum o cada vrtice como vrtice origen, pero una forma ms directa de solucin
es m ediante el algoritmo creado por R. W. Floyd. Por conveniencia, se supone otra
vez que los vrtices en v estn num erados 1, 2 ,..., n. El algoritmo de Floyd usa una
m atriz A de n x n en la que se calculan las longitudes de los cam inos ms cortos. Ini
cialm ente se hace A [i,j] = C [i,j ] para toda i / j. Si no existe un arco que vaya de
i a j, se supone que Q /.y ] - oo. Cada elem ento de la diagonal se hace 0.
Despus, se hacen n iteraciones en la m atriz A. Al final de la Ac-sima iteracin,
A[i,j] tendr por valor la longitud ms pequea de cualquier cam ino que vaya des
de el vrtice i hasta el vrtice./ y que no pase por un vrtice con nm ero mayor que
k. Esto es, i y j, los vrtices extremos del camino, pueden ser cualquier vrtice, pero
todo vrtice interm edio debe ser m enor o igual que k.
En la k-sima iteracin se aplica la siguiente frmula para calcular A.
( A k. , [i.j]
Ak[i, j] - mn J
\ A k. i [i.k] + Ak . i [k.j]
El subndice k denota el valor de la m atriz A despus de la A:-sima iteracin; no in
dica la existencia de n m atrices distintas. Pronto, se elim inarn esos subndices. Esta
frm ula tiene la interpretacin simple de la figura 6.13.
Para obtener A k[i, j], se com para A k_ ,[/, j \ , el costo de ir de i a j sin pasar por k
o cualquier otro vrtice con num eracin mayor, con A k . l[i, k] + A k_ [k,j], el costo
de ir prim ero de / a k y despus de A: a j, sin pasar a travs de un vrtice con nmero
mayor que k. Si el paso por el vrtice k produce un cam ino ms econmico que el
de A k. l[ i , j ] , se elige ese costo para A^i . j ) .
Fig. 6.13.
www.FreeLibros.me
Fig. 6.14.
211
ma funciona, es fcil dem ostrar por induccin sobre k que despus de k recorridos
por el triple ciclo for, A[i, j ] contiene la longitud del camino ms corto desde el vr
tice i hasta el vrtice j que no pasa a travs de un vrtice con nm ero m ayor que k.
I
2
3
l
2
3
l
0
3
00
2
8
0
2
A0[ i , ;']
3
5
CO
0
2
8
0
2
3
5
8
0
l
0
3
5
l
2
3
3
5
8
0
A,[i, j)
l
2
3
2
7
0
2
i
0
3
5
a 2(<. j]
Fig. 6.15.
2
8
0
2
I
0
3
00
3
5
8
0
Aj, j]
Algoritmo de Floyd.
www.FreeLibros.me
212
GRAFOS D IRIG ID OS
I m s-corto toma una m atriz de costos de arcos C de nx.n y produce una matriz A
de n x n de longitudes de caminos ms cortos y una m atriz P de n x n
que da un punto en la m itad de cada cam ino m s corto j
var
i.
j, k: integer;
begin
for i := 1 to n do
for j := 1 to n do begin
A [ i,j] C [ i,j] \
0
end;
for i ;= 1 to n do
A [ i , i ] ;= 0 ;
for k := 1 to n do
for i := 1 to n do
for j
1 to n do
if A[i, A:] + A[k, j] < A[i, j] then begin
A[i.j] > A[i, k] + A[k,j]\
P[i.j):=k
end
end; I ms_corto |
Fig. 6.17.
www.FreeLibros.me
213
Para im prim ir los vrtices interm edios del cam ino ms corto del vrtice i hasta
el vrtice y, se invoca el procedimiento cam ino(,j) dado en la figura 6.18. M ientras
que en una m atriz arbitraria P, camino puede iterar infinitam ente, si P viene del pro
cedim iento ms-corto, no es posible tener, por ejemplo, k en el cam ino m s corto
de / a y y tam bin tener y en el cam ino m s corto de i a k. Obsrvese cmo la supo
sicin de pesos no negativos es crucial otra vez.
procedure camino ( i, j: integer );
var
k: integer;
begin
k :-P [ i,j} \
f k 0 then
return;
camino(i, k)\
writeln(k)\
camino(k, j)
end; |camino |
Fig. 6.18.
Ejemplo 6.9.
figura 6.14.
1
2
3
0
0
2
3
0
0
0
1
0
P
Fig. 6.19.
Cerradura transitiva
En algunos problemas podra ser interesante saber slo si existe un cam ino de lon
gitud igual o mayor que uno que vaya desde el vrtice i al vrtice y. El algoritmo de
Floyd puede especializarse para este problema; el algoritmo resultante, que antece
de al de Floyd, se conoce como algoritmo de Warshall.
Supngase que la m atriz de costo C es slo la m atriz de adyacencia para el gra
fo dirigido dado. Esto es, C[i, y] = 1 si hay un arco de i a y, y 0 si no lo hay. Se desea
obtener la m atriz A tal que A [i,j] = 1 si hay un cam ino de longitud igual o mayor
que uno de i ay. y 0 en otro caso. A se conoce a m enudo como cerradura transitiva
de ia matriz de adyacencia.
Ejemplo 6.10. La figura 6.20 m uestra la cerradura transitiva para la m atriz de ad
yacencia del grafo dirigido de la figura 6.14.
www.FreeLibros.me
214
GRAFOS D IRIG ID OS
1
2
3
Fig. 6.20.
0
1
1
1
0
1
1
1
0
Cerradura transitiva.
o (Ak. , [/. k\ y A k. x [k j ])
Esta frmula establece que hay un cam ino de i a j que no pasa por un vrtice con
nmero m ayor que k si
1.
2.
ya existe un cam ino de i a j que no pasa por un vrtice con nm ero mayor que
k - 1, o si
hay un cam ino de i a k que no pasa por un vrtice con nm ero m ayor que A: - 1,
y un camino de k a j que no pasa por un vrtice con nm ero m ayor que k - 1.
Igual que antes, A k[i, k] - A k_ k ] y A k[k,j] = Ak_ ,[A:,y] , as que se puede rea
lizar el clculo con slo una copia de la m atriz A. El program a en Pascal resultante,
llamado Warshall por su descubridor, se m uestra en la figura 6.21.
procedure Warshall ( var A: array[l..n, l..n] of boolean;
C: array[l..n, 1..n] of boolean );
1 to n do
for j := 1 to n do
A [i,j] - C [i,j];
for k := 1 to n do
for i := 1 to n do
for j
1 to n do
if A [i,j\ - false then
A[i, ;] := A[i, k] and A[k, J\
end; f Warshall I
Fig. 6.21.
www.FreeLibros.me
mx
w en V
excentricidad
a
b
c
d
e
co
6
8
5
1
216
GRAFOS DIRIGIDOS
El tiempo de ejecucin de este proceso est dom inado por el primer paso, que lleva
un tiempo 0 (n 5). El paso (2) lleva 0{n2) y el paso (3) lleva 0(n).
Ejemplo 6.12. La matriz de costo CMCP para la figura 6.22 se muestra en la figu
ra 6.23. El valor mximo de cada columna se muestra a continuacin.
a
a
b
c
d
e
0
X
X
0
3
6
4
X
X
1
6
3
2
0
3
mx
Fig. 6.23.
6 .5
2
0
5
7
0
Para resolver con eficiencia muchos problemas relacionados con grafos dirigidos, es
necesario visitar los vrtices y los arcos de manera sistemtica. La bsqueda en pro
fundidad. una generalizacin del recorrido en orden previo de un rbol, es una tc
nica importante para lograrlo, y puede servir como estructura para construir otros
algoritmos eficientes. Las dos ltimas secciones de este capitulo contienen varios al
goritmos que usan esta bsqueda como base.
Supngase que se tiene un grafo dirigido G en el cual todos los vrtices estn mar
cados en principio como no visitados. La bsqueda en profundidad trabaja seleccio
nando un vrtice t' de G como vrtice de partida; v se marca como visitado. Des
pus, se recorre cada vrtice adyacente a V no visitado, usando recursivamente la
bsqueda en profundidad. Una vez que se han visitado todos los vrtices que se pue
den alcanzar desde v, la bsqueda de v est completa. Si algunos vrtices quedan sin
visitar, se selecciona alguno de ellos como nuevo vrtice de partida, y se repite este
proceso hasta que todos los vrtices de G se hayan visitado.
Esta tcnica se conoce como bsqueda en profundidad porque contina buscan
do en la direccin hacia adelante (ms profunda) mientras sea posible. Por ejemplo,
supngase que x es el vrtice visitado ms recientemente. La bsqueda en profun
didad selecciona algn arco no explorado x y que parta de x. Si se ha visitado y.
el procedimiento intenta continuar por otro arco que no se haya explorado y que par
ta de x. Si y no se ha visitado, entonces el procedimiento marca y como visitado e
inicia una nueva bsqueda a partir de j>. Despus de completar la bsqueda de to
dos los caminos que parten de y, la bsqueda regresa a x, el vrtice desde el cual se
visit y por primera vez. Se contina el proceso de seleccin de arcos sin explorar
que parten de x hasta que todos los arcos de x han sido explorados.
Puede usarse una lista de adyacencia L(v] para representar ios vrtices adyacen
tes al vrtice v. y un arreglo marca cuyos elementos son del tipo ( visitado. no-visi-
www.FreeLibros.me
lado), puede usarse para determinar si un vrtice ya fue visitado antes. El procedi
miento recursivo b p f se describe en la figura 6.24. Para usarlo en un grafo con n vr
tices. se asigna el valor inicial m arca a no-visitado, y despus se comienza la bs
queda en profundidad con cada vrtice que an permanezca sin visitar cuando lle
gue su tumo, con
for v
1 to n do
m a r c a [ v ] n o -v is ita d o -,
for v
1 lo n do
if marca[v\ - n o -visitado then
bpAv)
Obsrvese que la figura 6.24 es un modelo al cual se agregarn despus otras accio
nes, al aplicar la bsqueda en profundidad. Lo nico que hace el cdigo de la figura
6.24 es actualizar el arreglo marca.
m a r c a [ v \ v i s it a d o ;
for cada vrtice w en L{v] do
if marca[w] - no-visitado then
b p fw )
end; I b p f 1
Fig. 6.24.
Bsqueda en profundidad.
218
GRAFOS DIRIGIDOS
www.FreeLibros.me
Fig. 6.26.
219
Cmo distinguir entre los cuatro tipos de arcos? Es obvio que los arcos de rbol
son especiales, pues llevan a vrtices sin visitar durante la bsqueda en profundi
dad. Supngase que se numeran los vrtices de un grafo dirigido de acuerdo con el
orden en que se marcaron los visitados durante la bsqueda en profundidad. Esto
es, se puede asignar a un arreglo.
n m e ro p \v )c o n v ,
c o n t c o n t + 1;
despus de la lnea (1) de la figura 6.24. A esto se le llama numeracin en profundi
dad de un grafo dirigido; obsrvese que la numeracin en profundidad generaliza la
numeracin en orden previo introducida en la seccin 3.1.
La bsqueda en profundidad asigna a todos los descendientes de un vrtice v.
nmeros mayores o iguales al nm ero asignado a v. De hecho, *v es un des
cendiente de v si, y slo si, nmerop(v) < mimemp(w) < mmeropiv) + el nmero de
descendientes de v. Asi, los arcos de avance van de los vrtices de baja numeracin
a los de alta numeracin y los arcos de retroceso van de los vrtices de alta nume
racin a los de baja numeracin.
Todos los arcos cruzados van de los vrtices de alta numeracin a los de baja nu
meracin. Para ver esto, supngase que x y e s un arco y nmerop(x) < nmeropiy).
As, x se visita antes que y. Todo vrtice visitado entre su invocacin por primera
vez a bpj{x) y el momento en que b p fx ) termina, se convierte en descendiente de x
en el bosque abarcador en profundidad. Si .v permanece sin visitar cuando se
explora el arco x y. x y se vuelve un arco de rbol. De otra forma, x - * y
es un arco de avance. Asi, x y no puede ser un arco cruzado con nmeropix) <
< nmeropiy).
En las dos secciones siguientes se analiza la forma de usar la bsqueda en pro
fundidad para la solucin de varios problemas de grafos.
6 .6
Un grafo dirigido aciclico, o gda, es un grafo dirigido sin ciclos. Cuantificados en fun
cin de las relaciones que representan, los gda son ms generales que los rboles.
www.FreeLibros.me
220
GRAFOS DIRIGIDOS
pero menos que los grafos dirigidos arbitrarios. La figura 6.27 muestra un ejemplo
de un rbol, un gda, y un grafo dirigido con un ciclo.
Fig. 6.27.
Entre otras cosas, los gda son tiles para la representacin de la estructura sin
tctica de expresiones aritm ticas con subexpresiones comunes. Por ejemplo, la fi
gura 6.28 m uestra un gda para la expresin
((a + b)*c + ((a + b)+e)*(e +
+ b)*c)
Dos ejemplos naturales de rdenes parciales son la relacin m enor que ( < ) en
enteros, y la relacin de inclusin propia en conjuntos ( O Ejemplo 6.14. Sea S - |l , 2, 3| y sea P{S) el conjunto exponencial de 5. esto es. el
conjunto de todos los subconjuntos de S. f \ S ) = | 0 , !l|, |2|, |3|, |l , 2|, l, 3|, |2, 3!,
i 1, 2. 3). C es un orden parcial en P(S). Ciertamente, A C A es falso para cualquier
conjunto A (irrcflexividad), y A Q B y B Q C , entonces A C C (transilividad).
Los gda pueden usarse para reflejar grficamente rdenes parciales. Para empezar,
se puede considerar una relacin R como un conjunto de pares (arcos) tales que (a, b)
est en el conjunto si, y slo si, a R b es cierto. Si R es un orden parcial en el con
junto S, entonces el grafo dirigido G - (S . R) es un gda. Del mismo modo, supn
gase que G - (S, R) es un gda y R ' es la relacin definida por a R ' b si, y slo si, exis
te un cam ino de longitud uno o ms que va de a a fe (/?* es la cerradura transitiva de
la relacin R.) Entonces. R es un orden parcial en S.
www.FreeLibros.me
Fig. 6.28.
221
Ejemplo 6.15. La figura 6.29 muestra un gda (P{S). R), donde S - i l . 2 , 31. La re
lacin R es la inclusin propia en el conjunto exponencial P(5).
>.2.3V
{ 1.2
Fig. 6.29.
Prueba de aciciiddad
Se tiene un grafo dirigido G - (V. .-1), para determ inar si G es acclico, esto es. si G
no contiene ciclos. La bsqueda en profundidad puede usarse para responder a esta
pregunta. Si se encuentra un arco de retroceso durante la bsqueda en profundidad
de G. el grafo tiene un ciclo. Si, al contrario, un grafo dirigido tiene un ciclo, enton
ces siempre habr un arco de retroceso en la bsqueda en profundidad del grafo.
Para ver este hecho, supngase que G es cclico. Si se efecta una bsqueda
en profundidad en G. habr un vrtice v que tenga el nm ero de bsqueda en pro
fundidad m enor en un ciclo. Considrese un arco u -* v en algn ciclo que contenga
www.FreeLibros.me
222
GRAFOS DIRIGIDOS
F ig. 6.30.
C la s ific a c i n to p o l g ic a
Fig. 6.31.
G d a d e p re rre q u isito s.
www.FreeLibros.me
visitado ;
for cada vnice w en L[v] do
if marca[w) - no-visitado then
clasificacin-topolgica! w);
marca[v]
writeln(v)
end; \clasificacin-topolgica\
6 .7
Componentes fuertes
Un componente fuertemente conexo de un grafo dirigido es un conjunto maximal de vrtices en el cual existe un camino que va desde cualquier vrtice del con
junto hasta cualquier otro vrtice tambin del conjunto. La bsqueda en profundi
dad puede usarse para determinar con eficiencia los componentes fuertemente co
nexos de un grafo dirigido.
Sea G - (V, A ) un grafo dirigido; se puede dividir V en clases de equivalencia V
I < i < r, tales que los vrtices v y w s o n equivalentes si. y slo si, existe un camino
de v a w y otro de w a v. Sea An 1 < i < r, el conjunto de los arcos con cabeza y
cola en V,. Los grafos G, - ( V,, Awww.FreeLibros.me
t) se denominan com ponentes fuertem ente conexos
t n ciM n m m n n n p n l p * fiip ritx A p <7 I n o r a f n r t ir i o i r f n r n n M n n n c n m m n i 'n l / ' f i ip r t p
Ejem plo 6.17. La figura 6.32 ilustra un grafo dirigido con los dos componentes fuer
tes mostrados en la figura 6.33.
Fig. 6.33.
Obsrvese que todo vrtice de un grafo dirigido G est en algn componente fuer
te, pero que ciertos arcos pueden no estarlo. Tales arcos, llamados arcos de cruce de
com ponentes, van de un vrtice de un componente a un vrtice de otro. Se pueden
representar las interconexiones entre los componentes construyendo un grafo redu
cido de G. cuyos vrtices son los componentes fuertemente conexos de G. Hay un
arco de un vrtice C a un vrtice diferente C 'de este tipo de grafos, si existe un arco
en G que vaya de algn vrtice del componente C a algn otro del componente C'.
El grafo reducido siempre es un gda, porque si existiera algn ciclo, todos los com
ponentes del ciclo seran en realidad un solo componente fuerte, lo cual significara
que no se calcularon en forma adecuada los componentes fuertes. La figura 6.34
muestra el grafo reducido del grafo dirigido de la figura 6.32.
O
www.FreeLibros.me
COMPONENTES FUERTES
225
2.
3.
4.
Ejemplo 6.18. Se aplica este algoritmo al grafo dirigido de la figura 6.32. partiendo
de a y continuando primero hasta b. Despus del paso (I) se numeran los vrtices
como se muestra en la figura 6.35. Al invertir la direccin de los arcos, se obtiene
el grafo G, de la figura 6.36.
Cuando se realiza la bsqueda en profundidad en Gr surge el bosque abar
cador en profundidad de la figura 6.37. Se comienza con a como raz, porque a tiene
el nmero ms alto. Desde a slo se alcanza c y despus b. El siguiente rbol tiene
raz d, ya que es el siguiente (y nico) vrtice restante con numeracin ms alta.
Cada rbol del bosque forma un componente fuertemente conexo del grafo dirigido
original.
Se ha pretendido que los vrtices de un componente fuertemente conexo se
correspondan con los vrtices de un rbol del bosque abarcador de la segunda bs
queda en profundidad. Para ver por qu. obsrvese que si v y w son vrtices del mis
mo componente fuertemente conexo, existen caminos en G desde v hasta h' y desde
w hasta v. As, existen tambin caminos desde v hasta w y desde w hasta v en Gr
Supngase que en la bsqueda en profundidad de G, se inicia la bsqueda en al
guna raz x y se llega hasta v o w. Como v y w se alcanzan uno al otro, ambos ter
minarn formando parte del rbol abarcador con raz x.
4
3
I
Fig. 6.35.
www.FreeLibros.me
226
GRAFOS DIRIGIDOS
Fig. 6.36.
G,.
Fig. 6.37.
Ejercicios
6.1
www.FreeLibros.me
EJERCICIOS
227
6.2
6.3
6.4
6.5
*6.6
**6.7
Mustrese que el programa Floyd funciona si alguno de los arcos, pero nin
gn ciclo, tienen costo negativo.
6.8
www.FreeLibros.me
228
GRAFOS DIRIGIDOS
*6.9
6.10
Una raz de un gda es un vrtice r tal que todo vrtice del gda puede al
canzarse por un camino dirigido desde r. Escrbase un programa para de
term inar si un gda posee raz.
*6.11
6.12
6.13
6.14
6.15
*6.16
6.17
*6.20
*6.21
www.FreeLibros.me
NOTAS BIBLIOGRAFICAS
229
*6.22
*6.23
G' = (V, A ') se conoce como el grafo dirigido equivalente m inim al de un gra
fo dirigido G = (V, .-1), si A 'es el subconjunto ms pequeo de A y la cerradura
transitiva de G y G' es el mismo. Demustrese que si G es aciclico, slo hay
un grafo dirigido equivalente minimal, es decir, la reduccin transitiva.
Notas bibliogrficas
Bcrge [1985] y Harary [1969] son dos buenas fuentes de material suplementario so
bre teora de grafos. Algunos libros que tratan algoritmos sobre grafos son Deo
[1975], Even [1980] y Tarjan [ 1983].
El algoritmo para caminos ms cortos con un solo origen de la seccin 6.3 se
debe a Dijkstra [1959], El algoritmo de los caminos ms cortos entre todos los pares
es de Floyd [ 1962] y el de cerradura transitiva es de Warshall [ 1962], Johnson [ 1977]
analiza algoritmos eficientes para encontrar caminos ms cortos en grafos dispersos.
ICnuth [1968] contiene m aterial adicional sobre clasificacin topolgica.
El algoritmo de componentes fuertes de la seccin 6.7 es similar al sugerido por
R. Kosaraju en 1978 (sin publicar), y al publicado por Sharir [1981]. Tarjan [1972]
contiene otro algoritmo de componentes fuertes que slo necesita un recorrido con
bsqueda en profundidad.
Coffman [ 1976] contiene muchos ejemplos de cmo se pueden usar los grafos di
rigidos para los problemas de modelado de horarios, como en el ejercicio 6.2. Aho,
Garey y Ullman [1972] muestran que la reduccin transitiva de un gda es nica, y
que el clculo de la reduccin transitiva de un grafo dirigido es, computacionalmente, equivalente al clculo de la cerradura transitiva (Ejercicios 6.21 y 6.22). La obtencin
del grafo dirigido equivalente minimal (Ejercicios 6.23 y 6.24), por otro lado, parece
ser mucho ms difcil desde el punto de vista computacional; este problema es NPcompleto [Sahni (1974)].
www.FreeLibros.me
Grafos no dirigidos
7 .1
Definiciones
Fig. 7.1.
de
sus subgrafos.
Fig. 7.2.
Grafo no conexo.
Mtodos de representacin
Los mtodos de representacin de grafos dingidos se pueden emplear tambin para
representar los no dingidos. Una arista no dingida entre v y w se representa simple
mente con dos aristas dirigidas, una de v a >v, y otra de w a v.
Ejem plo 7.3. Las representaciones con matriz y lista de adyacencia para el grafo de
la figura 7. l(a) se muestran en la figura 7.3.
a
a
b
c
d
0
1
0
1
0
1
0
1
1
1
1
0
l
1
a
h
0
(b)
Fig. 7.3.
7 .2
Lista de adyacencia
Representaciones.
www.FreeLibros.me
Algoritmo de Prlm
Existen dos tcnicas populares que explotan la propiedad AAM para construir un r
bol abarcador de costo mnimo a partir de un grafo ponderado G = (V. A); una
de ellas se conoce como algoritmo de Prim. Supngase que V - |l, 2 ,..., n). El algo
ritmo de Prm comienza cuando se asigna a un conjunto U un valor inicial lll, en
el cual crece un rbol abarcador, arista por arista. En cada paso localiza la aris
ta ms corta (, i-) que conecta U y V - U, y despus agrega v, el vrtice en V - U , a
U. Este paso se repite hasta que www.FreeLibros.me
U - V El algoritmo se resume en la figura 7.6, y la
semenria de aristas apresadas a T nara el srafo de la fieura 7.4fai se muestra en la
:~
0;
ill;
while U jt V do begin
sea (u. v) una arista de costo mnimo tal que u est en U y
ven V - V,
T : - T J l(u. v)|;
V V U |v|
end
end; I Prim I
U
Fig. 7.6.
www.FreeLibros.me
( 1)
(2)
(3)
(4)
(5)
(6 )
begin
for i
2 to n do begin
i asigna valor inicial al conjunto i ' slo con el vrtice I I
M E N O R -C O STO [i] := q 1. /];
M A S -C E R C A N O [ i] 1
end.
for i
2 to n do begin
i encuentra el vrtice k fuera de U ms cercano a algn vrtice
en U !
m i n M E O R -C O S I 0[2],
k ;= 2 ;
www.FreeLibros.me
(9)
(1 0 )
end;
(11)
( 1 2)
( 1 3)
(14)
(15)
(16)
end
end
end; i Prim !
Fig. 7.8.
Algoritmo de Prim.
Algoritmo de Kruskal
Supngase de nuevo que se tiene un grafo conexo G = ( V, .4). con I' - 1, 2
n( y
una funcin de costo c definida en las aristas de A. Otra forma de construir un rbol
abarcador de costo mnimo para 6" es empezar con un grafo T = ( o ) constitui
do slo por los vrtices de G y sin aristas. Por tanto, cada vrtice es un componente
conexo por s mismo. Conforme el algoritmo avanza, habr siempre una coleccin
de componentes conexos, y para cada componente se seleccionarn las aristas que
formen un rbol abarcador.
Para construir componentes cada vez mayores, se examinan las aristas a partir
de A, en orden creciente de acuerdo con el costo. Si la arista conecta dos vrtices
que se encuentran en dos componentes conexos distintos, entonces se agrega la aris
ta T. Se descartar la arista si conecta dos vrtices contenidos en el mismo compo
nente. ya que puede provocar un ciclo si se la aadiera al rbol abarcador para ese
componente conexo. Cuando todos los vrtices estn en un solo componente. T es
un rbol abarcador de costo mnimo para G
Ejemplo 7.5. Considrese el grafo ponderado de la figura 7.4(a). La secuencia de
aristas agregadas a 7" se muestra en la figura 7.9. Las aristas de costo 1, 2, 3 y 4 se
consideran primero, y todas son aceptadas, ya que ninguna de ellas causa un ciclo.
Las aristas (1, 4) y (3, 4) de costo 5 no pueden aceptarse, porque conectan vrtices
que estn dentro del mismo componente en la figura 7.9(d) y, por tanto, pueden com
pletar un ciclo. Sin embargo, la arista restante de costo 5, o sea (2, 3), no crea ciclos.
Una vez que se acepta, el proceso termina.
Es posible aplicar este algoritmo mediante los conjuntos y sus operaciones aso
ciadas de los captulos 4 y 5. Primero se necesita un conjunto formado por las aris
tas de A. Al conjunto se le aplica en forma repetida el operador S U P R IM E -M IN
para seleccionar aristas en ordenwww.FreeLibros.me
creciente de acuerdo con el costo. El conjunto de
(a)
Fig. 7.9.
t O b s r v e s e q u e C O M B IN A y E N C U E N T R A s o n lig e r a m e n te d i s t i n t a s a la s d e f in ic io n e s d e la s e c
A y B.
a e le m e n to s e n u n tie m p o (Xa),
c i n 5 .5 , y a q u e C e s u n p a r m e t r o q u e i n d i c a d n d e se p u e d e n e n c o n t r a r
tt
S e p u e d e a s ig n a r v a lo r in ic ia l a u n r b o l p a r c ia lm e n t e o r d e n a d o d e
si s e h a c e t o d o d e u n a v e z . E s ta t c n ic awww.FreeLibros.me
se a n a l iz a e n la s e c c i n 8 .4 , a u n q u e ta l v e z se d e b e r a u tiliz a r a q u .
arista de menor costo en aristas lleva un tiempo <9(loga). As, las operaciones en la
cola de prioridad llevan un tiempo Ofaloga) en el peor caso. El tiempo total reque
rido para realizar las operaciones COMBINA y ENCUENTRA depende del mtodo
usado para implantar el CONJUNTO_CE. Como se muestra en la seccin 5.5, hay
mtodos 0(aloga) y 0(aa(a)). En cualquiera de los casos, c! algoritmo de Kruskai se
puede implantar para que se ejecute en tiempo CHaloga).
7 .3
Recorridos
p ro ced u re K ruskai
var
ANULA(T);
ANULA(aras);
c o m p s i g u i e n t e 0;
com pon
nmero de miembros de V\
fo r v en V d o begin I asigna valor inicial a un componente
para que contenga un vrtice de V !
c o m p sig u ie n te ;- c o m p sig u ie n te + 1 ;
W lC lA U c o m p s ig u ie n te , v, componentes)
end;
f comp-U
end
end
end; f K ruskal I
Fig.
7.10.
Algoritmo de Kruskal.
Bsqueda en profundidad
Recurdese de la seccin 6.5 el algoritmo b p f para bsquedas en grafos dirigidos. El
mismo algoritmo puede emplearse para bsqueda en grafos no dirigidos, puesto que
la arista no dirigida (v, w) puede considerarse como el par de aristas dirigidas v w
y w v.
De hecho, los bosques abarcadores en profundidad, construidos para grafos no
dirigidos, son ms simples que para los dirigidos. Primero, se debe observar que
cada rbol del bosque es un componente conexo del grafo, y que si el grafo fuera co
nexo, tendra slo un rbol en su bosque. Segundo, para grafos dirigidos se identi
fican cuatro clases de arcos: de rbol, de avance, de retroceso y cruzado. Para grafos
no dirigidos slo hay dos clases: aristas de rbol y de retroceso.
Dado que en grafos no dirigidos no existe distincin entre las aristas de retroce
so y las de avance, se denominarn arcos d e retroceso. En un grafo no dirigido no
existen las aristas cruzadas, esto es, aristas (v. w) donde v no es antecesor ni descen
diente de w en el rbol abarcador. Supngase que las hubiera; entonces, sea v un
vrtice alcanzado antes que w en la bsqueda. La llamada a bpj{v) no puede termi
nar hasta haber buscado w, as que w se introduce en el rbol como descendiente de
v. De modo semejante, si bpfiw) se llama antes que bpftv), v se convierte en descen
diente de w.
Como resultado, durante una bsqueda en profundidad en un grafo no dirigi
do G. todas las aristas pueden ser,
1.
aristas de rbol, aquellas aristas (v. w) tales que bpf[v) llama directamente a bpfiw)
o viceversa, o bien
2 . aristas de retroceso, aquellas aristas (v. w) tales que ni b p f v ) ni bpfi.w) se llaman
directamente, pero una llam indirectamente a la otra (es decir, bpflw) llama a
bpj[x). que llama a bpfty), de modo que w es antecesor de v).
superior, y los hijos de cada vrtice, en el orden de izquierda a derecha en que fue
ron visitados por el procedimiento b p f
Para seguir unos cuantos pasos de la bsqueda, el procedimiento b p f a ) llama a
bpfijf) y aade la arista (n. b) a T, ya que b no ha sido visitado. En h, b p f llama a
b p f d ) y agrega la arista (b. d) a T. En d, b p f llama a b p f e) y aade la arista (d . e) a
T. En e, los vrtices a, b y d ya estn marcados como visitados, de modo que bpfie)
regresa sin incorporar ninguna ansia a T. En d , p/encuentra los vrtices a y b mar
cados como visitados, as que bpfid) regresa tambin sin agregar ms aristas a T. En
b, b p f encuentra los vrtices adyacentes restantes a y e marcados como visitados, asi
que b pf b ) regresa. La bsqueda contina despus con c. f y g.
Fig. 7.11.
Bsqueda en amplitud
Otra forma sistemtica de visitar los vrtices se conoce como bsqueda en am plitud.
Este enfoque se denomina en amplitud porque desde cada vrtice v que se visita
se busca en forma tan amplia como sea posible, visitando todos los vrtices adya
centes a v. Esta estrategia de bsqueda tambin se puede aplicar a grafos dirigidos.
Igual que en la bsqueda en profundidad, al realizar una bsqueda en amplitud
se puede construir un bosque abarcador. En este caso, se considera la arista (.*, y)
como una arista de rbol si el vrtice y es el que se visit primero partiendo del vr
tice x del ciclo interno del procedimiento de bsqueda bea de la figura 7.12.
Resulta que para la bsqueda en amplitud en un grafo no dirigido, toda arista
que no es de rbol es una arista cruzada; esto es, conecta dos vrtices ninguno de
los cuales es antecesor del otro.
El algoritmo de bsqueda en amplitud de la figura 7.12 inserta las aristas de r
bol en un conjunto T, que se supone inicialmente vaco. Se presume que cada en
www.FreeLibros.me
trada en el arreglo m arca tiene asignado
el valor inicial no-visitado ; la figura 7.12
marcar cada vrtice como visitado antes de meterlo en la cola, y as evitar que se
coloque en la cola ms de una vez.
Ejemplo 7.7. El rbol abarcador en amplitud del grafo G de la figura 7 .11(a) se
muestra en la figura 7.13. Se supone que la bsqueda empieza en el vrtice a. Como
antes, las aristas de rbol se muestran con lneas de trazo continuo y las otras con
lneas de puntos. Tambin se ha dibujado la raz del rbol en la parte superior, y los
hijos, de izquierda a derecha, de acuerdo con el orden en que fueron visitados.
visitado;
PONE_EN_COLA(>-, Q ;
INSERTAR, y), T)
end
end
end; I bea 1
Fig. 7.12.
Bsqueda en amplitud.
www.FreeLibros.me
Fig. 7.14.
7 .4
minar cualquier otro vrtice del grafo de la figura 7.1 l(a), el componente conexo no
se dividir. A un grafo sin puntos de articulacin se le llama biconexo. La bsqueda
en profundidad es muy til para encontrar los componentes biconexos de un grafo.
El problema de encontrar los puntos de articulacin es el ms simple de muchos
problemas importantes relacionados con la conectividad de grafos. Como ejemplo
de las aplicaciones de los algoritmos de conectividad, se puede presentar una red de
comunicaciones como un grafo en el que los vrtices son lugares que hay que man
tener comunicados entre si. Un grafo tiene conectividad k si la eliminacin de ir - 1
vrtices cualesquiera no lo desconecta. Por ejemplo, un grafo tiene conectividad dos
o ms si, y slo si, no tiene puntos de articulacin, es decir, si, y slo si, es biconexo.
Cuanto mayor sea su conectividad. tanto ms fcil ser que sobreviva al fallo de al
guno de sus vrtices, sea por fallo de las unidades de procesamiento colocadas en
los vrtices o por motivos externos.
Ahora se presenta un algoritmo simple de bsqueda en profundidad para encon
trar todos los puntos de articulacin de un grafo, y probar por medio de su ausen
cia, si el grafo es biconexo.
1.
2.
3.
num ere
nm ero-bp [c] - 5
bajo [c] - 5
nm ero-bp [6 ] - 2
f l/o ( ] -
nm ero-bp [d\ - 3
nm ero-bp [_/] 6
bajo [/] - 5
>a;o (fj - 1
nm ero-bp (?) - 4
bajo (?) - I
Fig. 7.15.
. > .
h - m lix i
ju -
7 .5
Pareamiento de grafos
z i.l
i .j u i : r n v i
t i i n ' u , i i b f. 1 z u .v 'i i.
. f . r r v m - n/.n i : o i . : . ; I l ; iu
iv
Esto se representa con un grafo como el de la figura 7.16, donde los vrtices es
tn divididos en dos conjuntos V , y V2, de modo que los vrtices del conjunto V]
representan a los profesores, y los vrtices en V2, los cursos. Que el profesor v sea
adecuado para impartir el curso w se representa con una arista (y. w). Un grafo como
ste, cuyos vrtices se pueden dividir en dos grupos disjuntos y las aristas presentan
un extremo en cada grupo, se conoce como bipartido. Asignar un profesor a un cur
so es equivalente a seleccionar una arista entre un vrtice profesor y un vrtice curso.
Fig. 7.16.
Grafo bipartido.
(a)
(b)
Fig. 7.17.
Pareamiento
8
Camino aumentado
Iniciar con C = 0 .
Encontrar un camino aumentad 4 ;refcativor.a C y reemplazar C por C A.
Repetir el paso (2) hasta que ya no existan ms caminos aumentados, punto en
el que C es u npareamientoTnaximal.
________
' rrafh
o n rtm n W e C irro o m in v
r c a m f5??lR;?
. n o
(o ,
7 . 10 . fr q M B 5 a w m m m 13 f l * u r a
7.17(a) relativo al preamiento de la figura 7.18, en la cual se ha escogido 5 como el
vrtice sin pareamiento en el nivel 0. En el nivel 1 se agrega la arista sin pareamienlo (5, 6 ). En el nivel 2 se agrega la arista de pareamiento (6 , 2). En el nivel 3 se pue
de agregar cualquiera de las aristas sin pareamiento (2, 9) o (2, 10). Dado que los vr
tices 9 y 10 estn.actualmente Sm pareamiento,
puede terminar la construccin
del grafo de camin aumentados despus de incorporar cualquiera de esos vrtices.
Los caminos 9; 2, 6 . 5 y 10, 2, 6 , 5 son caminos aumentados relativos al pareamien
to de la figura 7.18.
E je m p lo
V *s
1=
i ) o b i g i iiD o u
o /o n o j o b n g
t-."
n u
-- - 0
7 0 ,b i . ' j
^ a fo s d e ca-
minos aumentados para un pareamiento dadpnJJ^Y^ft,^<-/ftP8 P ifl) s> sc represenv w k M - M m w M t y * 00 aumentado nuevo lleva un tiempo (J(a).
maximal, sc
construyen hasta ni 2 caminos aumentados, y que' cada unoaumenta por lo menos
en una riste el fcareamieiit aciaaioFor tatu; puede encontrateeniri pareafhcnto
raaiwnal ew on tiempo wai)Jpara un grafo bipbrdo (Jf ounob nku- i /
.'1 no Eionoavruivj ob rtbabi r,nu -o A oup
w - fa w n m
d .
- u'htfiWh^}.G
n a a n s ia u . /)[i
/i a
p a rec e 'en
l Sta uasa ,,d
ue a
a u vdt. ^ d . ^ # .^. .1m
. . . e. . t . , y } :
io n nuglG o n o n n o o v jti
n
?
C
m o se
www.FreeLibros.me
7.3
7.4
Un
Un
Un
Un
rbol
rbol
rbol
rbol
abarcador de
abarcador de
abarcador en
abarcador en
*7.5
Sea G - (V, A ) un grafo, y R una relacin en V tal que u R v si, y slo si, u
y v estn dentro de un ciclo comn (no necesariamente simple). Prubese
que R es una relacin de equivalencia en V.
7.6
7.7
7.8
7.9
-7 I A
rtrara
nua
lop
' i r i r t n e / a u n o
<in a m n l i t n H
fAn
Ha 4p Ka 1
7.11
*7.12
Sea G - ( V, A) un grafo completo, esto es. un grafo en el cual existe una aris
ta entre todo par de vrtices distintos. Sea G ' - (V. A") un grafo dirigido en
el cual A' es A que da a cada arista una orientacin arbitraria. Mustrese
que G' tiene un camino dingido que incluye todos los vrtices exactamente
una vez.
**7.13
7.16
*7.17
Prubese que un grafo es bipartido si, y slo si, no tiene ciclos de longitud
impar. Dse un ejemplo de un grafo no bipartido para el cual la tcnica del
grafo de caminos aumentados no funcione.
7.18
Notas bibliogrficas
Los mtodos para construccin de rboles abarcadores minimalcs se han estudiado
por lo menos desde Boruvka [ 1926], Los dos algoritmos dados en este captulo estn
basados en Kruskal [1956] y Prim [1957], Johnson [1975] muestra cmo los rboles
Je-arios parcialmente ordenados se pueden usar para realizar el algoritmo de Prim.
Cheriton y Tarjan [1978] y Yao [1975] presentan algoritmos CMog log/r) para r
boles abarcadores. Tarjan [1981] presenta una historia y perspectiva completas de
los algoritmos para rboles abarcadores.
Hopcroft y Tarjan [1973] y Tarjan [1972] popularizaron el uso de la bsqueda
en profundidad en algoritmos para grafos. De ah procede el algoritmo para compo
nentes biconexos.
El pareamiento de grafos lo estudi Hall [1948], y los caminos aumentados, Berge [1957] y Edmonds [1965]. Hopcroft y Karp [1973] dan un algoritmo 0 (n 2 >) para
pareamientos maximales en grafos
bipartidos, y Micali y Vazirani [1980] dan un alwww.FreeLibros.me
o n ritm n
I ? .
2 / 0 H A5i i MI 1JH 1H / A l t ) /
[2 5 2 1
sm
i.r
jj
ig -'Jk
Iv flv lw l I
,
El proceso de clasificacin u ordenam iento de uria lista de objetos de acuerdo con
:dgtftrdHlfift'l?b'd}t6f^ i ) i r ^ ^ffifeHi';1sHkiPftHMyMliy sr feklia con tan
ta frecuencia, que justifica una revisin cuidadosa del tena: clasificacin se diAndic:odsos:panm;timerna y externa/taclasificatitt'incem aie produce en'Iam e^efM JW PSU tfJ dqi totnputadpfs dqpde ^pqsjbJp p ^ y t^ b a r la,,c*flacidad del ac
ceso aleatorio en distintas formas. Lai^sjfgfiqj^nj^xferna s|nepe$arif cuando el n
mero de objetos a ordenar es dem asiado grande,para .caber en la memoria principal,
ta. v 5 s o v n sisi ono 2m onaTirjuuii.omrnBj 5 2-?>. r?
fo , .
En,ese,caso, el em botellam iento suele,ser la transferencia de datos,entre el almai I. i >?ouoln3. KT-'Tj b 07116131 obBfiTornui q u ru o na v> t.
.
cenam iento principal y el secundario, y es imprescindible tnpver grandes bloques de
datos para lograr m ayor eficiencia. El hecho de que sea m s conveniente mover en
^Uh'SkJ boqb,lo'lStfosf8rt&jhnte Cht%i5osrr,trihge. S clteS''d alntm s de
tteifiCaeiri biter^f'pSibfi.' LdffcWrifiiiidh kriia^Sttcbrif^neHSbtulo 11.
o n o b m il or a o b s in a in u s /o n /m so ob
Ibiji
-1
81.V
n '-n w i *
b t - ovil
www.FreeLibros.me
253
zar cualquier tipo de clave para la cual estn definidas las relaciones m enor o igual
que o m enor que.
El problema de la clasificacin consiste en ordenar una secuencia de registros de
tal forma que los valores de sus claves formen una secuencia no decreciente. Esto
es, dados los registros r,, r2,
r, con valores de clave k, k 2, ..., kn, respectivam en
te, debe resultar la misma secuencia de registros en orden r(i, r(, ..., rv tal que kt <
< k, < ... < k . No es necesario que todos los registros tengan valores distintos,
ni que los registros con claves iguales aparezcan en un orden particular.
Se emplearn varios criterios para evaluar el tiem po de ejecucin de un algorit
mo de clasificacin interna. La prim era m edicin, y tam bin la ms comn, es el n
mero de pasos requeridos por el algoritmo para clasificar n registros. O tra medicin
frecuente es el nm ero de comparaciones entre claves que debe efectuarse para cla
sificar n registros; esto resulta muy til cuando la comparacin entre un par de cla
ves es una operacin relativamente costosa, com o sucede cuando las claves son gran
des cadenas de caracteres. Si el tam ao del registro es grande, puede ser tam bin con
veniente contar las veces que debe moverse. La aplicacin manual hace evidente la
medida del costo apropiada.
8 .2
Tal vez uno de los m todos de clasificacin m s simples que pueda haber es un al
goritmo llamado clasificacin de burbuja (bubblesort). La idea bsica de la clasi
ficacin de burbuja es im aginar que los registros a ordenar estn alm acenados en
un arreglo vertical. Los registros con claves m enores son ligeros y suben. Se re
corre varias veces el arreglo de abajo hacia arriba, y al hacer esto, si hay dos elemen
tos adyacentes que no estn en orden, esto es, si el ms ligero est abajo, se in
vierten. El efecto producido por esta operacin es que en el prim er recorrido, el re
gistro ms ligero de todos, es decir, el registro que posee la clave con m enor valor,
sube hasta la superficie (o parte superior del arreglo). En el segundo Recorrido, la
segunda clave m enor sube hasta la segunda posicin, y as sucesivamente. En este
recorrido no es necesario subir hasta la posicin uno, porque ya se sabe que la clave
m enor se encuentra ah. En general, elrqcprrido / no intentp pasar ms all de la po
sicin i. Se presenta el esbozo del algoritmo en la figura 8. , con el supuesto de que
el arreglo A es un array[l../i] of tipo_registro, y n es el nm ero de registros. Aqu y
en el resto del captulo se supondr que un cam po llam ado clave contiene el valor
. M
A M
^ W 1"
-(if1
fe
'
t u * , 1 fi:ud;,u * ur ,*,
i - 'f W h-V do " ;
'.doWiitV^r o
tbfeii ;
6
-l< h -tfqriKj
iJuOl
i^ iii h riu i.
uruuo
ib
wi r n L 1
! - !! ';[**
i ' *
'
30 " a-': **7 :,(>'
;
; ?'** ' niJ
' ;n
www.FreeLibros.me
254
CLASIFICACION
temp: tipo_registro;
begin
temp: - x\
x :-y ,
ytemp
end; I intercambia I
Fig. 8 .2 .
El procedimiento intercambia.
Ejemplo 8.1. La figura 8.3 muestra una lista de volcanes famosos, y el ao en que
hicieron erupcin.
NOMBRE
Pele
Etna
Krakatoa
Agung
Vesubio
Santa Elena
F ig . 8 .3 .
AO
1902
1669
1883
1963
79
1980
Volcanes famosos.
www.FreeLibros.me
255
inicial
despus
de / - 2
Agung
Agung
Agung
Etna
Etna
Etna
Krakatoa
Krakatoa
Krakatoa
Pele
Pele
Pele
Santa Elena Santa Elena Santa Elena
Vesubio
Vesubio
Vesubio
despus
de i-3
despus
de =4
despus
de /=5
F ig. 8 .4 .
(5)
(6)
< 4 [0 ].c /a v e -c o ;
for i
2 to n do begin
j
/;
while A \j\ < A \j- \) do begin
intercambia[A\j), A \j - 1]);
j:-j- 1
end
end
Fig. 8.5.
www.FreeLibros.me
256
c l a s if ic a c i n
-co
-co
-co
Etna
Agun^
Agung
Krakatoa
E tn a .
Etna, .
Pele
1
KiraJc^a
Kraicaio
Agung
Pele' 11
Peler 1 J '
Vesubio
V esu ^ p q?.jb V esu^o
Santa Elena, Santa Elena > Santa Iplna;
despus o ab
de 1-2
de /=3
Fig. 8.6.
dg>*t&
de i=4
de i=5
-co
Agung
Etna
Krakat
Pele
Santa ^
Vesubio
despus
de i - 6
Recorridos de la clasificaci6|lp6y1ffStriWi.rC,js:>''iar.!3
srtdrt-'f tM tpqUehreJfl/K
intercrrbiafl
U n program a itrs completo se m aestra' n^IaTlgt''8. ^
n n *a:figura;8 .$ .* f lw ? tr n M
l?,cMsif*cactnip?ff.$?leccin, do:Ja,-|ista.^.la
4lWWfc,Ypfe>rde
ndice_menor es 4, la posicin de Agung, que se intercambia con Vesubio en [1],
Las lneas de la figura 8.8 indican el punto sobre el cual.se sa b e ^ u e ,!^ elenwijtos menores aparecen clasificados. Despus de n - \ r^ ^ j^ i^ g s^ ^ re g is trc j^ ln ], Ve
subio en la figura 8.8, est tambin en el lugar correcto, ya que es el ^em ento gqe
se sabe que no est entre los n- 1 ms peqtyfjtaf.
www.FreeLibros.me
$5?
var
clave-m nor:\Y pitL c\\t\ fia 1clave m enor rtcntrda rtfdlrrtententr
begih
for1'P M to n-4 do bgh
(I f
(2)
(3)
i o r j : - i ,'*> : t i t o n d o
p ty
e l:
($
()
(7)
(.8)
end;
interaambi4A[]\>'Aiidtcc*jntr,or}y,
ca
end;
Flfl.^8.7., Clasificacin p o r seleccin
Pele
Agung
Etna
E tna
Krakatoa
Krakatoa
Aung
Pele
Vesubio
Vesubio
Santa Elena Santa Elena
Agung
Etna
Krakatoa
P e t ?
Vesubio
Santa Elena
Agung
Etna . : f i y
Krakatoa
Pele ' ' " 0 !'
Vesubio
Santa Elena
inicial
despus
de 1 -2
despus
de i - 3
despus
de /-1
Fig. 8 8.
Agung
Eirta - " V
l^rakatoa
Agung
EtniT
Krakatpa
19JJ
RecorridOB d e lS'Clasifidaoin
'5 L . - n l
o : **f
1
1
I H > ~ c2n}ib(ci --^C })n '
e l v i. ? ji .<; :.
o i i .v j f K
pasos, donde el trm ino c}n tiene en cuenta los incrementos y pruebas d e i: Com o
la-lma frmula no fcxcede (2/2 + Cj)>i2; para n i f's d b S e rV f q u e a complejidad
d tfi'rto d la clasificacin de burbja es fX n 2y. El algoritmo reqtA i^D ^V jass.
www.FreeLibros.me
258
CLASIFICACION
ya que aunque no se necesiten intercam bios (es decir, si la entrada ya estuviera cla
sificada), la prueba de la lnea (3) se ejecutara n(n - l)/2 veces.
A continuacin, considrese la clasificacin por insercin de la figura 8.5. El ci
clo while de las lneas (4) a (6) de la figura 8.5 no puede llevar ms de 0 () pasos,
ya que j toma un valor inicial i en la lnea (3) y decrece en cada ciclo. El ciclo ter
mina cuando j - 1, ya que ^[0] es -a>, lo cual hace que la prueba de la lnea (4) sea
falsa cuando j - 1. Se puede concluir que el ciclo for de las lneas (2) a (6) lleva has
ta c
n-1
c
( n - /), para alguna constante c. Esta suma, que es cn(n - 1)/2, se observa que
i- i
es 0 ( n 2). Por el contrario, se puede m ostrar que al menos la lnea (5) se ejecun- 1
ta ^ (1) - n(n - l)/2 veces, sin im portar el valor inicial del arreglo A, as
/-I y-f-l
que la clasificacin por seleccin lleva un tiempo fi(n 2), tanto en el peor caso, como
en el caso promedio.
Cuenta de intercambios
Si el tam ao de los registros es grande, el procedimiento intercambia, nico lugar en
los tres algoritmos donde se copian registros, llevar ms tiempo que cualquier otro
paso, como la com paracin de claves o los clculos en los ndices del arreglo. As,
mientras que los tres algoritmos llevan un tiempo proporcional a n2, se pueden com
parar con ms detalle al contar las veces que se usa intercambia.
Para comenzar, la clasificacin de burbuja ejecuta el paso de intercambio de la
lnea (4) en la figura 8.1
n
Z
Z
i-i /- i.i
veces a lo sumo, o unas n2/ 2 veces. Pero dado que la ejecucin de la lnea (4) de
pende del resultado obtenido en la prueba de la lnea (3), cabe esperar que el nme
ro real de intercam bios sea mucho m enor que n 2/ 2.
De hecho, la clasificacin de burbuja, en promedio, intercam bia elementos exac
tam ente la mitad de veces, as que el nm ero de intercam bios esperado, si todas las
www.FreeLibros.me
259
secuencias iniciales tienen igual probabilidad, ser aproxim adam ente n2/ 4. Para
corroborar esto, considrense dos listas iniciales de claves m utuam ente inversas:
k y L - k k _,
,...,k {. Un intercambio es la nica forma de que k y
L , - k, k2,
kJ puedan cruzarse si estn inicialmente fuera de orden; pero, k, y k lo estn slo
en una de las listas L, o L 2. As, el nm ero total de intercambios ejecutados cuando
se aplica la clasificacin de burbuja a L^ y L 2 es igual ai nm ero de pares de ele
mentos, esto es, (j) o n(n - l)/2. Por tanto, el nmero de intercam bios promedio
para L, y L 2 es n(n - l)/4 o unas n2/4. Ya que todas las clasificaciones posibles pue
den aparearse con sus inversas, como sucedi con L , y L 2, el nmero prom edio de
intercambios en todas las clasificaciones tambin ser aproxim adam ente n2/4.
El nmero de intercambios efectuados en la clasificacin por insercin es, en pro
medio, idntico al de la clasificacin de burbuja. Aplicando el mismo argumento,
cada par de elementos se intercam biar en una lista L o en su inversa, pero nunca
en ambas.
Sin embargo, en caso de que intercambia sea una operacin costosa, es fcil ob
servar que la clasificacin por seleccin es superior a las clasificaciones de burbuja
y por insercin. La lnea (8) de la figura 8.7 se encuentra fuera del ciclo interno del
algoritmo de clasificacin por seleccin, por lo que se ejecuta exactamente n-1 ve
ces en un arreglo de longitud n. Como la lnea (8) contiene la nica llamada a in
tercambia, la velocidad de crecimiento en el nmero de intercambios en la clasifi
cacin por seleccin, que es 0(n), es m enor que las tasas de crecimiento del nmero
de intercambios de los otros dos algoritmos, que es 0 (n 2). A diferencia de las clasi
ficaciones de burbuja y por insercin, la clasificacin por seleccin permite a los ele
mentos saltar sobre grandes cantidades de elementos sin necesidad de intercam
biarlos entre s individualmente.
Cuando los registros sean grandes y los intercambios costosos, una estrategia muy
til es m antener un arreglo de apuntadores a registros por medio de cualquier al
goritmo. Entonces se pueden intercam biar apuntadores en lugar de registros. Una
vez que los apuntadores a registros se han dispuesto en el orden apropiado, los re
gistros pueden disponerse en el orden clasificado final en un tiempo 0(n).
www.FreeLibros.me
260
CLASIFICACION
8 .3
El prim er algoritmo 0(nlogn) que se estudia t , y tal vez el ms eficiente para clasi
ficacin interna, recibe el nom bre de clasificacin rpida (quicksort). La esencia
del mtodo consiste en clasificar un arreglo A [l],
A[n] tom ando en el arreglo un
valor elave v como elemento pivote, alrededor del cual reorganizar los elementos del
arregl. Es de esperar que el pivote est cercano al valor m edio de la clave del
arreglo, de forma que est precedido por una m itad de las claves y seguido por la
otra mitad. Se perm utan los elementos del arreglo con el fin de que para alguna j,
todos los registros con claves menores que v aparezcan en A[ 1],..., A\j], y todos aque
llos con claves v o mayores aparezcan en A[j + 1],..., A[n]. Despus, se aplica r e c e
sivamente la clasificacin rpida a . 4 ( 1 ] , A[j] y a / 4 [ / + l ] , A[n) para clasificar
am bos grupos de elementos. Dado que todas las claves del prim er grupo preceden
a todas las claves del segundo grupo, todo el arreglo quedar ordenado.
Ejemplo 8.4. En la figura 8.9 se muestran los pasos recursivos que la clasificacin
rpida puede realizar para clasificar la secuencia de enteros 3, 1, 4, 1, 5, 9. 2, 6, 5,
3. En cada caso, se ha escogido como valor v al m ayor de los dos valores distintos
que se encuentran ms a la izquierda. La recursin term ina al descubrir que la por
cin del arreglo que se debe clasificar consta de claves idnticas. Se ha mostrado
que cada nivel consta de dos pasos, uno antes de dividir cada subarreglo, y el segun
do, despus. La reorganizacin de los registros que tiene lugar durante la divisin
se explicar en seguida.
Ahora se inicia el diseo del procedim iento recursivo quicksort(i, j) que opera en
un arreglo A con elem entos A[ 1], ..., A[n], definido de manera externa al procedi
m iento. quicksort(i, j ) ordena desde A[i\ hasta A[f] en el mismo lugar. En la figura
8.10 se m uestra un esbozo del procedimiento. Obsrvese que si todos los elementos
A[i) , .... A\j] tienen la misma clave, el procedim iento no afecta a A.
Se empieza desarrollando una funcin encuentra-pivote que obtiene la prueba de
la lnea (1) de la figura 8.10, para determ inar si todas las claves A[i]
A[j] tienen
el m ismo valor. Si encuentra-pivote no encuentra dos claves distintas, devuelve 0.
De otro modo, devuelve el ndice de la m ayor de las dos prim eras claves diferentes,
la cual se convierte en el elemento pivote. La funcin encuentra-pivote est escrita
en la figura 8.11.
Luego, se aplica la lnea (3) de la figura 8.10, donde se enfrenta el problema de
la perm utacin de .4[i],..., A[\, en el m ismo lugar t t , de manera que todas las clat Tcnicamente, la clasificacin rpida es Otrogn) slo en el caso promedio; en el peor caso es CKn1).
t t Podran copiarse A [i]
A \j] y ordenarlos conform e se tom an, para copiar el resultado otra vez
en A[]......... ![/]. N o se hace asi porque se malgasta espacio y llevar m s tiem po que el m todo utilizado
aqui.
www.FreeLibros.me
CLASIFICACION RAPIDA ( Q V IC K S O R T )
261
particin v - 3
nivel 1
2
/ \
2
particin v - 5
particin v -
nivel 2
1
/
1
/
/\
2
\
/\
1 1 *1
nivel 3 < concluido
I4
concluido particin v - 4
particin v -9
| 3 | 3 | 4
/
5
\
/ \
\
3
nivel 4
\ /
9
/ \
/
5
/
nivel 5
/
5
concluido
Fig. 8.9.
/ \
concluido
ves menores que el valor del pivote aparecen a la izquierda de las dems. Para rea
lizar esto, se introducen dos cursores, z y d, en un principio, en los extremos izquier
do y derecho, respectivamente, de la porcin de A que se est clasificando. Los ele
mentos a la izquierda de r, esto es, /!(/] A [ z - 1J, siempre tendrn claves menores
que el pivote. Los elementos a la derecha de d. esto es. .4[+I ]...., A \j\, tendrn ca
ves mayores o iguales ai pivote, y los elementos del centro estarn mezclados, como
se sugiere en la figura 8.12.
En un comienzo. / = z y j d para que la proposicin anterior se siga cumplien
do, ya que no existe nada a la izquierda de z ni a la derecha de d. Se efectan varias
veces los pasos siguientes, los cuales mueven z a la derecha y d a la izquierda, hasta
que terminen cruzndose, m omento en el que A[i] , ..., A [z - 1] tendrn todas las cla
ves menores que el pivote y A[d+ 1],..., A\j) todas las claves mayores o iguales que
el pivote.
www.FreeLibros.me
262
CLASIFICACION
(1)
(2)
(3)
(4)
(5)
end
Fig. 8.10.
p rim e ra -d a v e A [].c la v e ,
for k : / + 1 to j do I rastrea en busca de una clave distinta i
if A[k].clave > primera-clave then I selecciona la clave mayor |
return (k)
else i A[k].clave > primera-clave then
return (/);
return (0) I nunca se encontraron dos claves diferentes I
end; | encuentra-pivote I
Fig. 8.11.
Procedimiento encuentra-pivote.
i
Fig. 8.12.
I.
Rastrear. Mueve z a la derecha en los registros cuyas claves sean menores que
el pivote. Mueve d a la izquierda en las claves mayores o iguales que pivote. Ob
srvese que esta seleccin del pivote por encuentra-pivote garantiza que por lo
m enos existe una clave m enor y una no m enor que el pivote, de modo que z y
d con seguridad se detendrn antes de quedar fuera del intervalo de i a j.
www.FreeLibros.me
CLASIFICACION RAPIDA (Q U IC K S O R T )
2.
3.
263
El ciclo anterior es poco apropiado, ya que la prueba que lo term ina est justo
en la mitad. Para ponerla en la forma de un ciclo repeat, se pasa la fase desviar al
principio. El efecto es que inicialmente, cuando i - z y j - d, se intercam bia A[i] con
A[j). Esto puede ser o no correcto, pero no es muy im portante, pues se supone que en
un principio no existe ningn orden en particular para las claves entre A[\, ..., A\j\.
Sin embargo, es necesario com prender este truco y no dejarse inquietar por l.
La funcin particin, que realiza las operaciones anteriores y devuelve z. el pun
to en el cual empieza la m itad superior del arreglo dividido, se m uestra en la figu
ra 8.13.
En este momento ya es posible esbozar el programa para la clasificacin rpida
de la figura 8.10; el programa final se m uestra en la figura 8.14. Para clasificar un
arreglo A de tipo array(l..n] of tipo_registro slo se llama a quicksort{ 1, n).
function particin ( i. j: integer; pivote: tipo_clave ): integer;
I divide A[i],...A[j\ para que las claves menores que pivote estn a la
izquierda y las claves mayores o iguales que pivote estn a la derecha.
Devuelve el lugar donde se inicia el grupo de la derecha, i
var
z,d: integer; i cursores, como se describieron antes (
(I)
(2)
begin
z
d j\
repeat
intercambia(A[z], A[d\)\
t ahora se inicia la fase de rastreo
while A[z].clave < pivote do
z
z + 1;
while A[d\.clave > = pivote do
d :~ d - 1
(3)
(4)
(5)
(6)
(7)
until
(8)
(9)
z > d\
return (z)
end; I particin |
Fig. 8.13.
Procedimiento particin.
www.FreeLibros.me
264
CLASIFICACION
(1)
(2)
(3)
(4)
(5)
(6)
Para ver por qu la proposicin es cierta, es preciso usar un truco muy frecuente
en el anlisis de algoritmos: encontrar ciertos artculos a los cuales se les pueda
cargar el tiem po, y m ostrar cmo cargar cada paso del algoritmo para que ningn
artculo se cargue ms que alguna constante. El tiem po total consumido, entonces,
no ser m ayor que el producto de esta constante por el nm ero de artculos.
En este caso, los artculos son los elem entos desde A[i] hasta A \j\,y & cada uno
se le carga todo el tiem po gastado por particin desde el m omento en que z o d apun
ten hacia l por prim era vez, hasta que dejan de hacerlo. Obsrvese primero que z
y d nunca regresan a un elemento. A causa de que por lo menos existe un elemento
en el grupo inferior y uno en el superior, y particin term ina tan pronto como z ex
cede a d, se sabe que cada elemento ser cargado slo una vez.
Un elem ento se deja en los ciclos de las lneas (4) y (6) de la figura 8.13, ya sea
por incremento de z o por decremento de d. Cunto tiem po puede transcurrir entre
cada ejecucin de z := z + 1 o d:= d - l? L o peor que puede suceder es en el comien
zo. Las lneas (1) y (2) asignan un valor inicial a z y d . Ah se puede pasar por el
ciclo sin hacer nada sobre z o d. En el segundo paso y en los siguientes, el intercam
bio de la lnea (3) garantiza que los ciclos while de las lneas (4) y (6) se ejecutarn
por lo menos una vez cada uno; as, lo peor que puede cargarse a una ejecucin de
z := z + 1 o d := d - I es el costo de las lneas (1), (2), dos veces (3), y las pruebas de
www.FreeLibros.me
CLASIFICACION RAPIDA (Q U IC K SO R D
265
las lneas (4), (6), (8) y (4) otra vez. Esta es slo una cantidad constante, indepen
diente de i o j , y las siguientes ejecuciones de z z + 1 o d d - 1 se cargan menos:
a lo sumo, una ejecucin de las lneas (3) y (8) y un recorrido de los ciclos de las
lneas (4) o (6).
Al final, tam bin existen dos pruebas no satisfechas en las lneas (4), (6) y (8),
que pueden no estar cargadas a ningn artculo, pero representan slo una cantidad
constante y pueden cargarse a cualquier artculo. Despus de haber hecho todos los
cargos, an se tiene alguna constante c, por lo que ningn artculo ha sido cargado
con ms de c unidades de tiempo. Dado que existen j - i + 1 artculos, esto es, ele
mentos en la porcin del arreglo que se va a clasificar, el tiem po total empleado
por particin(i, j, pivote) es 0 ( j - i + 1).
Ahora, considrese el tiem po de ejecucin de quicksort(i, j). Es fcil com probar
que el tiem po consumido por llamada a encuentra-pivote de la lnea (1) de la fi
gura 8.14 es 0 ( j - i + 1), y en m uchos casos es bastante menor. La prueba de la lnea
(2) requiere una cantidad constante de tiempo, al igual que el paso (3) cuando se eje
cuta. Se ha m ostrado que la lnea (4), que llam a a particin, llevar un tiempo
CXJ - i + 1). As, con excepcin de las llamadas recursivas que hace a quicksort, cada
llamada individual de quicksort lleva un tiem po como m ximo proporcional al n
mero de elementos que se le pide clasificar.
En otras palabras, el tiem po total consum ido por quicksort es la suma, en todos
los elementos, de las veces que el elemento form a parte del subarreglo en el que
se hizo la llamada a quicksort. Recurdese la figura 8.9, donde se observan las lla
madas a quicksort organizadas por niveles. Es evidente que ningn elemento puede
incluirse en dos llamadas del m ismo nivel, as que el tiem po consum ido por quick
sort puede expresarse como la suma en todos los elementos de la profundidad, o mxi
mo nivel, en el cual se encuentra ese elemento. Por ejemplo, los unos de la figura
8.9 son de profundidad 3 y el 6 es de profundidad 5.
En el peor caso, podra suceder que en cada llamada a quicksort se seleccionara
el peor pivote posible, por ejemplo, el m ayor valor de las claves en el subarreglo que
se est clasificando. Entonces se dividira el subarreglo en dos subarreglos ms pe
queos, uno con slo un elemento (el elem ento que tuviera al pivote como clave), y
el otro con todos los dems. Esa secuencia de particiones forma un rbol como el
de la figura 8.15, donde r,, r2,
r es la secuencia de registros en el orden creciente
de las claves.
Fig. 8.15.
www.FreeLibros.me
266
CLASIFICACION
La profundidad de r, es n - i + 1 para
n - 1. As, la suma de las profundidades es
de r, es
n - I + X (n - i + 1) - + - 1
-2
2
2
la cual es l( n 2). En el peor caso, la clasificacin rpida requiere un tiempo propor
cional a n2 para clasificar n elementos.
www.FreeLibros.me
CLASIFICACION RAPIDA (Q U IC K S O R T )
267
21
17(i) + 7 X -i)l + c2n
n(n-l)
(8.1)
Segn la ecuacin (8.1), el tiempo prom edio requerido por la clasificacin rpi
da es el tiempo, c2n. empleado fuera de las llamadas recursivas, ms el tiempo pro
medio utilizado en las mismas. Este ltimo tiempo se expresa en (8.1) como la suma,
en todas las posibles i. de la probabilidad de que el grupo izquierdo tenga tam ao /
(y, por tanto, el grupo derecho tiene tam ao n - /), m ultiplicado por el costo de las
dos llamadas recursivas: T(i) y T(n - i), respectivamente.
La primera tarea es transform ar la ecuacin (8.1) de manera que se simplifique
la sumatoria y, de hecho, tome la forma que tendra si se hubiera elegido un pivote
verdaderamente aleatorio en cada paso. Para hacer la transformacin, obsrvese que
para una funcin ./(O cualquiera, sustituyendo i por n - i se puede probar
(8.2)
i=i
Al sustituir la mitad del lado izquierdo de (8.2) por el lado derecho, queda
2/(0 = 7
(A l)+ / ( * - / ) )
i=i
=i
(8-3)
Aplicando (8.3) a (8.1) con J{i) igual a la expresin interna de la sum atoria de (8.1),
se obtiene
Tin) ^
72
2 ,~ ( n ( n - l )
<
I
n~ 1
n O + T ( n - i) ] + -^ ~ -0 i r ( n - 0 + r ( ( ) ] l +
n (n 1)
J
[ n o + T ( n - i) ] + c2n
,.|
www.FreeLibros.me
( 8.4)
268
CLASIFICACION
O n~ I
7*() + c2n
n ~ l ,=i
(8.5)
7 (n ) <
i lo g i + c 2n
8 .6 )
(-i
Aqu es necesario dividir la sum atoria de (8.6) en trm inos menores, donde
/ < ni2, y, por tanto, log/ no es mayor que log(n/2), que es (logn)-l, y en trminos
mayores, donde i > ni2, y log/ puede ser tan grande como logn. Entonces (8.6) se
convierte en
T(n) <
>i/2
2 log +
2c
n -1
2c
n -1
1c
n -1
2c
n 1
c n 'o e "
>i-l
2
+ c 2n
i= n /2 + l
/2
2 i (log /I ~ 1) +
i-1
n- 1
X
' lo%n + c 2n
i-n /2 + l
( + l)log ~ ( ~ + 1) + - j n - ^ - D l o g n
4 2
4 2
4
2
i_ iL hog 2
2}
en
- T
en
l ^
i + n.
8
4
+ c 2n
www.FreeLibros.me
+ c 2n
+ c 2n
( 8 .7 )
CLASIFICACION RAPIDA ( Q U IC K S O R T )
269
Al tom ar c > 4c2, la sum a del segundo y cuarto trm inos de (8.7) no es mayor
que cero. El tercer trm ino de (8.7) hace una contribucin negativa, as que de (8.7)
es posible confirm ar que T(n) < crtlogn, si c - 4c2. Esto completa la demostracin
de que la clasificacin rpida requiere un tiempo 0(nlogn) en el caso promedio.
www.FreeLibros.me
270
CLASIFICACION
8 .4
for v en la lista L do
INSERTAR, S):
hile not VACIA(S) do begin
y > MIN(S);
wriie!n(y)\
SUPRIM E^'. S)
end
Fig. 8.16.
Los captulos 4 y 5 analizaron varias estructuras de datos, como los rboles 2-3,
que manejan cada operacin en un tiempo D(logn) por operacin, si los conjuntos
nunca crecen ms all de n elementos. Si se supone que la lista L es de longitud n.
el nm ero de operaciones realizadas ser n veces INSERTA, n veces SUPRIM E, n
veces MIN, y n + l pruebas VACIA. El tiempo total consum ido por el algoritmo de
la figura 8.16 es 0(nlog), si se emplea una estructura de datos adecuada.
La estructura de datos de rbol parcialmente ordenado que se estudi en la sec
cin 4.11, es adecuada para la realizacin de este algoritmo. Recurdese que un
rbol parcialmente ordenado puede representarse por un montculo, un arreglo
/4[1],..., A[n], cuyos elem entos tienen la propiedad de rbol parcialmente ordenado:
A[i].clave < A [2*/].clave y A[i].clave < A\2* + 1].clave. Al considerar los elementos
7/ y 2/ + 1 como los hijos del elem ento en /, el arreglo forma un rbol binario equi
librado en el cual la clave del padre nunca excede a las claves de ls hijos.
En la seccin 4.11. se vio que el rbol parcialmente ordenado puede manejar las
www.FreeLibros.me
271
www.FreeLibros.me
272
CLASIFICACION
cam bia un registro violador con su hijo m s pequeo. El procedim iento completo,
llamado heapsort, se muestra en la figura 8.18.
(8.8)
ordenado I
r : ltimo I para forzar la term inacin del ciclo while
end; I empuja I
Fig. 8.17.
www.FreeLibros.me
273
(1)
(2)
(3)
(4)
(5)
Fig. 8.18.
t D e hecho, este tiem po es 0 (n ), por un argum ento m s cuidadoso. Para j dentro del intervalo n /2 a
n/ 4 + I. (8.8) dice que slo se necesita una iteracin en el ciclo while de empuja. P a ra ; entre n /4 y n/8 + I.
slo d os iteraciones, y as sucesivam ente. El nmero total d e iteraciones cu a n d o ; est com prendida entre
n /2 y I est acotado por n /4 l + n/8*2 + n /l6 3 + .... O bsrvese que el lim ite m ejorado para las lineas (1)
a (2) no im plica un lm ite m ejorado para heapsort, todo el tiem p o se consum e en las lneas (3 ) a (5).
www.FreeLibros.me
274
CLASIFICACION
ese ciclo es 0(k\ogn). As, heapsort, modificado para producir slo los primeros k
elementos, lleva un tiempo CH.n + k\ogn). Si k < n/logn, es decir, se desea como
m ximo una fraccin ( 1/logn) de la lista completa clasificada, entonces el tiempo re
querido es 0(n).
8 .5
Iblnsort)
(8.9)
A[)\
Este cdigo calcula el lugar que pertenece al registro A[i] y lo coloca en l. El ciclo
completo lleva un tiempo O(n). Trabaja bien slo cuando existe un nico registro
con clave v para todo valor de v entre 1 y n. Un segundo registro que tenga la clave
v puede ubicarse tambin en 5[v], destruyendo el registro anterior con clave v.
Hay otras formas de clasificar en su sitio un arreglo A con claves 1, 2, ..., n en
slo un tiempo 0{n). Se visitan /1[1], ..., A\n] por tum o; si el registro de A[i\ tiene
clave j # i, se intercambian A[i\ con A\j]. Si despus del intercam bio el registro con
la clave k se encuentra en A[i\, y k # i, se intercam bia A[\ con A[k], y as sucesiva
mente. Cada intercam bio coloca algn registro donde le corresponde, despus de lo
cual no vuelve a moverse. As, el siguiente algoritmo ordena A en su sitio, en un tiem
po 0(n), a condicin de que exista un registro con cada una de las claves 1, 2 ,..., n.
for i
1 to n do
while A[\. clave o
i do
intercambia (/<[/], A[A[i). clave])-,
www.FreeLibros.me
275
Fig. 8.19.
www.FreeLibros.me
276
CLASIFICACION
necesidad de recorrer toda la lista. La figura 8.19 m uestra los apuntadores revisa
dos. con lneas de puntos necesarios para concatenar L x y L 2 y obtener el resultado
L,. Se supone que la lista L 2 desaparece despus de la concatenacin, en el senti
do de que el encabezado y el apuntador final de L 2 se vuelven nulos.
Ahora se puede escribir un programa para clasificar colecciones arbitrarias de re
gistros por medio de urnas, donde el campo de la clave es de un tipo enumerado.
El programa de la figura 8.20 est escrito en funcin de prim itivas de procesamien
to de listas. Como ya se ha mencionado, una lista enlazada es la aplicacin preferi
ble, pero existen otras opciones. Recurdese tambin que el ambiente para el procedi
m iento es que un arreglo A de tipo array[l..n] of tipo.registro contiene los elemen
tos a clasificar, y el arreglo B. de tipo array[tipo_clave] of tip o J is ta representa las
urnas. Se supone que tipo_clave es expresable como clave-menor., clave-mayor. como de
be ser cualquier tipo enumerado, para algunas cantidades clave-menor y clave-mayor.
(1)
(2)
(3)
(4)
procedure clasifcacin-por-urnas\
I clasifica el arreglo A mediante urnas, dejando la lista ordenada en
B[clave-menor] |
var
i: integer;
v: tipo_clave;
begin
i coloca los registros en las urnas ;
for / := 1 to n do
I mete A[i] al frente de la urna destinada a su clave 1
IN SER T A R [/], PRIMERO(fl(.4[].c/ave]), B{A[i\.clave})\
for v := succ(lowkey) to clave-m ayor do
i concatena todas las urnas al final de B [clave-menor] 1
CONCATENA(fl[c/avf>_mfw], S[v))
end: ! clasificacin-por-urnas I
Fig. 8.20.
www.FreeLibros.me
277
el ciclo de las lneas (3) a (4), que concatena las urnas, se supone tem poralm ente
que existen apuntadores a los finales de las listas. El paso (4) emplea un tiem po cons
tante, por lo que el ciclo lleva un tiem po 0{m ). De aqu que el programa de clasi
ficacin por urnas completo Heve un tiem po 0 (n + m).
Si los apuntadores a los finales de las listas no existen, en la lnea (4) se debe con
sumir cierto tiempo para llegar al final de J3[v] antes de la concatenacin con B[clave-menor]. De esta manera, el extremo de B[clave-menor) siempre estar disponible
para la siguiente concatenacin. El tiempo adicional dedicado a llegar al final de
cada urna, suma un tiem po de O(n), debido a que la suma de las longitudes de las
urnas es n. Este tiempo extra no afecta al orden de magnitud del tiem po de ejecu
cin para el algoritmo, debido a que O(n) no es m ayor que 0 (n + m).
(8.10)
de la figura 8.21 (a). Si se utiliza la estructura de datos de lista enlazada con apun
tadores a los finales de las listas, la colocacin de los n enteros en las urnas y su con
catenacin pueden llevar un tiempo CKn) cada una.
www.FreeLibros.me
278
CLASIFICACION
Contenido
0
1, 81
64, 4
25
36, 16
9, 49
(a)
Fig. 8.21.
Urna
0
1
2
3
4
5
6
7
8
9
Contenido
0, 1, 4, 9
16
25
36
49
64
81
(b)
www.FreeLibros.me
CLASIFICACION PO R URNAS (B IN S O R T )
279
Iradix sort)
(8.11)
(8.12)
Se supondr de aqu en adelante que tipo.clave est constituido por k elem entos,/!,
f2
f k de tipos i,. t2, .... lk. Por ejemplo, en (8.11) /, - 1..31, t2 - (ene
dic), y
13 - 1900.. 1999. En (8.12), k = 10, y f, - l2 - ... - tk - char.
Tam bin se supondr de que se desea clasificar registros en orden lexicogrfico
de acuerdo con sus claves. Esto es, el valor de la clave (a,, a2, ..., ak) es m enor que
el valor de la clave (>,, b2, ..., bk), donde a, y b, son los valores del campo fi, para
1- 1,2, ..., k, si
1. <2, < b u o bien
2. a, - b { y a2 < b2, o bien
k.
a, -
a2 - b2, ...,
y ak ^ bk.
www.FreeLibros.me
280
CLASIFICACION
begin
for i
(2)
(3)
(4)
(5)
k downto 1 do begin
for cada valor v de tipo i do ! limpia las um as 1
vaciar B[v)
for cada registro r de la lista A do
(6)
(7)
end
end; | radixsort |
Fig. 8.22.
www.FreeLibros.me
281
Ejemplo 8.7. Si las claves son enteros en el intervalo 0 a nk - 1, para alguna cons
tante k, se puede generalizar el ejem plo 8.6 y considerar las claves como enteros en
base n con k dgitos de longitud. Entonces, /, es 0..( - 1) para toda i entre 1 y k, as
k
que s, = n. La expresin 0 (n +
s,) se vuelve 0 (n + kri) que, como k es una cons
tante, es 0{n).
Como otro ejemplo, si las claves son cadenas de caracteres de longitud k, para
k
la constante k, entonces s, = 128, por ejemplo, para toda i, y s, es una constani-1
te. As, la clasificacin por residuos en cadenas de caracteres de longitud fija tam
bin toma 0(n). De hecho, siempre que k es constante y los s, son constantes, o sim
plemente 0(n), la clasificacin por residuos lleva un tiem po 0(n). Slo si k crece
con n, puede ocurrir que no tom e 0(ri). Por ejemplo, si las claves se consideran como
cadenas binarias de longitud logn, entonces k = log/i, y s, - 2 para 1 < i < k. As,
k
la clasificacin por residuos tom ara 0 (k n + ^ s), lo cual es Oinlogn) t-
8 .6
www.FreeLibros.me
282
CLASIFICACION
Arboles de decisin
Se tratarn ahora los algoritmos de clasificacin que slo usan los elementos a cla
sificar cuando comparan dos claves. Se puede dibujar un rbol binario en el cual los
nodos representan el estado del programa despus hacer un nm ero de compara
ciones de claves. Tam bin se puede considerar que un nodo representa las disposi
ciones iniciales de los elementos que llevarn el programa a este estado. As, un
estado del programa es, en esencia, el conocimiento de la disposicin inicial con
seguida hasta ese punto por el programa.
Si cualquier nodo representa dos o ms disposiciones iniciales posibles, el pro
grama todava no puede conocer el orden correcto, por lo que debe hacer otra com
paracin de claves, como es k < k2? . Entonces se pueden crear dos hijos para
el nodo; el hijo izquierdo representa aquellas disposiciones iniciales consistentes con
el hecho de k < k2, y el hijo derecho representa las disposiciones consistentes con
el hecho de que k > k 2 f. As, cada hijo representa un estado que contiene la in
formacin conocida en el padre, ms el hecho de que k t < k 2 o que k t > k 2, de
pendiendo de si el hijo es izquierdo o derecho.
Ejemplo 8.8. Considrese el algoritmo de clasificacin por insercin con n - 3. Su
pngase que al principio, /![1], A[2] y ^[3] tienen claves con valores a . b y c y respec
tivamente. Cualquiera de las seis disposiciones de ay b y c puede ser la correcta, as
que se empieza la construccin del rbol de decisin con el nodo etiquetado (1) de
la figura 8.23, el cual representa todas las posibles disposiciones. El algoritmo de cla
sificacin por insercin compara prim ero A[2] con ^4[1], esto es, b con a. Si b resul
tara ser el ms pequeo, la disposicin correcta slo puede ser bac, bca o cba, las
tres disposiciones en las cuales b precede a a. Esas tres disposiciones estn represen
tadas por el nodo (2) de la figura 8.23. Las otras tres disposiciones estn represen
tadas por el nodo (3), el hijo derecho de (1), y son las disposiciones para las cuales
a precede a b.
Ahora considrese lo que sucede si el dato inicial es tal que se alcanza el nodo
(2). Slo se ha intercam biado /![1] con A[2], y se encontr que A[2] no puede subir
ms ya que se encuentra en la cima. La disposicin actual de los elementos es bac.
La clasificacin por insercin empieza a continuacin insertando /![3] en el lugar
adecuado, y com parando A[3) con A[2]. Dado que A[2] contiene ahora a, y /![3] con
tiene c, y com parando c con a\ el nodo (4) representa las dos disposiciones del nodo
(2) en las cuales c precede a a, m ientras que (5) representa la disposicin donde esto
no sucede.
El algoritmo term inar si alcanza el estado del nodo (5), ya que ha movido a /1[3]
lo ms arriba posible. Por otra parte, en el estado del nodo (4), se tiene que
/i[3] < A[2], por lo que se intercam biaron, dejando b en ,4[1] y c en A[2]. La clasi
ficacin por insercin compara esos dos elementos y los intercam bia si a continua
cin c < b. Los nodos (8) y (9) representan las disposiciones consistentes con c < b
y su opuesto, respectivamente, as como la informacin recogida de los nodos (1) a
t Tam bin es posible suponer que todas las claves son diferentes, ya que si se clasifica una coleccin
de claves distintas, con segundad se producir un orden correcto cuando alguna clave est repetida.
www.FreeLibros.me
Fig. 8.23.
283
(2) a (4), es decir, b < a y c < a. La clasificacin por insercin termina, se haya in
tercambiado A[2] con -4[1] o no, y no se efectan ms comparaciones. Por fortuna,
cada hoja (5), (8) y (9) representa disposiciones individuales, asi que se ha acumu
lado suficiente informacin para determ inar la clasificacin correcta.
La descripcin del rbol que desciende del nodo (3) es bastante simtrica con lo
que se ha visto, por lo que se omite. La figura 8.23 se emplea como gua para de
term inar el orden correcto de las llaves a, b y c, puesto que todas sus hojas estn aso
ciadas con una disposicin individual.
www.FreeLibros.me
284
CLASIFICACION
correcto para la lista inicial a,, a2, ..., a. Esto es, cualquiera de los n elementos pue
de estar en prim er lugar, cualquiera de los n - 1 elementos puede estar en segundo
lugar, cualquiera de los n - 2 puede estar en tercer lugar, y as sucesivamente. De
esta forma, cualquier rbol de decisin que describa un algoritmo de clasificacin
correcto y que trabaje en una lista de n elementos, debe tener por lo menos n! hojas,
ya que cada disposicin posible debe estar sola en una hoja. De hecho, si se elimi
nan nodos correspondientes a comparaciones innecesarias y hojas que no correspon
den a disposiciones posibles (ya que las hojas pueden alcanzarse slo por una serie
inconsistente de resultados de comparaciones), habr exactamente n\ hojas.
Los rboles binarios con muchas hojas deben tener caminos largos. La longitud
de un cam ino desde la raz hasta una hoja proporciona el nm ero de comparaciones
hechas cuando la disposicin representada por esa hoja es el orden clasificado para
cierta lista de entrada L. As, la longitud del camino ms largo desde la raz hasta
una hoja es una cota inferior en el nm ero de pasos efectuados por el algoritmo en
el peor caso. En especial, si L es la lista de entrada, el algoritmo efectuar al menos
tantas comparaciones como la longitud del camino, probablemente en adicin a
otros pasos que no sean comparaciones de claves.
Por tanto, es necesario preguntarse lo cortos que pueden ser todos los caminos
en un rbol binario con k hojas. U n rbol binario en el que todos los caminos son
de longitud p o m enor, pueden tener una raz, dos nodos en el nivel 1, cuatro nodos
en el nivel 2 y, en general, 2' nodos en el nivel i. As, el nm ero mayor de hojas de
un rbol sin nodos en los niveles m s altos que p es 2P. Es decir, un rbol bi
nario con k hojas debe tener un cam ino de longitud no m enor que logA:. Si k n!,
entonces cualquier algoritmo de clasificacin que slo utilice comparaciones para
determ inar el orden clasificado, en el peor caso debe requerir un tiempo 2 (log(n!)).
Pero con qu rapidez crece log(!)? U na aproxim acin cercana a n\ es (n/e)",
donde e = 2.7183... es la base de los logaritmos naturales. Dado que log((n/e)")= nlogtt - logL se observa que log(!) es de orden log. Es posible tom ar una cota
inferior precisa observando que n(n - 1)...(2) (1) es el producto de por lo menos n/2
factores, que a su vez son cada uno al m enos n/2. As, n'. > (n/2)"'2 ; de aqu que
log(n!) i (n/2)log(n/2) = (n/2)logn - n/2, por lo que la clasificacin por comparacio
nes requiere un tiem po 2 (nlogn) en el peor caso.
www.FreeLibros.me
ESTADISTICAS DE OR DEN
285
por lo menos de 0. Ahora, supngase que T tiene k hojas. Un rbol binario con
k > 2 hojas es semejante a los rboles de las figuras 8.24(a) o (b).
k, < k hojas
k hojas
k 2 < k hojas
(a)
(b)
Form as posibles del rbol binario T.
Fig. 8.24.
k, + k->
log(*2) +
(8.13)
Se puede comprobar que cuando k, = k2 = kJ2. (8.13) tiene valor k\o%k. y se debe
demostrar que (8.13) tiene un mnimo cuando k, - k2, dada la restriccin k t + k 2= k.
Se deja esta demostracin como ejercicio a quien tenga experiencia en clculo dife
rencial. Si se asume que (8.13) tiene un valor m nim o de k\ogk, se observa que T no
fue un contraejemplo.
8 .7
Estadsticas de orden
www.FreeLibros.me
286
CLASIFICACION
3.
Con el tiempo se encuentra que se llama a selecciona (i, j, k), cuando todos los
elementos A[i], ..., A\j) tienen la misma clave (en general, porque j = i). Entonces
se sabe que la clave deseada es cualquiera de las encontradas en esos registros.
Como con la clasificacin rpida, la funcin selecciona descrita antes puede lle
var un tiempo Clin1) en el peor caso. Por ejemplo, supngase que se busca el primer
elemento, pero por mala suerte el pivote siempre es la mayor clave disponible. Sin
embargo, en promedio, selecciona es an ms rpido que la clasificacin rpida; lle
va un tiempo 0(n). El m otivo es que m ientras esta ltima se llama a s misma dos
veces, selecciona lo hace slo una. Se puede analizar selecciona como se hizo con la
clasificacin rpida, pero de nuevo las m atemticas son complejas, y un simple con
cepto intuitivo debe ser convincente. En promedio, selecciona se llama a s mismo
en un subarreglo la mitad de largo que el subarreglo dado. Supngase que, en forma
conservadora, se dice que cada llamada es en un arreglo cuyo tam ao es 9/10
de la llamada previa. Entonces, si 7\n) es el tiempo empleado por selecciona en un
arreglo de longitud n. se sabe que para alguna constante c.
U n ) T(- ^- n) + en
www.FreeLibros.me
(8.14)
ESTADISTICAS D E O RDEN
287
Usando tcnicas del prximo captulo, se puede m ostrar que la solucin de (8.14)
es 7 {n) 0(n).
2.
Este pivote est lejos de los extremos, siempre que no sean muchos los registros
que tengan el pivote como clave t- Para sim plificar, se supondr por el momento
que todas las claves son diferentes. Entonces, se dice que el pivote elegido, el ele
mento l(n + 5)/10]-simo de los l/5J elem entos centrales obtenidos de los grupos
de cinco, es mayor que al menos 3[(n - 5)/10)J de los n elementos, puesto que exce
de l(n - 5)/10] de los elementos centrales, y cada uno de stos excede dos ms, de
los cinco de los cuales es el centro. Si n > 75, 3](n - 5)/10J es por lo menos n!4. En
forma semejante, se puede probar que el pivote escogido es menor o igual que al me
nos 3l(n - 5)/10] elementos, as que para n > 75, el pivote cae entre los puntos 1/4
y 3/4 en el orden clasificado. Ms im portante, cuando se escoge el pivote para divi
dir los n elementos, el elemento /c-simo se aislar dentro de un intervalo de hasta
3/4 de los elementos. Un esbozo del algoritmo completo s proporciona en la figu
ra 8.25; igual que para los algoritmos de clasificacin, ste supone un arreglo
A[i] , ..., A[n] de tipo_registro, y ese tipo_registro tiene un campo clave del tipo tipo.clave. El algoritmo para encontrar el fc-simo elem ento es slo una llamada a selec
ciona (1, n, k).
Para analizar el tiempo de ejecucin de selecciona de la figura 8.25, sea n j - i + 1.
Las lneas (2) y (3) se ejecutan slo si n es 74 o menor. As, aunque el paso (2) en
general puede llevar 0 (n 2) pasos, hay una constante c,, con independencia de su ta
mao, tal que para n < 74, las lneas (1) a (3) no llevan ms de un tiem po c.
t En el caso extrem o, cuando todas las claves son iguales, el pivote n o ofrece ninguna separacin. Ob
viamente, el pivote es el Ar-simo elem ento para cualquier k. y s e hace necesario otro enfoque.
www.FreeLibros.me
288
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
CLASIFICACION
Fig. 8.25.
Ahora, considrese las lneas (4) a (10). La lnea (7), el paso de la particin, se
m ostr en conexin con la clasificacin rpida, y lleva tiem po 0(n). El ciclo de las
lneas (4) a (5) se ejecuta unas nt5 veces, y cada ejecucin de la lnea (5), requirien
do la clasificacin de 5 elementos, lleva un tiem po constante, de manera que el ciclo
lleva un tiem po 0 (n) en total.
Sea 7\n ) el tiem po requerido por una llam ada a selecciona con n elementos. En
tonces, la lnea (6) lleva como m ximo un tiem po T\n/5). Ya que n > 75 cuando
se alcanza la lnea (10), y se ha especificado que si n > 75, a lo sum o 3n/4 elemen
tos son menores que el pivote, y hasta 3n/4 son iguales o mayores, se sabe que las
lneas (9) o (10) requieren como m xim o un tiem po T(3n/4). As, para algunas cons
tantes c, y c2,
c, si n < 74
7 W
<
( 8 .1 5 )
www.FreeLibros.me
EJERCICIOS
289
El trmino c2n de (8.15) representa las lneas (1), (4), (5) y (7); el trm ino T\n/5)
se deriva de la lnea (6), y 7T[3n/4) representa las lneas (9) y (10).
Se mostrar que T{n) de (8.15) es 0(n). Antes de proseguir, debe apreciarse que
el nmero mgico 5, el tam ao de los grupos de la lnea (5), y la eleccin de n 75
en el punto de equilibrio debajo del cual no se usa selecciona en forma recursiva, fue
ron diseados para que los argumentos ni5 y 3n/4 de T en (8.15) sumaran algo me
nos que n. Se podran hacer otras elecciones de esos parmetros, pero obsrvese que
al resolver (8.15) se necesita saber que 1/5 + 3/4 < 1 para probar la linealidad.
La ecuacin (8.15) puede resolverse suponiendo una solucin y verificando por
induccin que se cumple para toda n. Se seleccionar una solucin de la forma en,
para alguna constante c. Si se escoge c > c,, es sabido que T(n) < en para toda n
entre I y 74, as que se considerar el caso n > 75. Supngase por induccin que
1\m ) < cm para m < n. Entonces, por (8.15),
7\n) < c2n + cn/5 + 3cn/4
c2n + 19cn/20
(8.16)
Al elegir c - mx(c,, 20c2), por (8.16) se tiene 7\n) < cnl20 + cn/5 + 3cn/4 - en, lo
cual se pretenda demostrar. As, T{n) es G(n).
Ejercicios
8.1
www.FreeLibros.me
CLASIFICACION
A [in!4 + iJ) para 1 < / < n/4 en el segundo recorrido, ni8 ctuplos en el ter
cer recorrido, y as sucesivamente. En cada recorrido, el ordenam iento se
realiza con la clasificacin por insercin, la cual term ina cuando encuentra
dos elementos en el orden apropiado.
procedure Shelisort ( var A: array[l..n] of integer );
var
incr n div 2;
while incr > 0 do begin
for i := incr + 1 to n do begin
j
/ - incr,
while j > 0 do
if A[j] > A\j+incr] then begin
intercambia(A[j], A[j+incr])\
j j - incr
end
else
j
end;
incr
incr div 2
end
end; | Shelisort}
Fig. 8.26.
Clasificacin de Shell (S h e l i s o r t ).
Supngase que se est clasificando una lista L que consta de una lista cla
sificada seguida de unos cuantos elem entos aleatorios. Cul de los m
todos de clasificacin analizados en este captulo ser especialmente apto
para tal tarea?
8.5
www.FreeLibros.me
EJERCICIOS
291
8.8
*8.9
*8.10
**8.11
*8.12
*8.13
8.16
www.FreeLibros.me
292
CLASIFICACION
8.17
*8.18
Mustrese que cualquier algoritmo para elim inar duplicados de una lista re
quiere por lo m enos un tiempo 2 (nlogn) con el modelo de computacin
del rbol de decisin de la seccin 8.6.
*8.19
8.20
Notas bibliogrficas
Knuth [1973] es una referencia completa sobre mtodos de clasificacin. La clasifi
cacin rpida (quicksort) se debe a Hoare [ 1962] y las modificaciones postenores fue
ron publicadas por Singleton [1969], y Frazer y McKellar [1970]. La clasificacin
por m ontculos (heapsort) fue descubierta por Williams [1964] y m ejorada por Floyd
[1964], El rbol de decisin de la complejidad de la clasificacin fue estudiado por
Ford y Johnson [1959]. El algoritmo de seleccin lineal de la seccin 8.7 es de Blum,
Floyd, Pratt, Rivest y Tarjan [1972].
Shellsort se debe a Shell [1959] y su rendim iento ha sido analizado por Pratt
[1979], Vase Aho, Hopcroft y Ullman [1974] sobre una solucin al ejercicio 8.9
www.FreeLibros.me
1293]
Tcnicas de anlisis
de algoritmos
9 .1
www.FreeLibros.me
294
de crecim iento m s lenta de n que acota el tiem po de ejecucin en el peor caso por
arriba. Sin embargo, este ltim o requisito no es parte de la definicin de CHfin)), y
algunas veces no es posible asegurar que se tenga la cota de crecimiento superior
ms lenta.
Esta definicin de eficiencia ignora factores constantes en el tiempo de ejecucin
y existen varias razones prcticas para ello. Prim ero, dado que la mayora de los al
goritmos estn escritos en lenguajes de alto nivel, se deben describir en funcin de
pasos, los cuales emplean una cantidad constante de tiem po cuando se traducen
al lenguaje de mquina de cualquier com putador. Sin embargo, exactamente cunto
tiem po requiere un paso depende no slo del paso mismo, sino del proceso de tra
duccin y del conjunto de instrucciones de la mquina. As, intentar tener ms pre
cisin que para decir que el tiem po de ejecucin de un algoritmo es del orden de
fin ) , esto es, 0(fin)), podra em pantanar al usuario en detalles de mquinas espe
cficas y slo sera aplicable a esas mquinas.
U na segunda razn im portante para tratar con la com plejidad asinttica e igno
rar factores constantes es que, m s que estos factores, es la complejidad asinttica
lo que determ ina para qu tam ao de entradas puede usarse el algoritmo para pro
ducir soluciones en un com putador. En el captulo 1 se analiz con detalle este as
pecto. Sin embargo, es necesario tener cautela acerca de la posibilidad de que para
problemas muy im portantes, como los de clasificacin, se pueda considerar adecua
do analizar los algoritmos con tal detalle que sean factibles ciertas proposiciones
como el algoritmo A debe ejecutarse con el doble de rapidez que el algoritmo B en
un com putador tpico.
U na segunda situacin en la cual conviene desviarse de la nocin de eficiencia
en el peor caso ocurre cuando se conoce la distribucin esperada de las entradas a
un algoritmo. En estas situaciones, el anlisis del caso prom edio puede ser mucho
ms significativo que el anlisis del peor caso. Por ejemplo, en el captulo previo se
analiz el tiem po de ejecucin prom edio de la clasificacin rpida en el supuesto de
que todas las perm utaciones del orden de clasificacin correcto tienen la misma pro
babilidad de presentarse como entradas.
9 .2
www.FreeLibros.me
295
delanteros se borra de esta lista y se emite como salida. El resultado es una sola lista
clasificada con los elementos de L, y L 2. Los detalles de combina no tienen impor
tancia alguna en este m omento, puesto que este algoritmo de clasificacin se anali
zar con detalle en el captulo 11. Lo que im porta es que el tiempo empleado por
combina en listas de longitud n i2 es 0(n).
function mergesort ( L: LISTA; n: integer ) : LISTA;
f L es una lista de longitud n. Se devuelve una versin clasificada de L.
Se supone que n es una potencia de 2. |
var
L 2: LIST
begin
if n - 1 then
return (L)
else begin
partir L en dos mitades, L, y Lj, cada una de longitud n/2;
return (combina(mergesort(Ln/2). mergesort(L2,nI2)))
end
end; | mergesort!
Fig. 9.1.
(9.1)
El trmino c, en (9.1) representa el nmero constante de pasos dados cuando L tie
ne longitud 1. En el caso de que n > 1, el tiempo requerido por mergesort puede di
vidirse en dos partes. Las llamadas recursivas a mergesort con listas de longitud n/2
cada una llevan un tiempo T(nl2), de aqu el trm ino 2T\n!2). La segunda parte con
siste en la prueba para descubrir que n # 1, la divisin de la lista L en dos partes
iguales y el procedimiento combina. Esas tres operaciones requieren un tiempo que
puede ser una constante, en el caso de la prueba, o ser proporcional a n al dividir y
combinar. As, la constante c2 puede escogerse de m odo que el trmino c2n sea una
cota superior del tiempo requerido por mergesort para hacer todo excepto las llama
das recursivas. La ecuacin (9.1) representa todo lo anterior.
Obsrvese que (9.1) se aplica slo cuando n es par, por lo que generar una cota
superior en form a cerrada (esto es, como una frmula para T(n) que no implica nin
gn T(m) para m < n) slo cuando n es una potencia de 2. Sin embargo, aunque
slo se conozca T\n) cuando n es una potencia de 2, se tiene una buena idea de T\ri)
para toda n. En particular, para casi todos los algoritmos, se puede suponer que 1\n)
est entre 1\2) y 7X 2"') si n est entre 2' y 2 " '. Y con un poco ms de esfuerzo
www.FreeLibros.me
296
para encontrar la solucin, se puede reemplazar el trm ino 27\n/2) de (9.1) por
7\(n + l)/2) + 7T(/i - l)/2) para n > 1 impar. Despus, se podra resolver la nueva
ecuacin de diferencia para obtener una solucin cerrada para toda n.
9 .3
(9.2)
www.FreeLibros.me
(9.3)
297
^ anlogn - an + c2n + 2b
anlogn + b
siempre que a > c2 + b.
As, T(n) < anlogn + b siempre y cuando se satisfagan dos restricciones: b > c,
y n i C j + i , Por fortuna, existen valores que se pueden escoger para a que satisfa
cen ambas restricciones. Por ejemplo, al elegir b - c, y a - c, + c2, por induccin
sobre n, se concluye que para toda n > I
T(n) ^ (c, + c2)n logn + c,
(9.4)
www.FreeLibros.me
(9.6)
298
Eslo es, por la hiptesis inductiva, se puede su s titu ir/p o r T en el lado derecho de
la recurrencia (9.5) para obtener
T(n) ^ g ( f( a t
aJ t n /2 ),n )
(9.7)
Cuando se cumple la segunda lnea de (9.6), se combina con (9.7) para demos
trar que T(n) < J[a ..., an, n ), que es lo que se deseaba dem ostrar por induccin
en n.
Por ejemplo, en el ejemplo 9.1, g(x, y) - 2x + c-y y
a2, n) - a, nlogn + a2.
Aqu se intenta satisfacer
f i a h alt 1 ) - a2 > c,
A a u a2, n) = a,nlogn + a2 > 2(a,(-^-)log(-^-) + a 2) + c2n
Como se analiz, a 2 c, y a, = c, + c2 son una eleccin satisfactoria.
Expansin de recurrencias
Si no se puede suponer una solucin, o no existe la seguridad de tener la mejor
cota en T(n), se usa un mtodo que, en principio, siempre es adecuado para la so
lucin exacta de T(n), aunque en la prctica a m enudo surgen problemas al sumar
series y hay que recurrir al clculo de una cota superior en la suma. La idea general
es tom ar una recurrencia com o (9.1), que indica que T(n) < 2 J\n/2) + c2n.
y emplearla para obtener una cota en T[n/2) sustituyendo n/2 por n. Esto es,
T(n/2) s
27"(n/4) + c 2n/2
(9.8)
(9.9)
Del mismo modo, se sustituye ni4 por n en (9.1) y se emplea para obtener una
cota superior en T(n/4). Esa cota, 2 T (n /i) + c2n/4, se sustituye en el lado derecho
de (9.9) para obtener
T(n) < 8T(n/8) + 3c2n
(9.10)
(9.11)
para cualquier i. Si se supone que n es una potencia de 2, como 2*, este proceso de
expansin term inar tan pronto como se alcance 7~(1) en el lado derecho de (9.11),
lo que ocurrir cuando i = k, quedando (9.11) como
Tin) < 2*7X1) + kc2n
www.FreeLibros.me
(9.12)
299
Entonces, como 2* = n, se sabe que k = logn. Com o 7X1) < c,, (9.12) es
7X/0 ^ cn + c2n\ogn
(9.13)
9 .4
Considrese la recurrencia que surge al dividir un problema de tam ao n en a subproblemas de tam ao n/b. Por conveniencia, se supone que un problem a de tam a
o 1 requiere una unidad de tiem po y que el tiem po para reunir las soluciones de
los subproblemas y obtener una solucin del problem a de tam ao n es d(n), en las
mismas unidades de tiempo. Para el ejemplo de mergesort, se tienen a - b - 2 y d(n) - c2n/c|, en unidades de c,. Entonces, si T(n) es el tiem po para resolver un problema
de tamao n, se tiene
7X1) = 1
T(n) = aT(n/b) + d(n)
( 914)
Obsrvese que (9.14) slo se aplica a las n que sean una potencia entera de b, pero
si se presume que T(n) es continua, al tom ar una cota superior ajustada sobre 1\n)
para aquellos valores de n, nos indica cm o crece T(n) en general.
Obsrvese tam bin que se utiliza la igualdad en (9.14), m ientras que en (9.1) hay
desigualdades. La razn es que aqu d(n) puede ser arbitraria y, por tanto, exacta,
mientras que en (9.1) la suposicin de que c2n fue el peor caso en tiem po de com
binacin, para una constante c2 y toda n, fue slo una cota superior; el peor caso
real del tiempo de ejecucin con entradas de tam ao n pudo haber sido m enor que
2T(n/2) + c2n. En realidad, hay muy poca diferencia entre utilizar - o < en la re
currencia, ya que de cualquier m odo se obtiene una cota superior para el peor caso
del tiempo de ejecucin.
Para resolver (9.14) se aplica la tcnica de sustituciones repetidas para T en el
lado derecho, igual que se hizo para un ejemplo especfico en la exposicin anterior
de la expansin de recurrencias. Esto es, la sustitucin n/tf por n en la segunda lnea
de (9.14) da
(9.15)
As, al empezar con (9.14) y sustituir (9.15) para / = 1, 2,..., se tiene
l \ n ) - a n ? - ) + d(n)
b
- a[aT( )+d( )]+d(rt) - a2T ( )+ad( )+d(n)
www.FreeLibros.me
300
Ahora, suponiendo que n - bk, se puede utilizar el hecho de que T(n/bk) - 7(1) - 1,
para tener de lo anterior, con i = k, la frmula
Tin)
t-1
ak + ^ a>d(bk- )
(9.16)
j -o
Si se aplica el hecho de que k - log^/i, el prim er trm ino de (9.16) puede escribirse
como alott" o, de forma equivalente, n^ (se toman logaritmos de base b de ambas
expresiones para ver que son lo mismo). Esta expresin es n a una potencia cons
tante. Por ejemplo, en el caso de mergesori, donde a - b = 2, el primer trm ino es
n. En general, cuanto mayor sea a, es decir, cuantos ms subproblemas haya que re
solver, tanto m ayor ser el exponente; cuanto mayor sea b, es decir, cuanto menor
sea cada subproblema, tanto m enor ser el exponente.
www.FreeLibros.me
30!
Funciones m ultiplicativas
La solucin particular de (9.16) es difcil de evaluar, aun sabiendo lo que es d(n).
Sin embargo, para ciertas funciones d(n) comunes, se puede resolver (9.16) con exac
titud, y hay otras para las cuales se puede conseguir una buena cota superior. Se dice
que una funcin / e n enteros es multiplicativa si f{xy) = Jlx]f[y) para todos los en
teros positivos x e y.
Ejemplo 9.2. Las funciones multiplicativas de m ayor inters son de la forma na
para cualquier a positiva. Para dem ostrar que J[n) = na es multiplicativa, slo hay
que observar que (x>>)a - Xa}*1.
Ahora, si din) de (9.16) es m ultiplicativa, entonces d (tf~ ) *= (d(b))k ~>. y la so
lucin particular de (9.16) es
d(b)
0 ( (O)
* il T i r - 1
d(b)
(9.17)
d(b)
Hay tres casos a considerar, dependiendo de si a es mayor, m enor o igual que d(b).
t Pero no debe esperarse descubrir una manera de com binar dos lisias clasificadas de n/ 2 elem entos
en un tiem po menor que el lineal; en ese caso, no seria posible siquiera ver todos los elem entos de la lista.
www.FreeLibros.me
302
1.
Si a > d(b), la frmula (9.17) es 0(ak), que como se recuerda es n10**0, ya que
k = logj/i. En este caso, las soluciones particular y homognea son iguales, y slo
dependen de a y b, y no de la funcin m otriz d. As, las mejoras en el tiempo
de ejecucin deben proceder de dism inuir a o aum entar b\ la disminucin de
d(n) no es muy til.
2.
3.
*-i
-d {b f
h0
- d (b fk
- n'**b) \ogiji
(9.18)
Com o a - d(b), la solucin particular dada por (9.18) es logbn veces la solucin
homognea, y de nuevo la solucin particular excede a la homognea. En el caso
especial d(n) - na, (9.18) se reduce a 0(t"logn), por observaciones similares a las
del caso ( 2).
Ejemplo 9.3.
1.
1\ri) - 47T(n/2) + n
2.
T(n) - 47X/2) + n 2
3.
T\n) - 4T\n/2) + n 3
www.FreeLibros.me
303
Considrese
7X1)- 1
T(n) - iT (n /2 ) + 2 n ' 5
Ahora, 2n 15 no es m ultiplicativa, pero ' 5 s lo es. Sea U(n) = T(n)/2 para toda n.
Entonces,
(7(1) - 1/2
U(n) - iU (n/2) + n 15
La solucin homognea, si /(l) fuera 1, sera nlo*3 = n ' 59; como f / ( l ) - 1/2, se de
muestra con facilidad que la solucin homognea es n ] 59/2; y es 0 ( n 'i9). Para la so
lucin particular se ignora el hecho de que U( 1) # 1 , dado que al increm entar 7( 1)
seguramente no se reducir la solucin particular. Como a = 3, b = 2 y 615 - 2.82 <a,
la solucin particular tam bin es 0 ( n '59), que es la tasa de crecimiento de U(n).
Como T(n) - 2U(n), T(n) tam bin es 0 (n ' ) o 0(/il0*3).
Ejemplo 9.5.
Considrese
7XD- I
T(n) - 2T(nJ2) + n\ogn
Es fcil observar que la solucin homognea es n, pues <2= 6 = 2. Sin embargo,
d(n) = nlogn no es multiplicativa, y se debe sum ar la frmula de la solucin parti
cular de (9.16) por medios apropiados. Esto es, se desea evaluar
*-l
*-!
www.FreeLibros.me
304
E jercicios
9.1
9.3
9.4
www.FreeLibros.me
EJERCICIOS
*9.5
305
Verifiqense las respuestas del ejercico 9.5 resolviendo las recurrencias por
sustitucin repetida.
9.7
'
b)
i- 0
c)
2 '
d)
.- 0
*9.11
/*
t- o
i-O
1)
- !
n +1
( ^n
T (n )~ T([n!2\)+ T(\n!2}) + n - 1
www.FreeLibros.me
306
+ I
7 X )-(7 X -1 ))2
Resulvase para T(n).
**9.14
Mustrese que el nmero de rboles binarios de altura < n est dado por
la recurrencia
7X1)- I
Notas bibliogrficas
Bentley, Haken, y Saxe [1978], Greene y K nuth [1983], Liu [1968] y Lueker [1980]
contienen m aterial adicional sobre la solucin de recurrencias. En Aho y Sloane
[1973] se dem uestra que muchas recurrencias no lineales de la forma T\n) - (7Xn - l))2 + g(n) tienen una solucin de la forma T{n) - ]A'2"J donde k es una cons
tante, como en el ejercicio 9.14.
www.FreeLibros.me
|3 0 7 |
Tcnicas de diseo
de algoritmos
1 0 .1
www.FreeLibros.me
308
F ig . 1 0 .1 .
+ En el caso de las torres de H anoi, el algoritm o div id ir para vencer es en realidad el m ism o que el
a ad o inicialm ente.
www.FreeLibros.me
Fig. 1 0 .2 .
X =
X = A 2 nl2 +B
Y :=
Y = C2nl1 + D
309
(10.1)
(10.2)
(10.3)
Aunque (10.3) parece ms complicada que (10.1), slo requiere tres multiplicacio
nes de enteros con (n/2) bits, AC, BD y (A -B )(D -Q , seis sumas o restas y dos des
plazamientos. Como todas las operaciones, excepto las multiplicaciones, requieren
0(n) pasos, el tiempo T(n) para multiplicar enteros de n bits por (10.3) est dado por
7X D - 1
T(n) - 3T(n/2) + en
cuya solucin es 7\n ) - 0(n'*iJ) - 0 ( n I S9).
El algoritmo completo, incluyendo los detalles implicados por el hecho de que
(10.3) requiere multiplicaciones de enteros de (n/2) bits tanto negativos como posi
tivos, est dado en la figura 10.3. Obsrvese que las lneas (8) a (11) se realizan co
www.FreeLibros.me
310
piando bits, y la multiplicacin por 2" y 2"/2 de la lnea (16), por desplazamientos. Del
mismo modo, la multiplicacin por s de la lnea (16) tan slo introduce el signo ade
cuado en el resultado.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(13)
(14)
(15)
(16)
www.FreeLibros.me
311
Balanceo de subproblemas
En el diseo de algoritmos siempre hay que afrontar varios compromisos. Ha sur
gido la regla de que suele ser ventajoso balancear los costos de competencia siempre
que sea posible. Por ejemplo, en el capitulo 5 se vio que los rboles 2-3 balanceaban
los costos de bsqueda con los de insercin, mientras que los mtodos ms directos
requieren 0 (n ) pasos por cada bsqueda o por cada insercin, aun cuando la otra
operacin pueda efectuarse en un nm ero constante de pasos.
En forma semejante, para los algoritmos de dividir para vencer, casi siempre es
mejor que los subproblemas tengan un tam ao aproxim adam ente igual. Por ejem
plo, la clasificacin por inserciones puede considerarse como la divisin de un pro
blema en dos subproblemas, uno de tam ao 1 y otro de tam ao n - 1, con un costo
mximo de n pasos para combinarlos. Esto da la recurrencia
T(n) = 7X1) + T(n - 1) + n
que tiene una solucin 0 (n 2). La clasificacin por intercalacin, por otra parte, di
vide el problema en dos subproblemas de tam ao n/2 y tiene un rendimiento
www.FreeLibros.me
312
iffl
2 3
1 2
5 6
2
1
3 4
4 3
4
3
1 2
2 1
2
1
4
3
3
4
1
2
4
3
2
1
5
6
7
8
6
7
8
5
8
5
6
7
6
5
8
7
7
8
5
6
8
7
6
5
1
2
3
4
Fig. 10.4.
7
8
5
6
3 2
14 3
2 14
3 2 1
O{n\ogn). Como principio general, a m enudo resulta que dividir un problema en subproblemas iguales o casi iguales es un factor crucial para la obtencin de un buen
rendimiento.
1 0 .2
Programacin dinmica
www.FreeLibros.me
313
P(, j ) = 1 si i = 0 y j > 0
= 0
si i >
0y
j 0
= ( / ( - 1 . + P{i, j - 1))/2
si / > 0 y
7>
(10.4)
www.FreeLibros.me
314
1/2
21/32
11/32
3/16
1/16
1/2
13/16
11/16
5/16
1/2
1/4
1/8
0
15/16
7/8
3/4
1/2
0
1
1
1
1
0
- i
Fig. 10.5.
Fig. 10.6.
Tabla de apuestas.
Patrn de computacin.
El anlisis de la funcin apuestas es fcil. El ciclo de las lneas (4) a (5) requiere
un tiem po 0(5), y dom ina el tiempo 0(1) de las lneas (2) a (3). As, el ciclo externo
requiere un tiempo 0 ( s ) u 0 (n 2), donde i + j - n. Con ello, la programacin dinmica requiere un tiempo 0(n2), comparado con 0( 2"/ \Jn) para el enfoque direc
to. Puesto que 2/V crece mucho ms rpido que n2, casi siempre es preferible uti
lizar la programacin dinm ica que el enfoque recursivo.
function apuestas ( i. j: integer) : real;
var
5 , k: integer,
begin
www.FreeLibros.me
(1)
(2)
(3)
(4)
(5)
for s
315
1 to / + j do begin
I calcular la diagonal de las posiciones cuyos ndices se suman a r I
PIO, s] > 1.0;
F[s, 0 ] 0 . 0 ;
for / c 1 to 5 1 do
P[k, s - k ] ( P [ k - 1, 5 - k] + P[k, s - k - l])/2.0
end;
(6)
Clculo de apuestas.
Problema de la triangulacin
Como otro ejemplo de programacin dinm ica, considrese el problema de la trian
gulacin de un polgono. Se dan los vrtices de un polgono y una m edida de la dis
tancia entre cada par de vrtices. La distancia puede ser la normal (euclidiana) en
el plano, o puede ser una funcin de costo arbitraria dada por una tabla. El proble
ma consiste en seleccionar un conjunto de cuerdas (lneas entre vrtices no adyacen
tes) de modo que dos cuerdas no se crucen entre s y que todo el polgono quede di
vidido en tringulos. La longitud total (distancia entre puntos finales) de las cuerdas
seleccionadas debe ser mnima. Ese conjunto de cuerdas se llama triangulacin m ini
mal.
Ejemplo 10.1. La figura 10.8 m uestra un polgono de siete lados y las coordenadas
(x, y) de sus vrtices. La funcin de distancia es la distancia normal euclidiana. Una
triangulacin no minimal, se muestra por medio de las lneas de puntos. Su costo es
la suma de las longitudes de las cuerdas (v0, v2), (v0, v3), (v0, v) y (v3, v), o V 8 2+ 162 +
+ V 1 5 2+ 162 + V 2 2 2+ 2 2 + V 7 2+ 142 = 77.56.
Adems de ser interesante por s mismo, el problema de la triangulacin tiene
diversas aplicaciones tiles. Por ejemplo, Fuchs, Kedem, y Uselton [1977] usaron
una generalizacin del problema de la triangulacin para el propsito siguiente. Con
sidrese el problema de sombrear la imagen bidim ensional de un objeto cuya super
ficie est definida por una coleccin de puntos en un espacio tridim ensional. La fuen
te de luz proviene de una direccin dada, y el brillo de un punto en la superficie de
pende de los ngulos entre la direccin de la luz, la direccin de la vista del obser
vador y una perpendicular a la superficie en ese punto. Para estim ar la direccin de
la superficie en un punto, se calcula una triangulacin m nim a de los puntos que de
finen la superficie.
Cada tringulo define un plano en el espacio tridim ensional, y dado que se en
contr una triangulacin mnima, es de esperarse que los tringulos sean muy pe
queos. Es fcil encontrar la direccin de una perpendicular a un plano, as que se
calcula la intensidad de la luz para los puntos de cada tringulo en el supuesto de
que la superficie puede considerarse como un plano triangular en una regin dada.
Si los tringulos no son suficientemente pequeos como para hacer que la intensidad
de la luz aparezca suave, entonces obtener el promedio local puede mejorar la imagen.
www.FreeLibros.me
316
www.FreeLibros.me
Fig. 10.9.
317
las cuerdas que parten de dos vrtices adyacentes. Por ejemplo, en la solucin de la
figura I0.9(b), se considera la seleccin de la cuerda (v3, v5), la cual deja el subproblema ( v v 3, v 5, v 6) , un polgono en el cual dos lados, ( v 0, v 3) y ( v 3, v 5), son cuerdas
del polgono original. Este camino conduce a un algoritmo de tiempo exponencial.
Sin embargo, considerando el tringulo que incluye la cuerda (Vq, vt ) nunca se tie
nen que considerar polgonos en los cuales ms de un lado sean cuerdas del polgo
no original. El hecho 2 dice que, en la triangulacin mnima, la cuerda del subproblema, como (v0, v3) de la figura I0.9(b), debe form ar un tringulo con uno de los
otros vrtices. Por ejemplo, si se selecciona v4, se forma el tringulo (v0, v3, v4) y el
subproblema (v0, v4, v5, v6), que slo tiene una cuerda del polgono original. Al pro
bar con v5, se forman los subproblemas (v3, v4, v5) y (v0, v5, v6), con las cuerdas
(v3, vs) y (v0, v5) nada ms.
En general, se define el subproblema de tam ao s partiendo de! vrtice v deno
tado S, como el problema de triangulacin m inim al para el polgono formado por
los s vrtices que comienzan en v, y siguen en el sentido de las manecillas del reloj,
esto es, v v,, ...,
La cuerda en S, es (v v14J.,). Por ejemplo, en la figura I0.9(a)
es
y en la figura 10.9 (b) es S 3i. Para resolver
debemos considerar las tres op
ciones siguientes.
1. Tom ar el vrtice v,_2 para form ar un tringulo con las cuerdas (v
(v vltJ_2) y con el tercer lado (v,.,_2,
y despus resolver el subproblema 5U_,.
2. Tom ar el vrtice v1+1 para form ar un tringulo con las cuerdas (v
(v,, v<4J_,) y con el tercer lado (v vltl), y despus resolver el subproblema
3. Para alguna k entre 2 y s - 3, tom ar el vrtice vtk y form ar un tringulo con la
dos (v v,,*)
y (v
y despus resolver los subproblemas S,**, v
W *Si se recuerda que la solucin a cualquier subproblema de tam ao tres o me
nor no requiere accin alguna, se puede resumir (1) a (3) diciendo que se toma al-
www.FreeLibros.me
318
Fig. 10.10.
Divisin de S en subproblemas.
www.FreeLibros.me
(10.5)
319
D ( v 6, v 2)
+ D(v2,
Vj )
Co7
75.43
6
5
Co6 =
53.54
0)5
37.54
4
s
C (M =
16.16
i= 0
c*=
59.78
C 16=
55.22
C 26~
57.58
64.69
C ,5 =
C25=
35.49
c 35=
37.74
C 45
=
45.50
c 55=
39.98
C j4 =
c=
22.69
4
c=
22.69
31.81
C , 4=
16.16
1
15.65
2
Fig. 10.11.
^ 36-
15.65
3
C 56~
59.78
^*66
63.62
^65 =
38.09
C M =
17.89
6
Tabla de C.
(puesto que son aristas del polgono, no cuerdas, y se presentan en forma gratuita)
D( v6< v2) - 26.08
T)(V|, v3) - 16.16
Z*v6, v , ) - 22.36
D(v0, v j ) - 21.93
www.FreeLibros.me
320
Las tres sum as anteriores dan 38.09, 38.52 y 43.97, respectivamente. Se conclu
ye que el costo m nim o del subproblema S65 es 38.09. Ms an, como la primera
suma fue la menor, se sabe que para alcanzar este valor es necesario utilizar los subproblemas S 62 y -So*, esto es, seleccionar la cuerda (v0, v3) y resolver S M como se pue
da; la cuerda (v,, v3) es la eleccin preferida para este subproblema.
Existe un truco til para llenar la tabla de la figura 10.11 de acuerdo con la frmu
la (10.5). Cada trm ino de la operacin m in de (10.5) requiere un par de valores.
El prim er par, para k = 1, puede encontrarse en la tabla a) en la parte inferior (la
fila de 5 = 2) f de la columna del elemento que se est calculando, y b) justo abajo
y a la derecha t t del elemento calculado. El segundo par est a) jun to a la parte in
ferior de la columna, y b) dos posiciones m s abajo y a la derecha. La figura 10.12
muestra las dos lneas de posiciones que se siguen para obtener todos los pares de
valores que es necesario considerar sim ultneamente. El patrn subir por la co
lum na y bajar por la diagonal es comn para el llenado de tablas durante la pro
gramacin dinmica.
Fig. 10.12.
www.FreeLibros.me
ALGORITM OS AVIDOS
321
el problema $07 se divide en $06 y Sn* el prim ero es el problem a con seis vrtices v0,
V!
v5, y el ltim o es un problema trivial de costo 0. As, se introduce la cuerda
(v0, v5) de costo 22.09 y se debe resolver S06.
El costo m nim o de *-06 procede de los trm inos para k 2 en (10.5), en tanto el
problema S,* se divide en 503 y S 24. El primero es el tringulo con vrtices v0, v, y
v2, mientras que el ltim o es un cuadriltero definido por v2, Vj, v4 y v5. S03 no ne
cesita ser resuelto, pero S24 s, y deben incluirse los costos de las cuerdas (v0, v2) y
(v2> vs)> *os cuales son 17.89 y 19.80, respectivam ente. El valor m nim o para C24 se
supone cuando k - 1 en (10.5), dando los subproblemas C22 y C33, que tienen tam a
o m enor o igual que tres y, por tanto, costo 0. Se introduce la cuerda (v}, vs), con
un costo de 15.65.
1 0 .3
Algoritm os vidos
www.FreeLibros.me
322
Fig. 10.14.
Sin embargo, esta seleccin vida d e b antes que c fue errnea desde un
punto de vista general. D ado que el camino s - ~ a c -*b tiene una longitud de slo
2, la distancia m nim a de 3 para b fue errnea f-
www.FreeLibros.me
ALGORITM OS AVIDOS
323
0 ,7 )
b (4, 3)
( 0 . 0)
(a)
Fig. 10.15.
/ (18,0)
seis ciudades1
www.FreeLibros.me
324
gresar al punto inicial. Por ejemplo, el PAV se ha usado para seleccionar la ruta de
los recolectores de dinero de telfonos pblicos. Los vrtices son los tlefonos y la
oficina de cobro. El costo de cada arista es el tiem po del viaje entre los dos sitios
en cuestin.
O tra aplicacin del PAV es la resolucin del problema del recorrido del caballo
para encontrar una secuencia de m ovim ientos de m odo que el caballo pueda visitar
cada cuadro del tablero de ajedrez slo una vez y regrese al punto de partida. Se dan
com o vrtices los cuadros del tablero de ajedrez y las aristas entre dos cuadros que
son un m ovim iento del caballo con peso 0; las dems aristas tienen peso infinito.
Un recorrido optim al tiene peso 0 y debe ser un recorrido del caballo. Sorprenden
tem ente, los procedimientos heursticos buenos para el PAV no tienen dificultad en
encontrar los recorridos del caballo, pero encontrar uno a m ano es un reto.
El algoritmo vido para el PAV que se tiene en mente es una variante del
algoritmo de Kruskal. Com o en dicho algoritmo, primero se considerarn las aristas
m s cortas. En el algoritmo de Kruskal, se acepta una arista en su tum o si no forma
un ciclo con las que ya han sido tomadas; en caso de no cum plir esto, rechaza la aris
ta. Para el PAV, el criterio de aceptacin es que una arista som etida a considera
cin, jun to con las que ya se han seleccionado,
1.
2.
Las colecciones de aristas seleccionadas con ese criterio, form arn una coleccin
de cam inos no conexos, hasta el ltim o paso, cuando el nico cam ino existente
est cerrado y forme un recorrido.
En la figura 10.15(a), se puede tom ar prim ero la arista {d, e), puesto que es la
ms corta, con longitud 3. Despus, las aristas (b, c), (a, b) y (e,./), que tienen lon
gitud 5. No im porta en qq orden se tom en, todas cumplen con las condiciones de
seleccin, y han de seleccionarse si se quiere seguir el enfoque vido. La si
guiente arista ms corta es (a, c), con longitud 7.08. Sin embargo, esta arista puede
form ar un ciclo con (a, b) y (b, c), por lo que se rechaza. La arista (d ,/) es la siguien
te que se rechaza por m otivos similares. La arista (b, e) es la siguiente a considerar,
pero debe rechazarse porque puede aum entar los grados de los vrtices b y e a 3, y
nunca form ara un recorrido con lo seleccionado. De modo similar, se rechaza
(b, d). A continuacin se considera (c, d), que s se acepta. Ahora existe un camino,
a - * b - * c - * d e - / y por ltim o se acepta (a, J) para completar el recorrido. El
recorrido resultante est en la figura 10.15(b), y es el cuarto m ejor de todos los po
sibles, pero es ms costoso que el optim al en menos del 4%.
1 0 .4
www.FreeLibros.me
M ETODO DE RETROCESO
325
movimiento de X
movimiento de X
movimiento de O
o
0
X
movimiento de X
0
0
0
Fig. 10.16.
X
X
I
0
www.FreeLibros.me
X
0
326
Punciones de utilidad
La idea de un rbol de juego, donde los nodos tienen valores -1 , 0 y 1, puede gene
ralizarse a rboles donde a las hojas se les da un nm ero cualquiera (llamado la uti
lidad) como valor, y se aplican las mismas reglas de evaluacin de nodos interiores:
toma el mximo de los hijos en los niveles donde corresponda un movimiento del
jugador 1, y el m nim o de los hijos en los niveles donde mueve el jugador 2.
Como ejemplo de donde son provechosas las utilidades generales, considrese un
juego complejo como el ajedrez, donde el rbol de juego, aunque finito, es tan in
menso que la evaluacin de abajo arriba no es posible. Los programas de ajedrez ope
ran construyendo el rbol de juego con ese tablero como raz para cada posicin del
tablero desde la cual se debe mover extendindose hacia abajo por varios niveles; el
nmero exacto de niveles depende de la velocidad con que el com putador puede tra
www.FreeLibros.me
M ETO DO DE RETROCESO
327
bajar. Puesto que la mayor parte de las hojas del rbol son ambiguas, no indican
triunfos, derrotas, ni empates, cada programa usa una funcin de las posiciones del
tablero que intenta evaluar la probabilidad de que el com putador gane desde esa po
sicin. Por ejemplo, la diferencia entre las piezas afecta en gran m edida tal estim a
cin, al igual que algunos factores, como el poder defensivo alrededor de los reyes.
Al usar esta funcin de utilidad, el com putador puede estim ar la probabilidad de un
triunfo despus de hacer cada uno de sus siguientes m ovim ientos posibles en el su
puesto de que se har la mejor jugada siguiente de cada lado, y se escoger el mo
vimiento de m ayor utilidad f-
Las utilidades son nm eros reales en un intervalo limitado, por ejem plo -1 a +1.
La constante oo es m ayor que cualquier utilidad positiva y su negativo es m enor
que cualquier utilidad negativa.
El tipo tipo_m odo se declara
type
tipo_m odo - (MIN, MAX)
4.
t Inicialm ente, otras cosas que hacen los programas para jugar al ajedrez son las siguientes.
1. Usar tcnicas heursticas para elim inar la consideracin de ciertos m ovim ientos q ue tal vez no se
rn buenos. Esto ayuda a expandir el rbol a m s niv eles en un tiem po dado.
2. Expandir cadenas de captura que son secuencias d e m ovim ientos d e captura ms all del ltim o
nivel al que se expande el rbol norm alm ente. Esto ayuda a estim ar con m ayor exactitud la fuerza
material relativa de las posiciones.
3. Podar el rbol de bsqueda por m ed io de la tcnica alfa-beta, com o se analizar m s adelante en
esta seccin.
t t Esto no im plica que d e esta forma slo se puedan resolver juegos. C om o se ver en ejem plos pos
teriores, el juego puede representar en realidad la solu cin de un problema prctico.
www.FreeLibros.me
328
5.
Existe una funcin UTILIDAD que calcula la utilidad de cualquier tablero que
sea una hoja (esto es, situacin de triunfo, derrota o empate).
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
Fig. 10.17.
Poda alfa-beta
Hay una observacin simple que permite dejar de considerar buena parte de un r
bol de juego tpico. Partiendo de la figura 10.17, el ciclo for de la lnea (6) puede
saltar ciertos hijos, con frecuencia muchos. Supngase que se tiene un nodo n, como
en la figura I0.I8, y ya se ha determ inado que cx, el primero de ios hijos de n, tiene
valor 20. Como n es un nodo mx, se sabe que su valor es por lo menos 20. Ahora,
supngase que al continuar con la bsqueda se observa que d. un hijo de c2, tiene
valor 15. Como c2, otro hijo de n. es un nodo mn, se sabe que el valor de c2 no pue
www.FreeLibros.me
M ETODO DE RETROCESO
329
tentativo es una cota superior al valor del nodo mn, o una cota inferior al valor del
nodo mx. Las reglas para el clculo de los valores finales y tentativos son las siguien
tes.
Si todos los hijos de un nodo n se consideraron o se podaron, convirtase el va
lor tentativo de n en final.
2. Si un nodo mx n tiene valor tentativo v, y un hijo con valor final v2, entonces
el valor tentativo de n se hace mx(v,, v2). Si n es un nodo mn, se asigna su va
lor tentativo a mn(v,, v2).
3. Si p es un nodo mn con padre q (un nodo mx), y p y q tienen valores tentati
vos v, y v2, respectivamente, con v, < v2, entonces se pueden podar todos los hi
jos no considerados de p. Tambin se pueden podar los hijos no considerados de p
si p es un nodo mx (y por tanto, q es un nodo mn) y v 2 < v,.
1.
Ejemplo 10.7. Considrese el rbol de la figura 10.19. Suponiendo los valores mos
trados en las hojas, se desea calcular el valor de la raz; se empieza con un recorrido
en orden final. Despus de alcanzar el nodo Dy por la regla (2) se asigna un valor ten
tativo de 2 al nodo C, que es el valor final de D. Entonces se explora E y se vuelve
a C y despus a B. Por la regla (1), el valor final de C se fija en 2 y el valor de B se
hace tentativam ente 2. La bsqueda desciende hasta G y despus regresa a F. El va
lor de F se hace tentativam ente 6. Por la regla (3), con p y q iguales a F y B, respec
www.FreeLibros.me
330
tivam ente, se puede podar H. Esto es, no se necesita explorar el nodo H, ya que el
valor tentativo de F nunca puede decrecer y ya es mayor que el valor de B, que no
puede aumentar.
Fig. 10.19.
Arbol de juego.
www.FreeLibros.me
M ETODO DE RETROCESO
331
www.FreeLibros.me
332
Fig. 10.20.
ciones, como se sugiri en la figura 10.20. Primero, supngase que se desea una cota
inferior para todas las soluciones de un caso dado del PAV. Obsrvese que el costo
de cualquier recorrido puede expresarse como la semisuma, sobre todos los nodos
n, del costo de las dos aristas del recorrido adyacentes a n. Esta observacin da lu
gar a la siguiente regla: la suma de las dos aristas de recorrido adyacentes al nodo
n no es m enor que la suma de las dos aristas de costo m enor adyacentes a n. As,
ningn recorrido puede costar menos que la semisuma sobre todos los nodos n de
las dos aristas de m enor costo que inciden sobre n.
Por ejemplo, considrese el caso del PAV que se m uestra en la figura 10.21. A
diferencia del caso de la figura 10.15, la m edida de la distancia de las aristas no es
euclidiana, es decir, no tiene relacin con la distancia en el plano entre las ciudades
que conecta. Tal m edida del costo puede ser el tiempo o la tarifa del viaje, por ejem
plo. En este caso, las aristas de m enor costo adyacentes al nodo a son (a, d) y (a, b),
con un costo total de 5. Para el nodo b, se encuentran (a, b) y (b, e) con un costo to
tal de 6. De igual forma, las dos aristas de m enor costo adyacentes a c, d y e, tota
lizan 8. 7 y 9. respectivamente. Asi pues, la cota inferior del costo de un recorrido
es (5+6+8+7+9)/2 = 17.5.
Ahora, supngase que se pide una cota inferior en el costo de un subconjunto de
recorridos definidos por algn nodo en el rbol de bsqueda. Si el rbol de bsque
da se construye como en el ejemplo 10.8, cada nodo representa recorridos definidos
www.FreeLibros.me
M ETODO DE RETROCESO
333
t Se ver que las reglas para la construccin del rbol de bsqueda elim inan cualquier conjunto d e res
tricciones que no puedan producir un recorrido, por ejem plo, porque se requieran tres aristas adyacentes
a un nodo para formar pane del recorrido.
www.FreeLibros.me
334
www.FreeLibros.me
335
Considrense prim ero los hijos de F. La primera arista restante en orden lexico
grfico es (b. c), y si se incluye, al haber incluido ya (a, b ), no se pueden incluir (b. d)
ni (b, e). Al haber elim inado (a. e) y (b, e), se deben tener (c, e) y (d. e). No se puede
tener (c, d), porque entonces c y d tendran 3 aristas incidentes. Queda, por ltimo
un recorrido (a. b. c. e, d. a), cuyo costo es 23. Igualmente, el nodo /, donde (b. c)
est excluida, puede probarse que representa slo el recorrido (a. b. e, c. d. a), de cos
to 21. Este recorrido tiene el m enor costo encontrado hasta el momento.
Ahora se retrocede a y se considera su segundo hijo, G. Pero G tiene una cota
inferior de 23, la cual excede al mejor costo actual, 21. As, se poda G. Ahora, se re
trocede hasta B y se considera su otro hijo, D. La cota inferior en D es 20.5, pero
debido a que los costos son enteros, se sabe que ningn recorrido representado por
D tiene costo m enor que 21. Dado que ya existe un recorrido tan econmico, no es
necesario explorar los descendientes de D y, por tanto, se poda. Ahora, se retrocede
hasta A y se considera su segundo hijo, C.
En el nivel del nodo C, slo se ha considerado la arista (a, b). Los nodos J y K
se introducen como hijos de C. J corresponde a aquellos recorridos que tienen a
(a. c), pero no a (a. b), y su cota inferior es 18.5. K corresponde a los recorridos que
no contienen (a, b) ni (a. c), y se infiere que esos recorridos tienen a (a. d) y (a, e).
La cota inferior de K es 21 y se puede podar de inmediato, dado que ya se conoce
un recorrido de m enor costo.
A continuacin se consideran los hijos en J, L y M y se poda M porque su cota
inferior excede del costo del mejor recorrido actual. Los hijos de L son N y P. corres
pondientes a recorridos que tienen (b, c), y que excluyen a (b, c). Considerando el
grado de los nodos b y c, y recordando que las aristas seleccionadas no pueden for
m ar un ciclo con menos de cinco ciudades, se infiere que los nodos N y P represen
tan recorridos individuales. Uno de esos, (a. c, b, e. d. a), tiene m enor costo que cual
quier otro, 19. Ya se ha explorado o podado todo el rbol y, por tanto, se ha term ina
do.
1 0 .5
www.FreeLibros.me
336
Fig. 10.22.
www.FreeLibros.me
337
Fig. 10.23.
www.FreeLibros.me
338
10.24. Si se tiene suerte, una de ellas ser globahnente optimal, esto es, tan buena
como cualquier otra solucin.
En la prctica, tal vez no se pueda encontrar una solucin globalmente optimal
como la que se sugiere en la figura 10.24, ya que el nm ero de soluciones localmen
te optimales puede ser enorme. Sin embargo, es.posible escoger por lo menos aque
lla solucin localmente optimal que tenga el m enor costo entre todas las que se en
contraron. Como el nm ero de clases de transform aciones locales utilizadas para re
solver varios problem as es muy grande, se cerrar la seccin con dos ejemplos: el
PAV y un problema simple de colocacin de paquetes.
Costo
Localmente optimal
optimal
Fig. 10.24.
t N o hay que dejarse engaar por el dibujo de la figura 10.25. Es cierto que si las longitudes de las
aristas son distancias en el plano, las aristas con pun tos deben ser mayores que las que reemplazan. De
hecho, las opciones dobles en el plano mejoran el costo exactam ente cuando las aristas elim inabas, {A, B)
y (C. D ), se cruzan, m ientras que las reem plazadas no lo hacen. Sin embargo, no existe m otivo alguno para
suponer que las distancias de la figura 10.25 sean distancias en un plano, o si lo son, puede suceder que
se hayan cruzado (A. B ) y (C. D ) y no (A. O y (B. D).
www.FreeLibros.me
339
A con D y B con C, pues, el resultado no sera un recorrido, sino dos ciclos disjuntos- Para encontrar un recorrido localmente optimal, se comienza con un recorrido
aleatorio, y se consideran lodos los pares de aristas no adyacentes, como (A, B ) y
(C, D) de la figura 10.25. Si el recorrido puede mejorarse reemplazando esas aristas
por (A , C) y (B, D), se hace as, y se prosigue considerando los pares de aristas que
no se consideraron anteriorm ente. Obsrvese que las aristas introducidas (A, C) y
(B, D) deben emparejarse cada una con todas las dems del recorrido, ya que pue
den resultar mejoras adicionales.
Ejemplo 10.12. Reconsidrese la figura 10.21, para comenzar con el recorrido de la
figura I0.26(a). Se reemplazan (a, e) y (c, d), cuyo costo total es 12, por (a, d) y (c, e),
con un costo total de 1, como se m uestra en la figura 10.26(b). Despus se sustitu
yen (a, b) y (c, e) por (a, c) y (b, e), dando el recorrido optimal m ostrado en la figura
10.26(c). Se puede com probar que no haya ningn par de aristas que se pueda eli
minar de esta figura y ser reemplazado con ventaja por aristas cruzadas con los mis
mos extremos. Como un caso adicional. (6, c) y (d, e) juntas tienen el costo relati
vamente alto de 10. Pero (c, e) y (b, e) son peores, al costar juntas 14.
Fig. 10.25.
Fig. 10.26.
Opcin doble.
www.FreeLibros.me
340
2.
3.
( 4 ,D ) A C ,E )A B ,F )
6.
7.
8.
(A, Q A D , F)AB, E)
E
Fig. 10.27.
Colocacin de paquetes
El problema de la colocacin unidimensional de paquetes puede plantearse como si
gue. Se tiene un grafo no dirigido, cuyos vrtices se denominan paquetes. Las aris
tas estn etiquetadas por sus pesos, y el peso w(a, b) de la arista (a, b) es el n
www.FreeLibros.me
341
mero de hilos existente entre los paquetes a y b. El problem a es ordenar los vrtices
P\ Pi, Pn de manera que la sum a de Ii - j\ w(p,. p,) en todos los pares i y j se
minimice. Esto es, se desea m inim izar la suma de las longitudes de los hilos nece
sarios para conectar todos los paquetes con el nm ero requerido de hilos.
Al problema de la colocacin de paquetes se le han dado m uchas aplicaciones.
Por ejemplo, los paquetes pueden ser tarjetas lgicas en un fichero, y el peso de
una interconexin entre tarjetas es el nm ero de hilos que las conectan. Un proble
m a similar surge con el diseo de circuitos integrados a partir de disposiciones de
m dulos estndar e interconexiones entre ellos. U na generalizacin del problem a de
la colocacin unidim ensional de paquetes perm ite la colocacin de los paquetes,
que tienen alto y ancho, en una regin bidim ensional, al tiem po que se m inim iza la
suma de las longitudes de los hilos entre los paquetes. Este problem a tam bin es apli
cable en el diseo de circuitos integrados, entre otras reas.
Hay ciertas transform aciones locales que se podran utilizar para encontrar los
ptim os locales para diversos casos del problem a de la colocacin unidim ensional
de paquetes. He aqu algunas:
1. Intercam biar los paquetes adyacentes p, y p ,t , si el orden resultante es de costo
menor. Sea L(j) la suma de pesos de las aristas que se extienden hacia la izquier
da de pr esto es, 2
k-* I
k-j* I
joras si L(i) - /?(/') + /?(/+1) - L(i+ 1) + 2w(pn p ,,,) es negativa. Sera til verificar
esta frmula calculando los costos antes y despus del intercam bio y tom ar la
diferencia.
2. T om ar un paquete p, e insertarlo entre p, y pJ t, para algunas i y j.
3. Intercam biar dos paquetes cualesquiera p, y p.
Ejemplo 10.13. Supngase que se tiene el grafo de la figura 10.21 para representar
un caso de la colocacin de paquetes. Se considerar slo conjunto de transform a
ciones simples (1). U na colocacin inicial, a, b, c, d, e, se muestra en la figura
10.28(a); tiene un costo de 97. Obsrvese que la funcin de costo pesa las aristas por
su distancia, de m odo que (a, e) contribuye 4 x 7 - 28 al costo de 97. Considrese
el intercambio de d y e. Se tiene que L{d) - 13, R(d) - 6, L(e) - 24, y R(e) - 0. As,
L(d) - R(d) + /?(e) - L(e) + 2 w(d, ) = -5 , y se puede intercam biar d y e para m ejo
rar la colocacin a (a, b, c, e, d), con un costo de 92, como se m uestra en la figura
I0.28(b).
En la figura 10.28(b), se intercam bian c y e con cierta ventaja, produciendo la
figura 10.28(c), cuya colocacin (a, b, e, c, d) tiene un costo 91. La figura 10.28(c)
es localmente optimal para el conjunto de transform aciones (1). No es globalmente
optimal; (a, c, e, d, b) tiene un costo de 84.
Como en el PAV, es difcil estim ar exactam ente el tiem po que lleva alcanzar un
ptim o local. Slo se observa que para el conjunto de transform aciones (1), hay slo
n - 1 transformaciones a considerar. Ms an, si se calculan L(i) y R (i) una vez, tan
slo es necesario cam biarlas cuando p se intercam bia con pM o pM . Adems, cal
cular de nuevo es fcil. Si p y p, se intercam bian, por ejemplo, los nuevos L(i) y
www.FreeLibros.me
342
(a)
(b)
(c)
Fig. 10.28.
Optimaciones locales
R(i) son. respectivamente, L(i+ \) - w(pr pltl) y /?(/+!) + w(pr /?,). Asi, un tiempo
0 (n ) es suficiente para probar una transformacin de m ejora y calcular de nuevo los
L(i) y R(i). Tambin se requiere un tiempo O(n) para asignar valores iniciales a L(i)
y R(i), si se emplea la recurrencia
I(l)-0
L(i) - L ( i - 1) + MP^i, P.)
y una recurrencia similar para R.
En comparacin, los conjuntos de transformaciones (2) y (3) tienen, cada uno,
CRn2) miembros. Por tanto, llevar un tiempo 0 (n 2) tan slo confirm ar que se tiene
una solucin localmente optimal. Sin embargo, como sucedi con el conjunto (l),
no es posible acotar con exactitud el tiempo total requerido al efectuar una secuen
cia de mejoras, ya que cada mejora puede crear oportunidades adicionales de
perfeccionamiento.
Ejercicios
10.1
*10.2
10.3
*10.4
www.FreeLibros.me
EJERCICIOS
343
c)
10.6
b)
Escrbase otra vez el clculo de las apuestas de la figura 10.7 para tener
en cuenta el hecho de que el prim er equipo tiene una probabilidad p
de ganar cualquier partido dado,
Si los Dodgers han ganado un partido, y los Yankees, dos, pero los Dodgers tienen una probabilidad 0.6 de ganar cualquier juego, quin es el
ganador ms probable de la Serie Mundial?
10.8
El clculo de las apuestas de la figura 10.7 requiere un espacio 0 (n 2). Reescrbase el algoritmo para usar slo un espacio 0(n).
*10.9
10.10
10.11
www.FreeLibros.me
344
10.15
10.16
10.17
www.FreeLibros.me
NOTAS BIBLIOGRAFICAS
a)
b)
c)
345
*10.18
*10.19
10.20
Notas bibliogrficas
Hay muchos ejemplos im portantes de los algoritmos de clasificacin del resultado
por divisin, incluyendo la transform ada rpida de Fourier 0(nlogn) de Cooley y Tukey [1965], el algoritmo de la multiplicacin de enteros 0(n\o%n log logn) de Schonhage y Strassen [1971], y el algoritmo de multiplicacin de m atrices 0 (n 2t l ) de Strassen [1969]. El algoritmo de m ultiplicacin de enteros O in' 59) es de Karatsuba y Ofm an [1962]. Moenck y Borodin [1972] desarrollaron diferentes algoritmos eficien
tes del de dividir para vencer para aritm tica m odular y evaluacin e interpolacin
polinomiales.
La programacin dinm ica fue popularizada por Bellman [1957], La aplicacin
de programacin dinm ica a la triangulacin se debe a Fuchs, Kedem y Uselton
[1977]. El ejercicio 10.11 es de K nuth [1981]. K nuth [1971] d a una solucin ai pro
blema de los rboles de bsqueda binaria oprmales del ejercicio 10.12.
En Lin y Kem ighan [1973] se describe una tcnica heurstica eficiente para el pro
blema del agente viajero.
Vanse Aho, Hopcroft y Ullman [1974], y G arey y Johnson [1979] sobre un an
lisis de problemas NP-completos y otros problem as com putacionalm ente difciles.
www.FreeLibros.me
1346)
Estructuras de datos
y algoritmos para
almacenamiento externo
Este captulo comienza considerando las diferencias en las formas de acceso entre
la memoria principal y los dispositivos de almacenamiento extem o como los discos.
Despus se presentan varios algoritmos para clasificacin de archivos de datos al
macenados en forma extema. Se concluye el captulo con un anlisis de estructuras
de datos y algoritmos, como los archivos indizados y los arboles B, que son muy ade
cuados para el alm acenam iento y recuperacin de informacin en dispositivos de al
macenamiento secundario.
1 1 .1
www.FreeLibros.me
347
tipo rbol, donde los bloques que contienen el archivo son hojas, y cada uno de los
nodos interiores apunta a varios bloques del archivo. Si, por ejemplo, cuatro bytes
son suficientes para contener la direccin de un bloque y los bloques tienen 4096
bytes de longitud, entonces un bloque raiz puede tener apuntadores hasta para 1024
bloques. As, los archivos de hasta 1024 bloques, es decir, cerca de cuatro millones
de bytes, pueden representarse con un bloque raz y los bloques que contienen el ar
chivo. Los archivos de hasta 220 bloques, o 232 bytes, pueden representarse con un
bloque raz que apunte a 1024 bloques en un nivel interm edio, cada uno de los cua
les apunta a 1024 bloques_hoja que contienen una parte del archivo, y as sucesiva
mente.
La operacin bsica en archivos consiste en llevar un solo bloque a un buffer (al
macenamiento tem poral) de la m em oria principal; un buffer no es ms que un rea
reservada de memoria principal cuyo tam ao es idntico al de un bloque. Un siste
ma operativo tpico facilita la lectura de los bloques de acuerdo con el orden en que
aparecen en la lista de bloques que conform an el archivo. Esto es, al principio se lee
el prim er bloque y se guarda en el buffer de ese archivo, despus se reemplaza por
el segundo, que queda escrito dentro del mismo buffer, y as sucesivamente.
Ahora se puede ver la razn de las reglas para la lectura de archivos en Pascal.
Cada archivo est almacenado en una secuencia de bloques, con un nm ero entero
de registros en cada bloque. (Se puede desperdiciar espacio, puesto que se evita di
vidir un registro entre bloques.) El cursor de lectura siempre apunta a uno de los re
gistros del bloque que se encuentra en el buffer en ese instante. Cuando ese cursor
se deba mover a un registro que no est en el buffer, es el momento de leer el si
guiente bloque del archivo.
Igualmente, se puede considerar el proceso de escritura de archivos de Pascal
como la creacin de un archivo en un buffer. Cuando se escriben los registros en
archivo, se colocan en el buffer de ese archivo, en la posicin inm ediata siguiente a
los registros colocados previamente. Cuando el buffer no puede contener otro regis
tro completo, se copia el buffer en un bloque disponible de memoria secundaria y
ese bloque se agrega al final de la lista de bloques del archivo. Se considera ahora
que el buffer est vaco, y que se pueden escribir ms registros en l.
www.FreeLibros.me
348
para hacer un procesamiento simple a los mil enteros una vez que estn en la me
moria principal, como la suma de ellos o la ubicacin del mximo; incluso puede
ser suficiente para clasificacin rpida de los enteros.
Cuando se evala el tiempo de ejecucin de los algoritmos que operan sobre da
tos almacenados en forma de archivos, es de prim ordial importancia considerar el
nm ero de veces que se lee un bloque a la memoria principal o se escribe un bloque
en la memoria secundaria; esa operacin se denomina acceso a bloques. Se supone
que el tam ao de los bloques lo fija el sistema operativo, asi que no se puede
hacer que un algoritmo se ejecute con m ayor rapidez incrementando el tam ao del
bloque, para reducir el nm ero de accesos a los bloques. Como consecuencia, lo que
se debe considerar para los algoritmos que emplean almacenamiento extemo ser el
nm ero de accesos a los bloques. Se inicia el estudio de algoritmos para almacena
m iento extem o con la clasificacin externa.
1 1 .2
Clasificacin externa
15
Fig. 11.1.
29
11
13
16
22
31
www.FreeLibros.me
12
CLASIFICACION EXTERNA
349
www.FreeLibros.me
350
Procedimiento combina.
www.FreeLibros.me
CLASIFICACION EXTERNA
351
www.FreeLibros.me
352
28 3 93
3 1 5 96
28
3
31
5
10
40
93 96
10 40
(b)
(c)
5 10
13 30
5
8
9
10
28 31
39 54
10
10
(a)
archivos iniciales
54
9
30
39
85
65
90
13
30
13
10 69
8 77
39
90
8
69
10
77
22
10
22
9
13
54
30
65
39
85
90
10
69
10
22
77
(d)
3
8
65
9
3
5 28 31
10 40 93 06
3
9
54
85
40 93 96
65 85 90
10
10 22 69
77
(e)
30 31 39
77
40
54
65
8590
93
96
3 5 8 8 9 10 10 10 13 22 28 30 31 39 40 54 65 69 77 85 90 93 96
(0
Fig. 11.3.
chivo que se est leyendo, tal como sucede durante el proceso de clasificacin por
intercalacin. Sin embargo, el hecho es que el tiem po transcurrido por dicho proceso
es m ayor que el tiempo empleado en el clculo efectuado con los datos presentes en
la m em oria principal. Si se clasifican archivos realmente grandes, donde la opera
cin lleva horas, el tiem po transcurrido resulta un factor importante, aun si no se
paga, y debe buscarse la forma de que el proceso de la clasificacin por intercala
cin lleve un tiempo total mnimo.
Como se ha mencionado, es comn que el tiempo para leer datos de disco o cin-
www.FreeLibros.me
CLASIFICACION EXTERNA
353
ta sea mayor que el tiempo consumido en hacer clculos simples con esos datos,
como la intercalacin. Por tanto, es de esperar que si slo hay un canal dedicado a
la transferencia de datos entre la memoria principal y la memoria auxiliar, este ca
nal formar un embotellamiento, el canal de datos estar ocupado todo el tiempo,
y el tiempo total transcurrido se igualar con el tiempo utilizado en el movimiento
de los datos. Esto es, todos los clculos se efectuarn en cuanto los datos se encuen
tren disponibles, m ientras se leen o escriben datos adicionales.
Aun en este ambiente simple, debe tenerse cuidado para asegurar la terminacin en
una cantidad mnima de tiempo. Para ver qu puede fallar, supngase que se lee,
cada vez un bloque, de dos archivos de entrada,/] y / 2, en forma alterna. Los archi
vos estn organizados en fragmentos de longitud bastante m ayor que el tam ao de
un bloque, as que para intercalar dos fragmentos es necesario leer muchos bloques
de cada archivo. Sin embargo, supngase que todos los registros contenidos en el
fragmento del archivo f t preceden a todos los registros del archivo/2. Entonces, como
se leen bloques en forma alterna, todos los bloques de / 2 tienen que permanecer en
memoria. Es posible que no haya espacio para conservar todos esos bloques en la
memoria principal, y aun si lo hubiera, es necesario, despus de leer todos los blo
ques del fragmento, esperar m ientras se copia y escribe todo el fragmento que pro
viene de / 2.
Para evitar esos problemas, se consideran las claves de los ltimos registros de
los ltimos bloques ledos de f y / 2, por ejemplo k, y k: , respectivamente. Si algn
fragmento se agota, es obvio que se lee la siguiente de otro archivo. Sin embargo, si
un fragmento no se agota, se contina leyendo un bloque de /, si k t < k 2, y de / 2,
en caso contrario. Esto es, debe determ inarse cul de los dos fragmentos tendr pri
mero todos sus registros seleccionados en ese momento en la memoria principal, y
se rellenan primero registros de ese fragmento. Si la seleccin de registros se efecta
ms rpido que la lectura, se sabe que al haber ledo el ltimo bloque de los dos frag
mentos, no puede haber ms que dos bloques llenos de registros sin intercalar; los
registros pueden estar distribuidos en tres bloques, pero no en ms.
Intercalacin mltiple
Si la lectura y escritura entre las memorias principal y secundaria es el embotella
miento, puede ahorrarse tiempo si se tiene ms de un canal de datos. Supngase
que se tienen 2m unidades de disco, cada una con su propio canal de comunicacin.
Se podran colocar m archivos,/],./^
en m de las unidades de disco, organiza
dos como fragmentos de longitud k. Entonces, se pueden leer m fragmentos, uno de
cada archivo, y combinarlos en un fragmento de longitud m k, el cual se coloca en
alguno de los m archivos de salida, g,, g2, ..., gm, cada uno tom ando un fragmento
a la vez.
El proceso de intercalacin en memoria principal puede llevarse a cabo en
0(logm) pasos por registro si se organizan los m registros candidatos, esto es, los re
gistros ms pequeos de cada archivo que hasta ese momento no se haban selec
cionado, en un rbol parcialmente ordenado u otra estructura de datos que maneje
www.FreeLibros.me
354
www.FreeLibros.me
CLASIFICACION EXTERNA
355
f
13(1)
vaco
8(3)
3(3)
vaco
2(13)
1(13)
vaco
fi
21(1)
8(1)
vaco
5(5)
2(5)
vaco
1(21)
vaco
f
vaco
13(2)
5(2)
vaco
3(8)
1(8)
vacio
1(34)
www.FreeLibros.me
356
2.
Por tanto, se considerar un modelo simple del problema que se puede presentar
cuando la intercalacin e%l cuello de botella en una clasificacin realizada con da
tos almacenados en la memoria secundaria. Especficamente, se supone que
a) Se intercalan fragmentos mucho ms grandes que los bloques.
b) Hay dos archivos de entrada y dos de salida. Los archivos de entrada estn al
macenados en un disco (o algn otro dispositivo conectado a la memoria prin
cipal a travs de un solo canal) y los archivos de salida estn en otra unidad si
milar con un solo canal.
c) Los tiempos para
1) leer un bloque
II) escribir un bloque, y
III) seleccionar suficientes registros con las claves ms pequeas entre los dos
fragmentos que se encuentran en ese m omento en memoria principal, para
llenar un bloque.
son todos iguales.
En dichos supuestos, se considera una clase de estrategias de intercalacin don
de varios buffers de entrada (espacios para contener un bloque) se ubican en la me
moria principal. En todo momento, alguno de esos buffers contendr los registros
no seleccionados de los dos fragmentos de entrada, y uno de ellos estar en el pro
ceso de ser ledo de uno de los archivos de entrada. Los otros dos contendrn la sa
lida. es decir, los registros seleccionados en el orden de intercalacin adecuado. En
todo momento, uno de esos buffers se encontrar en el proceso de escritura en al
guno de los archivos de salida y el otro se estar llenando con registros selecciona
dos de los buffers de entrada.
U na transferencia consiste en hacer lo siguiente (quiz todo al mismo tiempo):
1.
2.
www.FreeLibros.me
CLASIFICACION EXTERNA
3.
357
la escritura del otro buffer de salida en uno d e los dos archivos de salida que se
est generando.
Por las suposiciones, (1), (2) y (3) requieren el m ism o tiem po. Para obtener el mxi
mo de eficiencia, se deben efectuar en paralelo. Se puede hacer esto, a menos que
(2), la seleccin de registros con las claves m s pequeas, incluya algunos de los re
gistros que se estn leyendo en ese m omento t- As, se debe buscar una estrategia
para seleccionar los bufTers que se van a leer, de m odo que al principio de cada trans
ferencia los b registros no seleccionados con las claves menores ya se encuentren lis
tos en ios bufTers de entrada, donde b es el nm ero de registros que llenan un bloque
o buffer.
Las condiciones en las cuales la intercalacin puede efectuarse en paralelo con
la lectura son simples. Sean /c, y k 2 las claves m s grandes de todos los registros no
seleccionados en m em oria principal del prim ero y segundo fragmentos, respectiva
mente. Entonces, en la m em oria principal deben encontrarse por lo menos b regis
tros no seleccionados cuyas claves no excedan d e m n(&,, k2). En prim er lugar se
m ostrar cmo hacer la intercalacin con seis bufTers, tres para cada archivo, y des
pus se mostrar que es suficiente con cuatro buffers si se reparten entre los dos ar
chivos.
Este primer esquema se representa en el dibujo de la figura 11.5. Los dos buffers de
salida no se m uestran; existen tres bufTers para cada archivo; cada uno tiene capa
cidad para b registros. El rea som breada representa los registros disponibles, y las
claves estn en orden ascendente en el sentido de las manecillas del reloj. Siempre,
el nm ero total de registros no seleccionados es 4b (a menos que el nm ero de re
gistros que permanecen en los fragmentos que se encuentran intercalando sea me
nor). Inicialmente, se leen los dos primeros bloques de cada fragmento en los buf
fers t t - Como siempre hay 4b registros disponibles, y a lo sum o 3b pueden proceder
de un archivo, se sabe que hay por lo menos b registros que vienen de cada archivo.
Si k t y k 2 son las claves ms grandes disponibles de los dos fragmentos, debe haber
b registros con las claves iguales o menores que k y b registros con las claves me
nores o iguales que k 2. As, hay b registros con claves iguales o m enores que
mn(AT|. k2).
t Es tentador suponer que si (1) y (2) requieren el m ism o tiem po, entonces la seleccin no podra nun
ca coincidir con la lectura; si e' bloque com p'eto no se hubiera ledo an. podran seleccionarse d e entre
los primeros registros del bloque aquellos que tuvieran las claves m enores. Sin embargo, por su naturaleza,
en las lecturas de disco transcurre un periodo largo antes de q u e se encuentre el bloque y pueda realizarse
la lectura. Por tanto, la nica suposicin segura es que nada del bloque que se est leyendo en una trans
ferencia est disponible en ese m om ento para la seleccin.
t t Si stos no son los primeros fragmentos tom ados de cada archivo, entonces este paso inicial nica
m ente puede hacerse despus de leer los anteriores fragm entos y sus ltim os 4 b registros se estn interca
lando.
www.FreeLibros.me
358
La figura 11.6 sugiere un esquema con cuatro buffers. En el principio de cada trans
ferencia, estn disponibles 26 registros. Dos de los buffers de entrada estn asigna
dos a uno de los archivos; 5 , y B 2 de la figura 11.6 estn asignados al archivo uno.
U no de estos buffers estar parcialm ente lleno (vaco en el caso extremo), y el otro,
lleno. El cuarto buffer no dst com prom etido, y se llenar desde unb de los archivos
durante la transferencia.
Se m antendr, por supuesto, la propiedad que permite intercalar en paralelo con
la lectura; al menos 6 registros de la figura 11.6 deben tener claves menores o igua
les que m in (kt, k2), donde k y k2 son las claves de los ltim os registros disponibles
en los dos archivos, como se indica en la figura 11.6. Se denom ina segura a la con
figuracin que cumple esa propiedad. Al principio, se lee un bloque de cada frag-
www.FreeLibros.me
CLASIFICACION EXTERNA
359
*4
*2
*1
if
B2
*3
*\
para d archivo 1
F ig . 1 1 .6 .
para el archivo 2
m ent (este es el caso extremo, donde B , est vaco y B3 est lleno en la Fig. 11.6),
de modo que la configuracin inicial est segura. En el supuesto de que la figura
11.6 es segura, es necesario m ostrar que la configuracin lo ser despus de comple
tar la sigaiente transferencia.
Si A:, < k2, se escoge fl4 para llenarlo con el siguiente bloque del archivo uno y,
en otro caso, llenarlo con el del archivo dos. Supngase primero que k t < k,. Ya
que B y fi3 de la figura 11.6 tienen exactam ente b registros, se debe, durante la si
guiente transferencia, agotar B x\ de otra forma, es necesario agotar B3 y contradecir
la seguridad de la figura 11.6. As, despus de una transferencia, la configuracin se
ve como en la figura 11.7(a).
Para com probar que la figura 11.7(a) es segura, considrense dos casos. Primero,
si kh la ltima clave del bloque recin ledo Bit es m enor que k 2, entonces, como B4
est lleno, es muy probable que haya b registros iguales o menores que mn(/c3, k 2),
y la configuracin es segura. Si k 2 < k it y dado que se supuso que fc, < k 2 (de otro
modo se hubiera llenado
del archivo dos), los b registros de B2 y B- tienen claves
menores o iguales que mn(A:2, Ac3) = k 2.
Ahora se estudiar el caso donde k > k 2 en la figura 11.6. Se escoge leer el si
guiente bloque del archivo dos. La figura 11.7(b) muestra la situacin resultante.
Como en el caso k < k 2, se argumenta que B, debe agotarse y, por eso, se muestra
que el archivo uno tiene asignado slo el buffer B2 de la figura 11.7(b). La demos
tracin de que esta figura es segura es igual que la de la figura 11.7(a).
www.FreeLibros.me
360
a
f|
*4
*4
y//// k2
B.
B,
para el archivo 1
para el archivo 2
para el archivo I
(a)
Fljj. 11.7.
1 1 .3
para el archivo 2
(b)
Configuracin despus de una transferencia.
En esta seccin, se analizan las estructuras de datos y los algoritmos para el alma
cenamiento, y recuperacin de informacin en archivos almacenados en forma ex
tem a. Se considerar un archivo como una secuencia de registros, donde cada regis
tro consiste en la misma secuencia de campos. Los campos pueden ser de longitud
fija , con un nm ero predeterm inado de bytes, o de longitud variable, con un tam ao
arbitrario. Los archivos con registros de longitud fija se suelen utilizar en los siste
mas de adm inistracin de bases de datos para alm acenar datos muy estructurados.
Los archivos con registros de longitud variable se usan tpicam ente para almacenar
informacin de textos; no estn disponibles en Pascal. En esta seccin, se supondr
www.FreeLibros.me
361
que slo hay campos de longitud fija; las tcnicas empleadas en los registros de lon
gitud fija pueden modificarse con facilidad para trabajar con registros de longitud
variable.
Las operaciones con archivos que se considerarn son las siguientes:
1. INSERTA un registro determ inado en un archivo en particular.
2. SUPRIM E de un archivo en particular todos los registros que tengan un valor
asignado en cada campo de conjunto de campos designado.
3. MODIFICA todos los registros de un archivo en particular asignando valores
asignados a ciertos campos en los registros que tengan un valor asignado en otro
conjunto de campos.
4. RECUPERA todos los registros que tengan valores asignados en cada uno de
los campos de un conjunto asignado.
Ejemplo 11J . Por ejemplo, si se tiene un archivo cuyos registros constan de tres
campos: nombre, direccin y telfono. Se podr preguntar por todos los registros con
telfono - 555-1234, insertar el registro (Juan Prez, calle Manzana 12, 555-1234) o
elim inar todos los registros con nombre - Juan Prez y direccin - calle Manza
na 12. Como otro ejemplo, se puede desear la modificacin de todos los registros
con nombre - Juan Prez para fijar el campo telfono a 555-1234.
En buena medida, se pueden considerar las operaciones con archivos como si los
archivos fueran conjuntos de registros y las operaciones fueran las que se analizaron
en los captulos 4 y 5. Sin embargo, existen dos diferencias importantes. Primero,
cuando se habla de archivos en dispositivos de alm acenam iento externo, es forzoso
utilizar la medicin del costo comentada en la seccin 11.1, en la evaluacin de las
estratgias de organizacin de archivos. Esto es, se supone que los archivos estn al
macenados en cierta cantidad de bloques fsicos, y que el costo de una operacin es
el nmero de bloques que se van a leer en memoria principal o escribir desde me
moria principal en el almacenamiento extemo.
La segunda diferencia es que los registros, siendo tipos de datos concretos en la
mayora de los lenguajes de programacin, puede esperarse que tengan apuntadores
a ellos, mientras que los elementos abstractos de un conjunto, norm alm ente no ten
drn apuntadores hacia ellos. En particular, los sistemas de bases de datos con fre
cuencia hacen uso de apuntadores a registros cuando organizan datos. La consecuen
cia de dichos apuntadores es que los registros suelen considerarse adheridos; no pue
den moverse por ei almacenamiento, debido a la posibilidad de que un apuntador
de algn lugar desconocido no consiga apuntar al registro si ste se ha movido.
Una forma simple de representar apuntadores a registros es la siguiente. Cada
bloque tiene una direccin fsica, que es la localizacin del inicio del bloque en el
dispositivo de almacenamiento externo; es funcin del sistema de archivos cuidar
las direcciones fsicas. U na forma de representar las direcciones de los registros es
usar la direccin fsica del bloque que contiene el registro junto con un desplaza
miento, que da el nmero de bytes que preceden en el bloque al principio del regis
tro. Esos pares fsicos direccin-desplazamiento pueden almacenarse en campos de
tipo apuntador a registro.
www.FreeLibros.me
362
Organizacin simple
La forma ms simple, y tam bin menos eficiente, de realizar las operaciones de ar
chivos anteriores es usar prim itivas de lectura y escritura de archivos como las de
Pascal. En esta organizacin (que en realidad es una falta de organizacin), los
registros pueden almacenarse en cualquier orden. La recuperacin de un registro con
valores especificados en ciertos campos se efecta rastreando el archivo y viendo en
cada registro si se encuentran los valores especificados. Una insercin en un archivo
puede realizarse agregando el registro al final del archivo.
Para la modificacin de los registros, se rastrea el archivo y se prueba cada re
gistro para ver si corresponde a los campos designados, y de ser as, se hacen los cam
bios necesarios en el registro. U na operacin de eliminacin trabaja casi siempre de
la misma forma, pero al encontrar un registro cuyos campos corresponden a los va
lores requeridos para que la eliminacin se lleve a cabo, se debe encontrar la forma
de elim inar el registro. Una posibilidad es correr todos los registros siguientes, una
posicin hacia adelante en sus respectivos bloques, y pasar el primer registro de cada
bloque siguiente a la ltima posicin del bloque anterior del archivo. Sin embargo,
este enfoque no funciona si los registros estn adheridos, porque un apuntador al
i-simo registro del archivo apuntara entonces al (i + l)-simo registro.
Si los registros estn adheridos, es necesario usar un enfoque distinto. Se marcan
de alguna m anera los registros eliminados, pero sin m over registros para llenar el
hueco, ni insertar un registro nuevo en ese espacio. As, lgicamente, el registro se
elimina, pero su espacio contina ocupado en el archivo. Esto es necesario para que,
si se sigue un apuntador a un registro eliminado, se descubra que el registro apun
tado fue elim inado y se tome la accin apropiada, como hacer que el apuntador sea
NIL y no se le vuelva a seguir. Dos formas de m arcar los registros cuando se elimi
nan son:
1.
2.
Sustituir el registro por algn valor que nunca pueda ser el valor de un registro
real, y cuando se siga un apuntador, suponer que el registro est eliminado si
tiene ese valor.
Que cada registro tenga un bit de eliminacin, un solo bit que es 1 en registros
que se han eliminado, y 0 en caso contrario.
www.FreeLibros.me
363
www.FreeLibros.me
364
directorio
de cubetas
Fig. 11.8.
www.FreeLibros.me
365
dio de registros por cubeta excede en m ucho de la cantidad que cabe en un bloque,
se puede reorganizar peridicamente la tabla d e dispersin increm entando al doble
la cantidad de cubetas y dividiendo cada cubeta en dos. Esas ideas se estudiaron al
final de la seccin 4.8.
Archivos Indlzados
Otra forma comn de organizar un archivo de registros es m antener el archivo cla
sificado de acuerdo con los valores de las claves. Entonces es posible buscar en el
archivo como se hara en un diccionario o en un directorio telefnico, revisando
slo el prim er nom bre o palabra de cada pgina. Para facilitar la bsqueda, se crea
un segundo archivo, llam ado ndice disperso, que consta de pares (x, b), donde x es
un valor de una clave y b es la direccin fsica del bloque en el cual el prim er regis
tro tiene la clave con valor x. El ndice disperso se m antiene clasificado de acuerdo
con los valores de las claves.
Ejemplo 11.4. En la figura 11.9, se observa un archivo y su archivo de ndice dis
perso. Se supone que tres registros del archivo principal, o tres pares del archivo de
ndices, caben en un bloque. Slo se muestran los valores de las claves de los regis
tros del archivo principal, que se suponen enteros.
Para recuperar un registro con una clave dada x, primero se busca el par (x, b)
en el archivo ndice. Lo que en realidad se busca es la z ms grande tal que z < x
y exista un par (z, b) en el archivo ndice. Despus, la clave x aparece en el bloque
b, si est presente en el archivo principal.
Hay varias estrategias para buscar en el archivo de ndices; la ms simple es la
bsqueda lineal. Se lee el archivo ndice desde el principio hasta encontrar el par
(x, b) o el prim er par (y. b), donde y > x. En el ltim o caso, el par precedente (z, b ")
debe tener z < x, y si el registro con la clave x est en algn sitio, es en el bloque b .
La bsqueda lineal slo es posible para archivos de ndices pequeos. U n m to
do ms rpido es la bsqueda binaria. Supngase que el archivo de ndices est al
macenado en los bloques b, bh ..., b. Para buscar la clave x, se toma el bloque me
dio >|I1/2, y se compara x con la clave y del prim er par de ese bloque. Si x < y, se
repite la bsqueda en los bloques b }, 2- >
1- Si x > y , pero x es m enor que
la clave del bloque 2|n/zt 1, (o si n - 1 de m odo que no hay tal bloque), se utiliza la
bsqueda lineal para ver si x corresponde al prim er componente de un par de ndi-
Fig. 11.9.
www.FreeLibros.me
366
ces en el bloque [n/2). De otra forma, se repite la bsqueda en los bloques b[n/2^ ,,
in/2] , 2,
b. Con la bsqueda binaria es necesario exam inar slo [log2(n + 1)1 blo
ques del archivo ndice.
Para asignar valor inicial a un archivo indizado, se clasifican los registros de
acuerdo con los valores de sus claves, y despus se distribuyen los registros entre los
bloques, en ese orden; se puede decidir em paquetar tantos como quepan en cada blo
que. O tra posibilidad sera preferir dejar espacio para unos registros adicio
nales que puedan insertarse m s tarde. La ventaja es que despus es menos probable
que las inserciones sobrecarguen el bloque en el cual la insercin se lleva a cabo, con
el consecuente requerimiento de tener acceso a los bloques adyacentes. Despus de
la divisin de los registros en los bloques de alguna de esas formas, se crea el archi
vo de ndices exam inando cada bloque y encontrando la prim era clave de cada blo
que. Como en el caso del archivo principal, puede dejarse algn espacio para creci
m iento posterior en los bloques que contienen el archivo de ndices.
Supngase que se tiene un archivo clasificado con registros almacenados en los
bloques 6,, b2, ..., bm. Para insertar un nuevo registro en este archivo, se emplea el
archivo de ndices para determ inar qu bloque b, debe contener el registro nuevo.
Si el registro nuevo debe quedar en b,, se coloca en el orden adecuado. Despus,
si el registro nuevo queda como prim er registro del bloque b se ajusta el archivo
ndice.
Si el registro nuevo no cabe en b hay varias estrategias posibles. Tal vez la ms
simple sea ir al bloque b ,, el cual puede encontrarse por m edio del archivo de n
dices para ver si el ltim o registro de b, puede pasarse al principio de bl t l . De ser
as, este ltim o registro se pasa a 6i+ y el nuevo puede insertarse en la posicin ade
cuada en b. El elemento del archivo de ndices correspondiente a b, , ,, y posible
m ente el de b debe ajustarse en forma apropiada.
Si ,+1 tam bin est lleno, o si b es el ltim o bloque (i - m), entonces se obtiene
un bloque nuevo del sistema de archivos. El registro nuevo se inserta en el bloque
nuevo a continuacin de br Ahora >se emplea este mismo procedim iento para inser
tar un registro que corresponda al nuevo bloque en el archivo de ndices.
www.FreeLibros.me
367
ndice denso. Para elim inar un registro, tan slo se ajusta el bit de elim inacin en
el registro, y se elim ina el elemento correspondiente en el ndice denso (tal vez, ajus
tando tambin un bit de eliminacin).
Indices secundarios
Mientras que las estructuras dispersas e indizadas increm entan bastante la veloci
dad de las operaciones basadas en claves, ninguna de ellas sirven de ayuda cuando
las operaciones implican una bsqueda de registros a partir de valores en campos
que no sean campos clave. Si se desea encontrar los registros con valores dados en
algn conjunto de campos F,
Fh es necesario un ndice secundario de aquellos
campos. Un ndice secundario es un archivo form ado de pares (v, p), donde v es una
lista de valores, uno para cada uno de los cam pos F u
Fh y p es un apuntador a
un registro. Puede haber ms de un par con una v dada, y cada apuntador asociado
indica un registro del archivo principal que tiene a v como lista de valores de los cam
pos F ,, ..., Fh
Para recuperar registros dados los valores de los cam pos F
Fk, en el ndice
secundario se buscan el o los registros con esa lista de valores. El ndice secundario
mismo puede organizarse en cualquiera de las formas com entadas para la organiza
cin de archivos por valores de claves. Esto es, se presume que v sea la clave de (v. p).
Por ejemplo, una organizacin con funcin d e dispersin en realidad no depen
de de que las claves sean nicas, aunque si hubiera m uchos registros con la misma
clave, stos podran distribuirse en cubetas de m anera no uniforme, con el efecto
de que la funcin de dispersin no increm entara m ucho la velocidad de acceso. En
el caso extremo, como cuando hay slo dos valores para los cam pos de un ndice se
cundario, todas las cubetas excepto dos estaran no vacas, y la tabla de dispersin
slo podra increm entar la velocidad de las operaciones en un factor de dos a lo
sumo, sin im portar cuntas cubetas haya. De m odo semejante, un ndice disperso
no requiere que las claves sean nicas, pero si no lo son, puede haber dos o m s blo
ques del archivo principal que tengan la misma clave menor, y todos esos bloques
se recorren al buscar registros con ese valor.
Con cualquier organizacin, de ndice disperso o de ndice con funcin de dis
persin para el archivo de ndices secundarios, puede desearse ahorrar espacio agru
pando todos los registros con el m ismo valor. Esto es, los pares (v, /,), (v, p 2),
(v, pm) pueden reemplazarse por v seguida de la lista />,, p 2, ..., pm.
Cabe preguntarse si el m ejor tiem po de respuesta a las operaciones aleatorias no
puede obtenerse al crear un ndice secundario para cada cam po, o aun para todos
los subconjuntos de los campos. Lamentablemente, hay un precio por cada ndice
secundario que se desee crear. Prim ero, est el espacio necesario para alm acenar el
ndice secundario, y eso puede ser o no un problem a, dependiendo de si el espacio
es una prioridad.
Adems, cada ndice secundario creado disminuye la velocidad de todas las in
serciones y eliminaciones. La razn es que al insertar un registro se debe insertar tam
bin un elemento para ese registro en cada ndice secundario, para que los ndices
www.FreeLibros.me
368
1 1 .4
www.FreeLibros.me
369
No se puede hacer m arbitrariam ente grande, pues cuanto m ayor sea m, mayor
deber ser el bloque. Ms an, es ms lento leer y procesar un bloque ms grande,
as que hay un valor ptim o de m que reduce la cantidad de tiem po necesario para
recorrer un rbol m-ario de bsqueda externa. En la prctica, se obtiene un valor cer
cano al m nim o para un amplio intervalo de m. (Vase Ejercicio 11.18.)
Arboles B
Un rbol B es una clase especial de rbol m-ano balanceado que permite recuperar,
elim inar e insertar registros de un archivo externo con buen rendim iento en el peor
caso. Es una generalizacin de los rboles 2-3 de la seccin 5.4. Form alm ente, un
rbol B de orden m es un rbol de bsqueda m -ano con las siguientes propiedades:
1. La raz es una hoja o tiene al menos dos hijos.
2. Cada nodo, excepto la raz y las hojas, tiene entre \m l2] y m hijos.
3. Cada camino desde la raz hasta una hoja tiene la misma longitud.
Obsrvese que todo rbol 2-3 es un rbol B de orden 3. La figura 11.10 muestra un
rbol B de orden 5, en el cual se supone que caben como mximo tres registros en
un bloque hoja.
k v P)
donde p, es un apuntador al z-simo hijo del nodo, 0 < i < n, y k, es una clave,
1 < i < n. Las claves dentro de un nodo estn clasificadas en orden tal que k, <
< k2 < ... k. Todas las claves del subrbol al que apunta p son menores que k {.
Para 1 < i < n, todas las claves del subrbol apuntado por p, tienen valores mayo
res o iguales que k, y menores que ki t ,. Todas las claves en el subrbol apuntado
por p son mayores que k.
Hay varias formas de organizar las hojas. Aqu se supondr que el archivo prin
cipal est almacenado slo en las hojas, y que cada hoja ocupa un bloque.
www.FreeLibros.me
370
Recuperacin
Para recuperar un registro r con clave x , se sigue el cam ino desde la raz hasta la
hoja que contiene a r, si es que existe en el archivo. Se sigue este camino pasando
sucesivamente nodos interiores (p0, k {, p h ..., k, p n) del alm acenam iento externo a
la memoria principal y buscando la posicin de x relativa a las claves A:,, k2,..., k.
Si k, < x < k, , a continuacin se busca el nodo apuntado por p, y se repite el pro
ceso. Si x < k ]t se aplica p0 para alcanzar el siguiente nodo; si x > kn, se utiliza p n.
Cuando este proceso llega a una hoja, debe buscarse el registro con la clave x. Si el
nmero de elementos de un nodo es pequeo, es posible utilizar la bsqueda lineal
dentro del nodo, de otra forma, conviene utilizar una bsqueda binaria.
Insercin
La insercin en un rbol B es similar a la insercin en rboles 2-3. Para insertar un
registro r con clave x en un rbol B, prim ero se aplica el procedimiento de bsqueda
para localizar la hoja L a la cual corresponde r. Si existe espacio suficiente para r en
L , se inserta r en el orden correspondiente. En este caso no se requieren modifica
ciones a los antecesores de L.
Si no hay espacio para r en L, es necesario pedir al sistema de archivos un blo
que nuevo 'p a r a pasar la segunda m itad de los registros de L a L \ insertando r en
el lugar adecuado en L o L ' f. Sea el nodo P el padre de L; P es conocido, ya que el
procedimiento de bsqueda sigui un cam ino desde la raz hasta L pasando por P.
Se aplica ahora el procedimiento de insercin recursivamente para colocar en P una
clave k y un apuntador / a L'\ k ' y / 's e insertan inm ediatam ente despus de la cla
ve y del apuntador de L. El valor de A:' es el de la clave ms pequea de L \
Si P ya tiene m apuntadores, la insercin de k y /'d e n tro de P h a r que P se di
vida y requiera la insercin de una clave y un apuntador en el padre de P. Los efec
tos de esta insercin pueden transm itirse a los antecesores del nodo L en direccin
a la raz, por el cam ino que se sigui con el procedimiento de bsqueda original. In
cluso puede ser necesario dividir la raz, en cuyo caso se crear una nueva raz con
las dos mitades de la raz anterior como sus dos hijos. Esta es la nica situacin en
la que un nodo puede tener menos de m il hijos.
Eliminacin
Para eliminar un registro r con una clave x, primero se encuentra la hoja L que con
tiene a r. Despus, se elimina r de L, si existe. Si r es el prim er registro en L, es ne
cesario ir a P, el padre de L, para ajustar el valor de la clave en la entrada de P para
que L sea el nuevo valor de la primera clave de L. Sin embargo, si L es el primer
hijo de P. la primera clave de L no se registra en P, sino que aparece en alguno de
t Esta estrategia es la ms sencilla de las vanas respuestas aplicables a la situacin en que ha de divi
dirse un bloque. En los ejercicios se m encionan algunas otras opciones que proporcionan una mayor ocu
pacin m edia de los bloques con una insercin ms laboriosa
www.FreeLibros.me
371
Fig. 11.11.
t Se pueden utilizar estrategias para evitar que los bloques hoja queden totalm ente vacos. C om o ejem
plo. a continuacin se describe un esquem a que im pide que los nodos interiores queden ocupados en m e
nos de la mitad de su capacidad, y esta tcnica se puede aplicar tambin a las hojas, con un valor de m
igual al mayor nmero de registros que caben en un bloque.
www.FreeLibros.me
372
C om p aracin de m tod os
www.FreeLibros.me
373
cada mtodo el nm ero de accesos a bloques relacionados con una operacin con
archivos.
La funcin de dispersin suele ser el mtodo ms rpido de los tres, y requiere
en prom edio dos accesos a bloques por cada operacin (excluyendo los accesos re
queridos para buscar la tabla de cubetas), si el nmero de cubetas es lo bastante gran
de para que la cubeta tpica use slo un bloque. Sin embargo, con la funcin de dis
persin no es fcil acceder a los registros en el orden de clasificacin.
Un ndice disperso en un archivo de n registros permite que las operaciones so
bre archivos se realicen en unos 2 + log(n/bbr) accesos a bloques mediante la bs
queda binaria; aqu, b es el nm ero de registros que caben en un bloque y b ' es el
nmero de pares apuntador-clave que caben en un bloque del archivo ndice. Los
rboles B permiten operaciones con archivos en 2 + l o g ^ \n/b] accesos a bloques,
donde m, el grado mximo de los nodos interiores, es aproxim adam ente b'. Los n
dices dispersos y los rboles B permiten el acceso a los registros en el orden de clasifi
cacin.
Todos estos mtodos son muy buenos comparados con la bsqueda secuencial
obvia en un archivo. Las diferencias de tiempo entre ellos, no obstante, son peque
as y difciles de determ inar analticamente, especialmente considerando que .os pa
rmetros importantes, como la longitud esperada del archivo y la razn de ocupa
cin de bloques, son difciles de predecir.
Parece ser que los rboles B se estn popularizando con rapidez como medio de
acceso a archivos en sistemas de bases de datos. En parte, se debe a su capacidad
para manejar consultas de registros con claves en un intervalo determ inado (lo que
aprovecha el hecho de que los registros aparecen ordenados en el archivo principal).
El ndice disperso tambin maneja con eficiencia dichas consultas, pero es casi se
guro que es menos eficiente que los rboles B. Intuitivam ente, la razn de que los
rboles,B sean superiores a los ndices dispersos es que se puede considerar un r
bol B como un ndice disperso sobre un ndice disperso sobre un ndice disperso, y
as sucesivamente (aunque rara vez se necesitan ms de tres niveles de ndices).
Los rboles B tambin funcionan relativamente bien cuando se usan como ndi
ces secundarios, donde las claves no definen unvocamente un registro. Aunque
los registros con un valor dado en los campos designados de un ndice secundario
se extienden sobre muchos bloques, se pueden leer todos con un nm ero de accesos
a bloque igual al nmero de bloques que contienen esos registros, ms el nm ero de
sus antecesores en el rbol B. En comparacin, si esos registros, ms otro grupo de
tamao similar tienen la misma funcin de dispersin y llegan a la misma cubeta,
entonces la recueracin de cualquier grupo de una tabla de dispersin puede reque
rir un nmero de accesos a bloques cercano al doble del nm ero de bloques en los
cuales puede caber cada grupo. Es factible que haya otras razones en favor de los
rboles B, como su rendimiento cuando varios procesos tienen acceso sim ultnea
mente a la estructura, pero eso est fuera del alcance de este libro.
www.FreeLibros.me
374
Ejercicios
11.1
11.2
11.3
11.4
*11.5
11.6
11.7
11.8 Cules son las prim itivas que Pascal ofrece para tratar con archivos exter
nos? Cmo pueden mejorarse?
*11.9
Supngase que se maneja una clasificacin en varias fases con tres archi
vos, y en la z-sima fase se crea un archivo con r, fragmentos de longitud
/,. En la n-sima fase, se desea un fragmento en uno de los archivos y nin
guno en los otros dos. Expliqese por qu cada uno de los siguientes enun
ciados debe ser cierto.
a)
b)
c)
*11.10 Qu condicin debe agregarse a las del ejercicio 11.9 para hacer posible
una clasificacin en varias fases,
a) con fragmentos iniciales de longitud uno (esto es, /0 1)?
b) la ejecucin para k fases, pero con fragmentos iniciales diferentes a uno
permitido?
www.FreeLibros.me
EJERCICIOS
375
= 31 o
11.13
11.15
Disese una organizacin con rboles B para el archivo del ejercicio 11.14.
11.16
11.17
www.FreeLibros.me
376
*11.18
*11.19
*11.20
*11.21
**1122
Supngase que las claves son de un tipo que puede ordenarse linealmente,
como los nm eros reales, y que se conoce la distribucin de probabilidades
con que aparecern las claves de valores dados en el archivo. Se puede apro-,
vechar este conocimiento para m ejorar una bsqueda binaria cuando se
busca una clave en un ndice disperso. Un esquema, llamado bsqueda por
interpolacin, usa esta informacin estadstica para predecir dnde es ms
probable que se encuentre una clave x, en el intervalo de bloques de ndi
ces B,
Bp a los cuales se ha limitado la bsqueda. Proporcinese
www.FreeLibros.me
NOTAS BIBLIOGRAFICAS
a)
b)
11.23
377
b)
Como material adicional sobre clasificacin externa, vase Knuth [1973]. Material
posterior sobre estructuras de datos externas y su uso en sistemas de bases de datos
puede encontrarse en esa obra y en Ullman [1982] y W iederhold [1982], La clasifi
cacin en varias fases se estudia en Shell [1971], El esquema de intercalacin con
seis buffers de la seccin 11.2 es de Friend [1956], y el de cuatro, de Knuth [1973],
La seleccin de ndices secundarios, de la cual el ejercicio 11.21 es una simplifi
cacin, se analiza en Lum y Ling [1970] y Schkolnick [1975]. Los rboles B se pre
sentaron originalmente en Bayer y McCreight [1972]. En Com er [1979], se exami
nan muchas variantes, y en Gudes y T sur [ 1980] se evala el rendim iento en la prcti
ca.
La informacin acerca del ejercicio 11.12, clasificacin con una y dos cintas, pue
de encontrarse en Floyd y Smith [1973]. El ejercicio 11.22 sobre bsqueda por in
www.FreeLibros.me
378
terpolacin se analiza con detalle en Yao y Yao [1976], y Perl, Itai y Avni [1978].
Una implantacin excelente del enfoque sugerido en el ejercicio 11.23 para
el problema del rbol abarcador externo de costo m nim o fue estudiada por
V. A. Vyssotsky, alrededor de 1960 (sin publicar). El ejercicio 11.24 se debe a
M. I. Shamos.
www.FreeLibros.me
|3 7 9 |
.^
Administracin de memoria
1 2 .1
A sp ecto s d e
la ad m inistracin de m em oria
www.FreeLibros.me
380
2.
3.
4.
www.FreeLibros.me
381
(b)
Fig. 12.1.
En los cuatro ejemplos anter ires, se pueden observar diferencias a lo largo, por
lo menos, de dos dimensiones ortogonales. El primer aspecto es si los objetos que
se encuentran com partiendo el espacio son de la misma longitud o no. En los dos
primeros ejemplos, los programas en LISP y el almacenamiento de archivos, los ob
jetos, celdas tipo LISP en un caso, y bloques con partes de archivos, en el otro, son
del mismo tamao. Este hecho permite ciertas simplificaciones del problema de la
administracin de memoria. Por ejemplo, en la realizacin en LISP, una regin de
memoria se divide en espacios, cada uno de los cuales puede contener exactamente
una celda. El problema de la administracin es encontrar espacios vacos para ubi
www.FreeLibros.me
382
car las celdas recin creadas y nunca se necesita alm acenar una celda en una posi
cin en que se translapen dos espacios. Igualmente, en el segundo ejemplo, un disco se
divide en bloques de tam ao idntico, y a cada bloque se le asigna parte de un ar
chivo; nunca se emplea un bloque para alm acenar partes de dos o ms archivos, aun
que un archivo term ine en m itad de un bloque.
En contraste, el tercero y cuarto ejemplos cubren la asignacin de memoria para
un sistema de m ultiprogramacin y adm inistracin de una estructura dinm ica para
los lenguajes que tratan con variables cuyos valores son objetos grandes, y aqui
se habla de asignacin de espacio en bloques de tam ao diferente. Este requisito pre
senta ciertos problemas que no se presentan en el caso de longitudes fijas. Por ejem
plo, se teme la fragmentacin, una situacin en la cual hay mucho espacio sin utili
zar, pero est distribuido en fragmentos tan pequeos que no puede encontrarse es
pacio para un objeto grande. Se profundizar ms acerca de la administracin de es
tructuras dinm icas en las secciones 12.4 y 12.5.
El segundo aspecto im portante es si la recoleccin de basura, un trm ino muy des
criptivo para la recuperacin de espacio no utilizado, se efecta explcita o implci
tamente, esto es, m ediante un m andato del program a o slo como respuesta a una
peticin de espacio que no puede satisfacerse de otra manera. En el caso de la ad
m inistracin de archivos, cuando se elimina un archivo, los bloques que se utiliza
ron para contenerlo son conocidos por el sistema de archivos. Por ejemplo, el siste
ma de archivos puede grabar la direccin de uno o ms bloques maestros para
cada archivo existente; los bloques maestros listan las direcciones de todos los blo
ques utilizados por el archivo. As, cuando se elim ina un archivo, el sistema de ar
chivos puede hacerlo explcitamente disponible para reutilizar todos los bloques em
pleados por ese archivo.
En contraste, las celdas de LISP continan ocupando su espacio en memoria
cuando se apartan de las estructuras de datos del programa. Debido a la posibilidad
de que haya varios apuntadores a una celda, no se puede decir cundo una celda
est separada por completo y, por tanto, tampoco recoger en forma explcita las cel
das. como se hizo con los bloques de un archivo elim inado. Tarde o tem prano, to
dos los espacios en memoria correspondern a celdas tiles o intiles, y la siguiente
solicitud de espacio para otra celda activar implcitam ente una recoleccin de
basura; en ese momento, el intrprete de LISP m arca todas las celdas tiles, por me
dio de un algoritmo similar al que se presentar en la seccin 12.3, y despus enla
zar todos los bloques que contengan celdas intiles en una lista de espacio dispo
nible, para poderlas reutilizar.
La figura 12.2 ilustra las cuatro clases de administracin de memoria y da un
ejemplo de cada una. De la figura 12.2 ya se han com entado los ejemplos de blo
ques de tam ao fijo. La administracin de la m em oria principal en un sistema de
programacin mltiple es un ejemplo de peticin explcita de bloques con longitud
variable. Esto es, cuando un programa term ina, el sistema operativo, sabiendo qu
area de memoria se otorg al programa y sabiendo que ningn otro programa puede
usar ese espacio, hace que el espacio quede inm ediatam ente disponible para cual
quier otro programa.
La administracin de una estructura dinm ica en SNOBOL o en muchos otros
lenguajes es un ejemplo de bloques con longitud variable y recoleccin de basura.
www.FreeLibros.me
383
recoleccin de basura
fijo
sistema de archivos
LISP
variable
sistema de
multiprogramacin
SNOBOL
tamao
del bloque
Fig. 12.2.
1 2 .2
Supngase que se tiene un programa que maneja celdas con un par de campos cada
una; cada campo puede ser un apuntador a una celda o puede contener un tomo.
Por supuesto, la situacin es igual a la de un programa escrito en LISP, pero el pro
grama puede escribirse casi en cualquier lenguaje, incluso en Pascal, si se definen
las celdas del tipo registro variante. Las celdas vacas que se encuentran disponibles
para su incorporacin a una estructura de datos se colocan en una lista de espacio
disponible, y cada variable del programa se representa por un apuntador a una cel
da; la celda apuntada puede pertenecer a una gran estructura de datos.
Ejemplo 12.2. En la figura 12.3, se observa una estructura de datos posible. A, B y
C son variables, y las letras minsculas representan tomos. Obsrvense algunos fe
nmenos interesantes: la celda que contiene el tom o a est apuntada por la varia
ble A y por otra celda; la celda que contiene el tomo c est apuntada por dos celdas
distintas; las celdas que contienen q y h son un caso especial, porque aunque se apun
tan mutuamente, no son accesibles desde las variables A, B o C, ni estn en la lista
de espacio disponible.
Supngase que cuando se ejecuta el programa, se pueden quitar celdas nuevas de
la lista de espacio disponible; por ejemplo, puede ser conveniente sustituir el apun
tador nulo de la celda con el tomo c de la figura 12.3 por un apuntador a una celda
nueva que contenga el tom o i y un apuntador nulo. Esta celda se eliminar de la
www.FreeLibros.me
384
Fig. 12.3.
Red de celdas.
cabeza de la lista de espacio disponible. Tam bin es posible que de vez en cuando
los apuntadores cambien, de forma que las celdas se separen de las variables del pro
grama, como sucedi con las celdas g y h de la figura 12.3. Por ejemplo, la celda en
que se encuentra el tom o c. pudo haber apuntado alguna vez a la celda que contie
ne a g. Como otro ejemplo, el valor de la variable B puede cam biar en un momento
dado, lo cual si nada ms ha cambiado, aparta la celda apuntada por B en la figura
12.3, al igual que la celda que contiene a d y e (pero no la celda que contiene a c,
pues sta es accesible desde A). Las celdas que no pueden alcanzarse desde ninguna
variable y que no estn en la lista de espacio disponible son conocidas como celdas
inaccesibles.
Cuando se separan las celdas, y no las vuelve a necesitar el programa, sera de
seable que volvieran a la lista de espacio disponible, para poderlas usar de nuevo.
Si no se reclaman dichas celdas, con el tiem po se llegar a la situacin inaceptable
de que el programa no est em pleando todas las celdas, aunque requiera una celda
nueva, y la lista de espacio disponible est vaca. Es entonces cuando debe realizarse
una recoleccin de basura, lo que consume tiempo. Este paso de recoleccin de basura
es implcito, en el sentido de que no lo llam explcitamente la peticin de espacio.
Cuentas d e referencia
www.FreeLibros.me
385
1 2 .3
www.FreeLibros.me
386
Se supone que hay un arreglo de celdas, que ocupa casi toda la memoria, y una
coleccin de variables, que son apuntadores a las celdas. Por simplicidad, se da por
hecho que hay slo una variable, llam ada fu e n te , apuntando a una celda, pero la ex
tensin a muchas variables no es difcil f. Esto es, se declara
var
fuente, t tipo-celda;
m em o ria : array [1 ..ta m a o -m em o ria ) of tipo_celda;
Para m arcar las celdas accesibles desde fu e n te , primero se desmarcan todas las
celdas, sean o no accesibles, recorriendo todo el arreglo m em oria y poniendo el cam
po m arca en falso. Despus, se realiza una bsqueda prim era de profundidad en el
grafo que em ana de fu en te, m arcando todas las celdas visitadas. Las celdas visitadas
son exactam ente aquellas que son accesibles. Despus, se recorre el arreglo m em oria
para agregar a la lista de espacio disponible todas las celdas no marcadas. La figura
12.5 muestra un procedim iento b p f para realizar la bsqueda en profundidad; b p f se
llama con el procedim iento recoge que desm arca todas las celdas, y marca las celdas
accesibles llam ando a bpf. N o se presenta el cdigo para enlazar la lista de espacio
disponible debido a las peculiaridades de Pascal. Por ejemplo, aunque se pueden en
lazar las celdas disponibles con todas las celdas izquierdas o todas las derechas, ya
que se ha supuesto que los apuntadores y los tom os tienen el m ismo tamao, no
est perm itido reem plazar tom os por apuntadores en las celdas que sean del tipo
variante AA.
(1 )
(2)
(3)
(4)
(5)
(6)
(7 )
(8)
(9)
b p fd erech a );
(1 0 )
end
end; | bpf]
(11)
procedure recoge,
var
i: integer;
t Cada lenguaje d e programacin debe proporcionar un m todo propio d e representacin del conjun
to d e variables actual, y cualquiera d e los m todos estudiados en los captulos 4 y 5 es adecuado. Por ejem
plo, la m ayor parte de las aplicaciones usan una tabla de dispersin para guardar las variables.
www.FreeLibros.me
( 12)
(13)
(14)
(15)
387
begin
for i :*= 1 to tam ao-m em oria do I desm arcar" todas las celdas I
memoria[i],marca false;
bpfifuente); I m arcar las celdas accesibles!
| aqu va el cdigo para la recogida
end; ( recoge |
Fig. 12.5.
www.FreeLibros.me
388
tiene un apuntador slo en su campo derecho f. Antes de m arcar se asigna valor ini
cial a fuente 1 para tener atrs - D, y su campo derecho apuntando a s mismo. A la
celda que suele apuntar fuente 1, apunta ahora actual, y a fuente 1 ahora previo. Se de
tiene la operacin de marcado ocurre cuando actual = previo, lo cual slo ocurre
cuando ambos apuntan a fuente 1, y se ha revisado por completo la estructura.
Ejemplo 1 2 J. La figura 12.6(b) muestra una posible estructura que emana de fuente.
Si hace una bsqueda primera de profundidad en la estructura, se visitan (1), (2),
(3) y (4). en ese orden. La figura 12.6<b) muestra las modificaciones hechas a los
apuntadores cuando la celda actual es (4). Se muestra el valor del campo atrs, aun
que no sucede lo mismo con los campos marca y patrn. El camino actual va de (4)
fuente
(2 )
fuente
/-
R V/
Y<
L
T
b -
actual
()
previo
www.FreeLibros.me
389
www.FreeLibros.me
390
(c) Replegar
F ig . 1 2 .7 .
www.FreeLibros.me
391
www.FreeLibros.me
392
a c tu a l ] .m a r c a true;
if bloqueJzquierdo(actual]) then begin f sigue al apuntador derecho I
actual] .atrs := D;
rota(previo, actual, actual].derecha)-, Irealiza los cambios
de la figura 12.7(a), pero siguiendo al apuntador derecho I
goto estado 1
end
else begin | sigue al apuntador izquierdo |
actual] .atrs := 7;
rota{previo, actual, actual].izquierda)-,
i realiza los cambios de la figura 12.7(a) 1
goto estado I
end
end;
www.FreeLibros.me
393
atrs
Es posible, aunque poco probable, que el bit extra utilizado en las celdas por el cam
po atrs haga que las celdas necesiten un byte extra, o incluso de una palabra adi
cional. En tal caso, es bueno saber que en realidad no se necesita el bit extra, al me
nos si se programa en un lenguaje que, a diferencia de Pascal, permita utilizar los
bits del campo patrn para propsitos distintos de los declarados: designadores del
formato de registro variante. El truco consiste en observar que si se usa el campo
atrs, como su celda est en el cam ino de vuelta a fu e n te l, los valores posibles del
campo patrn estn restringidos. Por ejemplo, si atrs - I, entonces se sabe que el
patrn debe ser PP o PA, pues es obvio que el campo izquierda tiene un apuntador.
Los mismo sucede cuando atrs = D. As, si se dispone dos bits para representar pa
trn y (cuando sea necesario) atrs, se puede codificar la informacin necesaria como
en la figura 12.10, por ejemplo.
Debe observarse que en el programa de la figura 12.9, siempre se sabe si se est
usando atrs, para saber qu interpretacin de la figura 12.10 es aplicable. Tan slo
cuando actual apunta a un registro, el campo atrs en ese registro no se usa; cuando
previo lo apunta, entonces s. Por supuesto, cuando se mueven esos apuntadores, es
necesario ajustar los cdigos; por ejemplo, si actual apunta a una celda con los
bits 10, que se interpretan de acuerdo con la figura 12.10 como patrn - AP, y se de
cide avanzar, de modo que previo apuntar ahora a esta celda, se fija atrs - D, pues
slo el campo derecho contiene un apuntador, y los bits apropiados son 11. Obsr
vese que si el patrn fuera AA, que no tiene representacin en la columna central
de la figura 12.10, no se querr que previo apunte a la celda, pues no hay apuntado
res que seguir en un m ovimiento de avance.
Cdigo
00
01
10
11
Fig. 12.10.
1 2 .4
=
=
/.
/.
D,
D,
patrn
patrn
patrn
patrn
PP
= PA
= PP
= AP
patrn
patrn
patrn
patrn
= PP
= PA
= AP
- AA
www.FreeLibros.me
394
de listas de celdas de igual tam ao, tratadas en la seccin anterior. El factor princi
pal que facilita el problema es que el marcado de bloques usados no es un proceso
recursivo; slo se tienen que seguir los apuntadores externos de la estructura din
mica y m arcar los bloques apuntados. No es necesaria una bsqueda en profundi
dad de una estructura enlazada ni de un algoritmo como el Deutsch-Schorr-Waite.
Por otro lado, la adm inistracin de la lista de espacio disponible no es tan sim
ple como en la seccin 12.3. Podra imaginarse que las regiones vacas [por ejemplo,
en la Fig. 12.i(a) hay tres regiones vacas] estn enlazadas como se sugiere en la fi
gura 12.11. Ah se observa una estructura dinm ica de 3000 palabras dividida en cin
co bloques. Dos bloques de 200 y 600 palabras, respectivamente, contienen los va
lores de X e Y. Los tres bloques restantes estn vacos, y estn enlazados en una ca
dena que parte de dispo, el encabezado para el espacio disponible.
Fig. 12.11.
Para que los bloques vacos se puedan encontrar siempre que se requiera alma
cenar datos nuevos, y pueda disponerse de los que contienen datos intiles, en esta
seccin se hacen las siguientes suposiciones.
1. Cada bloque es bastante grande para contener
a) un contador que indique el tam ao (en bytes o palabras, de acuerdo con el
computador) del bloque,
b) un apuntador (para enlazar el bloque al espacio disponible), ms
c) un bit para indicar si el bloque est vaco o no; este bit se conoce como bit
vacio / lleno o usado / no usado.
2. Un bloque vaco tiene, desde la izquierda (direccin ms baja), un contador que
indica su longitud, un bit vaco/lleno con un valor de cero, que indica que el blo
que est vaco, un apuntador al siguiente bloque disponible, y el espacio libre.
3. Un bloque que contiene datos tiene, desde la izquierda, un contador, un bit va
co / lleno con valor 1 indicando que el bloque est en uso, y los datos tf Obsrvese que en la figura 12.1, en vez de un contador que indica la longitud del bloque, se emplea
la longitud de los datos.
www.FreeLibros.me
395
Para ver uno de los problemas especiales que se presentan en el manejo de estruc
turas dinmicas, supongse que la variable Y de la figura 12.11 cambia, de forma
que el bloque que representa a Y debe devolverse al espacio disponible. Es ms fcil
insertar el bloque nuevo ai principio de la lista de disponibles, como se sugiere en
la figura 12.12. En esa figura se observa un caso de fragmentacin, la tendencia a
representar grandes reas vacas en la lista de espacio disponible por medio de frag
mentos, esto es, varios bloques pequeos formando el total. En el caso en cuestin,
los ltimos 2300 bytes de la estructura dinm ica de la figura 12.12 estn vacos, pero
el espacio est dividido en tres bloques de 1000, 600 y 700 bytes, y esos bloques no
estn siquiera, en orden consecutivo en la lista de disponibles. Sin alguna forma de
recoleccin de basura, seria imposible satisfacer una peticin de, por ejemplo, un blo
que de 2000 bytes.
Es obvio que cuando se devuelve un bloque a la lista de disponibles es conve
niente observar los bloques inmediatam ente a la izquierda y a la derecha del bloque
que se est haciendo disponible. Encontrar el bloque de la derecha es sencillo; si el
bloque que se est recuperando empieza en la posicin p y el contador vale c, el blo
que de la derecha empieza en la posicin p + c. Si se conoce p (por ejemplo, el apun
tador Y de la Fig. 12.11 contiene el valor p del bloque hecho disponible en la Fig.
12.12), basta con leer los bytes que empiezan en la posicin p, tantos como se re
quieran para contener c, y obtener el valor c. Del byte p + c, se salta el campo del
dispo
L
500
l vaco|200 1 V
daeIO;| l 0 0 0
Fig. 12.12.
600
vaco 1700
www.FreeLibros.me
396
contador para encontrar el bit que indica si el bloque est vaco o no. Si est vacio,
los bloques que empiezan en p y en p + c pueden combinarse.
Ejemplo 12.4. Supngase que la estructura dinm ica de la figura 12.11 empieza en
la posicin 0. Entonces, el bloque de > que se est devolviendo empieza en el
byte 1700, asi que p = 1700 y c = 600. El bloque que empieza en p + c - 2300 tam
bin est vaco, por lo que se pueden com binar en un solo bloque que empieza en
1700 con un contador de 1300, la suma de los contadores de los dos bloques.
Sin embargo, no es tan fcil fijar la lista de disponibles despus de combinar los
bloques. Se puede crear el bloque combinado agregando tan slo el contador del se
gundo bloque a c. Sin embargo, el segundo bloque permanecer enlazado en la lista
de disponibles y deber separarse, para lo cual es necesario encontrar el apuntador
a ese bloque desde su predecesor en la lista de disponibles. Se presentan varias es
trategias, pero ninguna se recomienda en especial.
1. Recorrer la lista hasta encontrar un apuntador con valor p + c. Este apuntador
debe estar en el bloque anterior al que se ha combinado con su vecino. Reem
plazar el apuntador encontrado por el apuntador del bloque de p + c. Esto, en efec
to, elimina el bloque que empieza en la posicin p + c de la lista de disponibles.
Su espacio queda disponible, por supuesto; es parte del bloque que empieza en
p. En promedio, habr que revisar la m itad de la lista de disponibles, as que el
tiempo requerido es proporcional a esa longitud.
2. Usar una lista doblemente enlazada para el espacio disponible. Entonces, el blo
que predecesor puede encontrarse con rapidez y el bloque-en p + c se puede eli
m inar de la lista. Este enfoque requiere un tiem po constante, independiente de
la longitud de la lista de disponibles, pero requiere espacio adicional para otro
apuntador en cada bloque vaco, increm entando as el tam ao mnimo de un blo
que para contener un contador, un bit vaco/lleno, y dos apuntadores.
3. Conservar clasificada toda la lista de espacio disponible de acuerdo con la posi
cin. Entonces, se sabe que el bloque de la posicin p es el predecesor en la lista
del bloque en p + c. y la manipulacin del apuntador necesaria para elim inar el
segundo bloque puede efectuarse en un tiempo constante. Sin embargo, la inser
cin de un bloque disponible nuevo requiere revisar en prom edio la m itad de la
lista, por lo que no es ms eficiente que el mtodo (1).
De los tres mtodos, el primero y el tercero requieren un tiempo proporcional a
la longitud de la lista de disponibles para devolver un bloque al espacio disponible
y combinarlo con su vecino derecho, si est vaco. Este tiempo puede ser prohibiti
vo o no, dependiendo de lo larga que sea la lista y del tiempo total del programa se
consume en la m anipulacin de la estructura dinmica. El segundo mtodo doble
enlace para la lista de disponibles tiene slo el defecto de incrementar el tamao
m nim o de los bloques. Lamentablemente, cuando se considera cmo combinar un
bloque devuelto con su vecino de la izquierda, como en los otros mtodos, se obser
va que el doble enlace no ayuda a encontrar vecinos izquierdos en menos tiempo
que el requerido para recorrer la lista de disponibles.
Encontrar un bloque inm ediatam ente a la izquierda del actual no es fcil. La po
www.FreeLibros.me
397
www.FreeLibros.me
398
3. No hacer nada explcito para com binar vecinos vacos. Cuando no sea posible en
contrar un bloque tan grande como para contener datos nuevos, revisar los blo
ques de izquierda a derecha, com binando vecinos vacos y despus crear una lis
ta nueva de disponibles. Un bosquejo del program a que hace esto se muestra en
la figura 12.13.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
procedure combina;
var
p, q: apuntadores a bloques;
I p indica el extrem o izquierdo del bloque vaco que se est
acum ulando; q indica un bloque a la derecha de p que se
incorporar en el bloque p si est vaco )
begin
p :- bloque m s a la izquierda de la estructura dinmica;
vaciar la lista de disponibles;
while p < extrem o derecho de la estructura dinm ica do
if p apunta a un bloque lleno con contador c then
p
p + c, 1saltar los bloques llenos I
else begin j p apunta al principio de una secuencia de
bloques vacos; deben com binarse )
q > p + c, 1asignar el valor inicial q al siguiente bloque 1
while q apunta a un bloque vaco con un contador, d, y q <
extremo derecho de la estructura dinm ica do begin
agregar d al contador del bloque apuntado por p\
q:~q + d
end
inserta el bloque apuntado por p en la lista de disponibles;
p-q-,
end
end; | combina |
F ig . 1 2 .1 3 .
www.FreeLibros.me
399
www.FreeLibros.me
400
www.FreeLibros.me
401
1 2 .5
Sistem as d e m anejo
de m em oria p o r afinidades
ibuddy systems)
Hay una familia de estrategias para m antener una estructura dinm ica que evite par
cialmente los problemas de fragmentacin y distribucin difcil de bloques vados.
Esas estrategias, llamadas sistemas de m anejo de m em oria por afinidades,
consumen poco tiem po al com binar bloques vacos adyacentes. El inconveniente es
que los bloques llegan en un surtido lim itado de tam aos, as que se puede desper
diciar algn espacio colocando datos en un bloque ms grande de lo necesario.
La idea central de todos los sistemas por afinidades es que los bloques son slo
de ciertos tamaos; por ejemplo, s, < 2 < h < < sk son todos los tam aos en
tre los cuales pueden encontrarse los bloques. Algunas selecciones comunes para la
secuencia s,, s2, son 1, 2, 4, 8,... (el sistema de afinidades exponencial) y 1, 2, 3, 5,
8, 13,... (el sistema de afinidades de Fibonacci, donde s,, - s, + sM). Todos los blo
ques vacos de tam ao s, estn enlazados en una lista, y hay un arreglo de encabe
zados de lista de disponibles, una para cada tam ao s, perm itido f- Si se requiere
un bloque de tam ao d para un grupo de datos nuevo, se escoge un bloque dispo
nible de tam ao s, tal que s > d, pero _i< d, esto es, el tam ao ms pequeo per
m itido en el cual caben los datos nuevos.
Surgen algunas dificultades cuando no existen bloques vacos del tam ao desea
do s. En ese caso, es necesario encontrar un bloque de tam ao
y dividirlo en
dos, uno de tam ao s, y el otro de tam ao s*, - s f f . El sistema de afinidades im
pone la restriccin de que
- s, sea alguna sjy para j < i. Ahora se ve la forma en
t Puesio q ue los bloques v acos deben contener apuntadores (y, com o se ver, otra inform acin tam
bin), en realidad no se inicia la secuencia de tam aos perm itidos en I, sin o en algn nm ero apropiado
ms grande en la secuencia, com o 8 bytes.
t f Por supuesto, si no hay bloques vacos d e tam ao s ,, se crea uno dividiendo un bloque de tamao
s,,j, y as sucesivam ente. Si no existen bloques de ningn tam ao mayor, en realidad no hay espacio y es
necesario reorganizar la estructura dinm ica com o en la seccin siguiente.
www.FreeLibros.me
402
s,+i = s, + s-k
(1 2 .1 )
La ecuacin (12.1) es aplicable cuando i > k, y ju n to con los valores para s2......
P o r ejemplo, si k - 0, (12.1) queda como
,+ , =
2s
(1 2 .2 )
si+, = s + 5 ^ ,
(12.3)
www.FreeLibros.me
403
utilizado en una estructura dinm ica de tam ao 55, con bloques de tam aos sit s2,...,
j , - 2, 3, 5, 8, 13, 21, 34 y 55. Por ejemplo, el bloque de tam ao 3 que empieza en
26 es afin al bloque de tam ao 5 que empieza en 21; juntos, forman el bloque de
tam ao 8 que empieza en 21 y que es afn al bloque de tam ao 5 que empieza en
29. Juntos, estos conform an el bloque de tam ao 13 que empieza en 21, y as sucesi
vamente.
3 5
Fig. 12.15.
11 13 16 18 21 2426 29 32 34 37 39 42 45 47 5052 55
Asignacin d e bloques
Cuando un bloque queda listo para reutilizarse, se puede ver una de las ventajas de
los sistemas de afinidades. Algunas veces se puede reducir la fragmentacin combi
nando el bloque que qued disponible recientemente con su afn, si ste est dispo
www.FreeLibros.me
404
nible tam bin +. De hecho, si fuera el caso, se puede com binar el bloque resultante
con su afn, si est vaco, y as sucesivamente. La combinacin de grupos afines va
cos requiere slo una cantidad constante de tiem po, lo que la convierte en una al
ternativa atractiva cuando se presentan combinaciones peridicas de bloques vacos
adyacentes, como se sugiri en la seccin anterior, que requiere un tiempo propor
cional al nm ero de bloques vacos.
El sistema exponencial hace que la localizacin de grupos afines sea especialmen
te fcil. Si se acaba de devolver el bloque de tam ao 2' que empieza en p2, su afn
est en (p + 1)2' si p es par, y en ( p - 1)2' si p es impar.
Para un sistema de orden k > 1, la localizacin de afines no es tan simple. Para
hacerla ms fcil es necesario alm acenar cierta informacin en cada bloque.
1. Un bit vaco/lleno, como tienen todos los bloques.
2. El ndice de tam ao, un entero i tal que el bloque sea de tam ao s,.
3. El contador de afinidad izquierdo, descrito a continuacin.
En cada par de afines, uno (el afn izquierdo) est a la izquierda del otro (el afn
derecho). Intuitivam ente, el contador de afinidad izquierdo de un bloque dice cun
tas veces consecutivas ste es todo o parte de un afn izquierdo. En un aspecto for
mal, toda la estructura dinm ica, tratada com o un bloque de tam ao s, tiene un con
tador de afinidad izquierdo igual a 0. C uando se divide cualquier bloque de tamao
i, con el contador de afinidad izquierdo b, en bloques de tam ao s, y s,_k, que son
los afines izquierdo y derecho, respectivamente, el afn izquierdo tiene un contador
b + 1, m ientras que el derecho tiene un contador igual a 0, independiente de b. Por
ejemplo, en la figura 12.15, el bloque de tam ao 3 que empieza en 0 tiene un con
tador de afinidad izquierdo igual a 6, y el bloque de tam ao 3 que empieza en 13
tiene un contador izquierdo igual a 2.
Adems de la informacin anterior, los bloques vacos, pero no los utilizados, tie
nen apuntadores de avance y de retroceso para la lista de disponibles del tam ao ade
cuado. Los apuntadores bidireccionales facilitan las combinaciones de afines, que de
ben eliminarse de la lista de disponibles.
La form a en que se m aneja esta inform acin es como sigue. Supngase que k es
el orden del sistema de afinidades. C ualquier bloque que empiece en la posicin p
con un contador de afinidad izquierdo igual a 0 es un afn derecho. As, si tiene n
dice de tam ao j , su afn izquierdo es de tam ao s,.k y empieza en la posicin p -s/tk.
Si el contador de afinidad izquierdo es m ayor que 0, entonces el bloque es un afn
izquierdo de un bloque de tam ao Sj_h el cual est localizado en la posicin p + sr
Si se combina un afn izquierdo de tam ao s teniendo un contador de afinidad
izquierdo igual a b, con un afn derecho de tam ao s,_*, el bloque resultante tendr
un ndice de tam ao / + 1, que empieza en la misma posicin que el bloque de ta
m ao s y tiene un contador de afinidad izquierdo b - 1. As, la informacin nece
saria puede m antenerse con facilidad al com binar dos afines vacos. Como ejercicio,
se puede com probar que la informacin se m antiene al dividir un bloque vaco de
tam ao
en un bloque ocupado de tam ao s, y uno vaco de tam ao s,.k.
t Igual que en la seccin anterior. se supone que un b il de cada bloque est reservado para indicar si
el bloque est en uso o vaco.
www.FreeLibros.me
405
1 2 .6
Hay ocasiones en las que, aun despus de com binar todos los bloques adyacentes,
no es posible satisfacer una solicitud de un bloque nuevo. Esto puede deberse sim
plemente a que en el m ontn no hay espacio para form ar un bloque del tam ao de
seado. Pero es ms tpica una situacin como la que se m uestra en la figura 12.11,
donde si bien hay 2200 bytes disponibles, no se puede satisfacer una solicitud de un
bloque mayor de 1000. El problema es que el espacio disponible est dividido entre
varios bloques no contiguos. Hay dos enfoques generales a este problema.
1. Lograr que el espacio disponible para el conjunto de datos pueda estar compues
to de varios bloques vacos. Si ocurre as, tam bin se puede requerir que todos
los bloques sean del m ismo tam ao y consistan en espacio para un apuntador y
para los datos. En un bloque utilizado, el apuntador indica el siguiente bloque usa
do para los datos, y es nulo en el ltim o bloque. Por ejemplo, si se estuvieran al
macenando datos cuyo tam ao fuera casi siempre pequeo, se escogeran bloques
de tam ao igual a 16 bytes, con 4 utilizados para un apuntador y 12 para los da
tos. Si los conjuntos de datos fueran en general ms grandes, podran escogerse
bloques con varios cientos de bytes, asignando de nuevo cuatro para un apunta
dor y el resto para los datos.
2. Cuando falla la combinacin de bloques vacos adyacentes, y no se es capaz de
proveer un bloque bastante grande, se mueven los datos por la estructura din
mica de manera que todos los bloques llenos queden en el extremo izquierdo (po
sicin ms baja), y se forme un bloque grande disponible a la derecha.
El mtodo (1), que usa cadenas de bloques para un conjunto de datos, tiende a
consumir mucho espacio. Si se escoge un tam ao de bloque pequeo, se emplea una
fraccin grande de espacio para las cabeceras, los apuntadores necesarios para
mantener las cadenas. Al utilizar bloques grandes, se ocupa menos espacio en las ca
beceras, pero m uchos bloques estarn casi desperdiciados, alm acenando pocos da
tos. La nica situacin en que esta clase de enfoque es preferible, es cuando los con
juntos de datos tpicos sean muy grandes. Por ejem plo, m uchos sistemas de archi
www.FreeLibros.me
406
vos trabajan de esta forma, dividiendo la estructura dinm ica, que por lo comn es
una unidad de disco, en bloques del mismo tam ao, por ejemplo 5 1 2 a 4096 bytes,
dependiendo del sistema. Como muchos archivos son mucho ms grandes que esos
nmeros, no se desperdicia demasiado el espacio, y los apuntadores a los bloques
que conforman un archivo requieren relativamente poco espacio. La asignacin de
espacio bajo esta disciplina es casi directa, debido a lo que se ha aprendido en las
secciones anteriores, por lo que no se analizar aqu la m anera de realizarla.
(a)
(b)
Fig. 12.16.
Antes de la compactacin
Despus de la compactacin
www.FreeLibros.me
407
var
p
extremo izquierdo de la estructura dinmica;
h u e c o 0;
while p < extremo derecho de la estructura dinm ica do begin
I hace que p apunte al bloque B i
if B est vaco then
hueco
hueco + contador en el bloque B
else B est lleno {
direccin de avance de B
p - hueco;
p
p + contador en el bloque B
(2)
(4)
(5)
(6)
(7)
(8)
(9)
end
end;
Fig. 12.17.
p to p -1 + contador en B do
estructura dinmica [i - hueco]: - estructura dinmica[i]\
para pasar el bloque B a la izquierda en una cantidad igual a hueco. Obsrvese que
el movim iento de bloques llenos, que requiere un tiem po proporcional a la cantidad
de bloques en uso dentro de la estructura dinm ica, probablemente dom inar los de
ms costos de compactacin.
t En el resto del texto se supone q ue la coleccin d e d ich o s apuntadores est disponible. Por ejem plo,
una realizacin normal de SNOBOL almacena pares que constan de un nombre d e variable y un apuntador
al valor de ese nombre en una tabla d e dispersin, con la funcin de dispersin calculada a partir del nom
bre. Examinar la tabla com pleta perm ite visitar todos los apuntadores.
www.FreeLibros.me
408
A lg o ritm o d e Morris
Encadenamiento de apuntadores.
www.FreeLibros.me
EJERCICIOS
409
Ejercicios
12.1
Considrese la siguiente estructura dinm ica de 1000 bytes, donde los blo
ques en blanco estn en uso, y los bloques etiquetados estn enlazados en
una lista libre en orden alfabtico. Los nm eros indican la posicin del pri
m er byte de cada bloque.
200
b
100
0
1 O
400
500
575
d
700
850
e
900
/
999
primer ajuste
m ejor ajuste.
100
a
200
300
500
b___________
www.FreeLibros.me
410
ADMINISTRACION DE MEMORIA
12.5
12.6
12.7
Escrbase un programa para hacer una copia de una lista dada. Cul es la
complejidad de tiempo y espacio del programa?
12.8
Escrbase un programa para determ inar si dos listas son idnticas. Cul es
la complejidad de tiempo y espacio de este programa?
www.FreeLibros.me
NOTAS BIBLIOGRAFICAS
411
www.FreeLibros.me