Está en la página 1de 385

www.FreeLibros.

me

Estructura de datos y algoritmos

Alfred V. Aho, John E. Hopcroft, Jefrey D. Ullman


con la colaboracin de Guillermo Levine Gutirrez;
versin en espaol de Amrico Vargas y Jorge Lozano
PUBLICACIN Mxico, DF : Addison-Wesley
Iberoamericana: Sistemas Tcnicos de Edicin, 1988

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

De los problemas a los programas

La m itad del trabajo es saber qu problem a se va a resolver. Al abordar los proble


mas, por lo general, stos no tienen una especificacin sim ple y precisa de ellos. De
hecho, problem as como crear una receta digna de un gastrnom o o preservar la paz
m undial pueden ser imposibles de form ular de form a que adm itan una solucin por
com putador; aunque se crea que el problem a puede resolverse en un com putador,
es usual que la distancia entre varios de sus parm etros sea considerable. A m enudo
slo m ediante experim entacin es posible encontrar valores razonables para estos pa
rmetros.
Si es posible expresar ciertos aspectos de un problem a con un m odelo formal,
por lo general resulta beneficioso hacerlo, pues una vez que el problem a se form ali
za, pueden buscarse soluciones en funcin de un m odelo preciso y determ inar si ya
existe un program a que resuelva tal problem a; aun cuando no sea tal el caso, ser
posible averiguar lo que se sabe acerca del m odelo y usar sus propiedades como ayu
da para elaborar una buena solucin.
Se puede recurrir casi a cualquier ram a de las m atem ticas y de las ciencias para
obtener un m odelo de cierto tipo de problem as. En el caso de problem as de natura
leza esencialm ente num rica, esto puede lograrse a travs de conceptos m atem ti
cos tan familiares como las ecuaciones lineales sim ultneas (por ejemplo, para de
term inar las corrientes en un circuito elctrico o encontrar los puntos de tensin en
estructuras de vigas conectadas) o ecuaciones diferenciales (por ejemplo, para pre
decir el crecim iento de una poblacin o la velocidad de una reaccin qum ica). T ra
tndose de problem as de procesam iento de sm bolos y textos, se pueden construir
modelos con cadenas de caracteres y gram ticas formales. Entre los problem as de
esta categora estn la com pilacin (traduccin a lenguaje de m quina de program as
escritos en algn lenguaje de program acin) y las tareas de recuperacin de infor-

www.FreeLibros.me

DISE O Y ANALISIS DE A LGO RITM OS

m arin, com o el reconocim iento de ciertas palabras en el catlogo de ttulos de una


biblioteca.

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

DE LOS PROBLEM AS A LOS PROGRAM AS

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.

Puede obtenerse un m odelo de este problem a con la ayuda de una estructura m a


tem tica conocida como grafo. U n grafo se com pone de un conjunto de puntos, lla
m ados vrtices, y de lneas que unen los puntos, llam adas aristas. Es posible construir
un modelo del problem a de la interseccin de trfico m ediante un grafo cuyos vr
tices representen los giros posibles y cuyos arcos unan los pares de vrtices que re
presentan giros que no se perm iten al m ismo tiem po. En la figura 1.2 se m uestra el
grafo para la interseccin de la figura 1.1. La figura 1.3 es otra representacin del
mismo grafo en form a de tabla, donde un 1 en la interseccin de la fila i y la co
lum na j indica que hay una arista entre los vrtices i y j.
El grafo puede ayudar a solucionar el problem a de disear el semforo. La colo
racin de un grafo es la asignacin de un color a cada vrtice de ste, de tal forma
que no haya dos vrtices del m ismo color unidos por un arco. As pues, resulta evi
dente que el problem a equivale a buscar una coloracin del grafo de giros incom pa
tibles que utilice el m enor nm ero posible de colores.
El problem a de la coloracin de grafos se ha estudiado durante varias dcadas,
la teora de algoritm os ofrece m ucha inform acin. L am entablem ente, la coloracin
de un grafo arbitrario con el m enor nm ero posible de colores es un problem a que
se clasifica entre los llam ados NP-com pletos, para los cuales las nicas soluciones
conocidas consisten, en esencia, en intentar todas las posibilidades. En el proble
ma de la coloracin, esto significa intentar todas las asignaciones de colores a los vr
tices, prim ero con un solo color, luego con dos, con tres, y as sucesivam ente, hasta
encontrar una coloracin vlida. Con un poco de cuidado es posible acelerar este pro
cedim iento, pero, en general, se cree que ningn algoritm o que resuelva este proble
m a puede ser sustancialm ente ms eficiente que el enfoque, m s obvio, recin des
crito.

www.FreeLibros.me

DISE O Y ANALISIS DE ALG O RITM O S

Fig. 1.2.

AB
AB
AC
AD
BA
BC
BD
DA
DB
DC
EA
EB
EC
ED

I
1
1

AC

AD

G rato que representa los giros incompatibles.

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

Tabla de giros incompatibles.

Ahora, existe la posibilidad de que encontrar una solucin ptim a al problema


en cuestin tenga un costo com putacional muy elevado. Ante esto, puede elegirse en
tre tres enfoques. Si el grafo es pequeo se puede buscar una solucin ptim a a tra
vs de una bsqueda exhaustiva, intentando todas las posibilidades. Para grafos gran
des, en cam bio, este enfoque resulta prohibitivo por su costo, sin im portar qu gra

www.FreeLibros.me

DE LOS PROBLEM AS A LOS PROGRAM AS

do de eficiencia se intente dar al program a. El segundo enfoque consiste en buscar


inform acin adicional sobre el problem a. Podra suceder que el grafo tuviera pro
piedades especiales que hicieran innecesario probar todas las posibilidades para ha
llar una solucin ptim a. El tercer enfoque consiste en cam biar un poco el problem a
y buscar una solucin buena aunque no necesariam ente ptim a; podra ser suficien
te con encontrar una solucin que determ inara un nm ero de colores cercano al m
nimo en grafos pequeos, y que trabajara con rapidez, pues la m ayor parte de las
intersecciones no son tan complejas com o las de la figura 1.1. Un algoritm o que pro
duce con rapidez soluciones buenas, pero no necesariam ente ptim as, se denom ina
heurstico.
El siguiente algoritm o vido es un heurstico razonable para la colora
cin de grafos. Para em pezar, se intenta colorear tantos vrtices com o sea posible
con el prim er color; despus, todos los que sea posible con el segundo color, y as
sucesivamente. Para dar a los vrtices un nuevo color, se procede com o sigue:
1.
2.

Se selecciona un vrtice no coloreado y se le asigna el nuevo color.


Se exam ina la lista de vrtices no coloreados. Para cada uno de ellos se deter
m ina si existe alguna arista que lo una con un vrtice que ya tenga asignado el
nuevo color; si tal arista no existe, se asigna el nuevo color al vrtice.

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

DISE O Y ANALISIS DE A LGO RITM OS

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

AB. AC, AD, BA. DC. ED


BC.BD, EA
DA, DB
EB, E C

BA, DC. ED
AD, BA, DC, ED
BA, DC, EA, ED

Fig. 1.5.

Coloracin dei g rato de la figura 1.2.

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.

Seudolenguaje y refinam iento p or pasos

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

D E LOS PROBLEM AS A LOS PR O G R A M A S

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)

procedure vido ( var G: GRA FO; var nue-color. C O N JU N T O );


I vido asigna a nue-color un conjunto de vrtices de G a los que se
puede dar el m ism o color 1
begin
nue-color
0; f
for cada vrtice v no coloreado de G do
f v no es adyacente a ningn vrtice de nue-color then begin
m arca v com o coloreado;
agrega v a nue-color
end
end; vido I
Fig. 1.6.

Primer refinam iento del algoritm o vido.

En la figura 1.6 se observan algunas caractersticas im portantes de este seudo


lenguaje. La prim era de ellas es que se utilizan letras minsculas negritas para las
palabras clave de Pascal que tienen el m ismo significado que en Pascal estndar. Las
palabras en mayscula, com o G RA FO y C O N JU N T O t t , son nom bres de tipos de
datos abstractos. Estos se definirn m ediante declaraciones tipo Pascal, y las ope
raciones asociadas con esos tipos de datos abstractos se definirn m ediante proce
dim ientos de Pascal al crear el program a final. En las dos secciones siguientes se ana
lizarn con m s detalle los tipos de datos abstractos.
Las construcciones de flujo de control de Pascal como if, for y while se pueden
utilizar en las proposiciones en seudolenguaje, pero las expresiones condicionales,
como la de la lnea (3), pueden ser proposiciones inform ales, en vez de expresiones
condicionales de Pascal. Obsrvese que la asignacin de la lnea ( l ) utiliza una expre
sin informal a la derecha, y que el ciclo for de la lnea (2) itera sobre un conjunto.
Para su ejecucin, el program a en seudolenguaje de la figura 1.6 se debe refinar
hasta convertirlo en un program a convencional en Pascal. Este proceso no se reali-

t El sm b olo a representa el conjunto vaco.


t t Se d ebe distinguir entre el tipo de datos abstracto C O N JU N T O y el tip o incorporado set de Pascal.

www.FreeLibros.me

DISEO Y ANALISIS DE A LGO RITM OS

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)

procedure vido ( var G: GRA FO; var nue-color. CO N JU N TO );


begin
nue-color
0;
for cada vrtice v no coloreado de G do begin
encontrado :*= false;
for cada vrtice w de nue-color do
if hay una arista entre v y w e n C then
encontrado
true;
if encontrado - false then begin
I v no es adyacente a ningn vrtice de nue-color i
m arca v com o coloreado;
agrega v a nue-color
end
end
end;

Fig. 1.7.

Refinam iento parcial de la figura 1.6.

Ahora, el algoritm o se ha reducido a una coleccin de operaciones sobre dos con


juntos de vrtices. El ciclo extem o, com puesto por las lneas (2) a (5), itera sobre el
conjunto de vrtices no coloreados de G. El ciclo interno, lneas (3.2) a (3.4); itera so
bre los vrtices que se encuentran en el conjunto nue-color. La lnea (5) agrega vrti
ces recin coloreados a nue-color.
En un lenguaje de program acin como Pascal hay m uchas form as de representar
conjuntos. En los captulos 4 y 5 se estudiarn varias de esas representaciones. En
este ejem plo, los conjuntos de vrtices se representarn sim plem ente por otro tipo
de datos abstracto, LISTA, que se puede aplicar m ediante una lista de enteros ter
m inada con un valor especial nulo (para lo cual se podra aplicar el valor 0). Estos
enteros podran alm acenarse, por ejem plo, en un arreglo, aunque hay muchas otras
form as de representar una LISTA, como se ver en el captulo 2.
Se puede ahora reem plazar la proposicin for de la lnea (3.2) por un ciclo en el
que w se inicializa com o prim er m iem bro de nue-color y cam bia al siguiente miem
bro en cada repeticin del ciclo. Tam bin se puede realizar el m ism o refinam iento
con el ciclo for de la lnea (2) de la figura 1.6. El procedim iento vido revisado

www.FreeLibros.me

DE LOS PROBLEM AS A LOS PRO G R A M A S

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.

Procedim iento vido refinado.

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

DISE O Y ANALISIS DE A LGO RITM OS

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.

Proceso de solucin de problemas.

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

Tipos de datos abstractos

Con seguridad, la m ayor parte de los conceptos introducidos en la seccin anterior


le es fam iliar al lector desde sus prim eros cursos de program acin. Quiz la nica
nocin nueva sea la de tipo de datos abstracto; por eso, antes de continuar, se ana
lizar el papel de estos tipos durante el proceso general de diseo de programas. Para
com enzar, es til com parar este concepto con el m s fam iliar, de procedimiento.
Los procedim ientos, herram ientas esenciales de program acin, generalizan el
concepto de operador. En vez de lim itarse a los operadores incorporados de un len
guaje de program acin (suma, resta, etctera), con el uso de procedim ientos, un pro
gram ador es libre de definir sus propios operadores y aplicarlos a operandos que no
tienen por qu ser de tipo fundam ental. Un ejem plo de esta aplicacin de los pro
cedim ientos es una rutina de m ultiplicacin de matrices.
O tra ventaja de los procedim ientos es que pueden utilizarse para encapsular par
tes de un algoritm o, localizando en una seccin de un program a todas las proposi
ciones que tienen im portancia en relacin con cierto aspecto de ste. Un ejemplo de
encapsulacin es el uso de un procedim iento para leer todas las entradas y verificar
su validez. La ventaja de realizar encapsulaciones es que se sabe hacia dnde ir para
hacer cam bios en el aspecto encapsulado del problema. Por ejemplo, si se decide ve
rificar que todas las entradas sean no negativas, slo se necesita cam biar unas cuan
tas lneas de cdigo, y se sabe con exactitud dnde estn esas lneas.

www.FreeLibros.me

TIPO S DE D A TO S ABSTRACTOS

11

Definicin de tipo de datos abstracto


Se puede pensar en un tipo de datos abstracto (TDA) com o en un modelo m atem
tico con una serie de operaciones definidas en ese modelo. Un ejem plo sencillo de
TDA son los conjuntos de nm eros enteros con las operaciones de unin, intersec
cin y diferencia. Las operaciones de un TDA pueden tener com o operandos no slo
los casos del TDA que se define, sino tam bin otros tipos de operandos, com o en
teros o casos de otro TDA, y el resultado de una operacin puede no ser un caso de
ese TDA. Sin embargo, se supone que al m enos un operando, o el resultado, de al
guna operacin pertenece al TDA en cuestin.
Las dos propiedades de los procedim ientos m encionadas anteriorm ente, genera
lizacin y encapsulacin, son igualm ente aplicables a los tipos de datos abstractos.
Los TD A son generalizaciones de los tipos de datos prim itivos (enteros, reales, et
ctera), al igual que los procedim ientos son generalizaciones de operaciones prim i
tivas (suma, resta, etctera). Un TD A encapsula cierto tipo de datos en el sentido
de que es posible localizar la definicin del tipo y todas las operaciones con ese tipo
se pueden localizar en una seccin del program a. As, si se desea cam biar la forma
de im plantar un TDA, se sabe hacia dnde dirigirse, y revisando una pequea seccin
del program a se puede tener la seguridad de que no hay detalles en otras panes que
puedan ocasionar errores relacionados con ese tipo de datos. Adems, fuera de la sec
cin en la que estn definidas las operaciones con el TDA, ste se puede utilizar
como si fuese un tipo de datos prim itivo, es decir, sin preocuparse por la aplicacin.
U n inconveniente es que cie as operaciones pueden im plicar m s de un TDA, y
para que todo m arche bien en tales casos, debe hacerse referencia a estas operacio
nes en las secciones de los dos TDA.
Para ilustrar las ideas bsicas considrese el procedim iento vido de la sec
cin anterior (Fig. 1.8), im plantado m ediante operaciones prim itivas en el tipo de da
tos abstracto LISTA (de enteros). Las operaciones ejecutadas en la LISTA nue-color
fueron las siguientes:
1. vaciar la lista;
2. obtener el prim er m iem bro de la lista y devolver n u lo si la lista estaba vaca;
3. obtener el siguiente m iem bro de
la lista y devolver n u lo si
no hay m iem bro si
guiente, y, por ltimo,
4. insertar un entero en la lista.
Existen muchas estructuras de datos que se pueden utilizar para im plantar eficien
tem ente a una lista como stas; este tem a se estudiar con profundidad en el cap
tulo 2. Si en la figura 1.8 se reem plazan esas operaciones por las proposiciones
1.
2.
3.
4.

ANULA (nue-Color)\
w :- PR IM ER O (nue.color)-,
w :- SIG U IEN TE (n ue.color)\
INSERTA (v, nue-Color)\

entonces se aprecia un aspecto im portante de los tipos de datos abstractos. Se puede


aplicar un tipo en la form a que se desee sin que los program as, como el de la fi

www.FreeLibros.me

12

D ISE O Y ANALISIS DE A LGO RITM OS

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.

obtener el prim er vrtice no coloreado;


determ inar si hay una arista entre dos vrtices;
m arcar un vrtice com o coloreado, y
obtener el siguiente vrtice no coloreado.

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.

La implantacin de un TDA es la traduccin en proposiciones de un lenguaje de


program acin, de la declaracin que define una variable com o perteneciente a ese
tipo, adem s de un procedim iento en ese lenguaje por cada operacin del TDA. Una
im plantacin elige una estructura de datos para representar el TDA; cada estructura
de datos se construye a p a rtir de los tipos de datos fundam entales del lenguaje de
program acin base, utilizando los dispositivos de estructuracin de datos disponi
bles. Los arreglos y las estructuras de registro son dos im portantes dispositivos de
estructuracin de datos de Pascal. Por ejemplo, una im plantacin posible de la va
riable S1del tipo C O N JU N T O sera un arreglo que contuviera los m iem bros de 5.
U na razn im portante para afirm ar que dos TDA son diferentes si tienen el mis
mo modelo m atem tico, pero distintas operaciones, es que lo apropiado de una rea
lizacin depende en gran m edida de las operaciones que se van a realizar. Gran parte
de este libro se dedica al exam en de algunos modelos m atem ticos bsicos, como los
conjuntos y los grafos, y al desarrollo de las realizaciones preferibles para varios
conjuntos de operaciones.
Lo ideal sera escribir program as en lenguajes cuyos tipos de datos y operaciones
prim itivos estuvieran m uy cerca de los m odelos y operaciones de los TD A que se
utilizarn aqu. En m uchos sentidos, Pascal no es el lenguaje ms apropiado para im
plantar varios TDA comunes, pero ninguno de los lenguajes en que un TDA puede de
clararse m s directam ente es tan conocido. Consltense las notas bibliogrficas del
final del captulo.

www.FreeLibros.me

TIPO S DE DATOS. ESTRU C TU R A S DE DATOS Y T IPO S DE DA TO S ABSTRACTOS

1 .3

13

Tipos de datos, estructuras de datos y tipos de datos abstractos

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

DISE O Y ANALISIS DE ALGORITM OS

se agrupan en arreglos; el tipo definido por la agregacin de los cam pos de un re


gistro se convierte en el tipo_celda del arreglo. Por ejemplo, la declaracin en Pascal
var
lista^reg-. array [1..4| of record
daros: real;
siguiente: integer
end
declara que lista^reg es un arreglo de cuatro elem entos cuyas celdas son registros
que tienen dos campos: datos y siguiente.
Un tercer m todo de agrupacin que se encuentra en Pascal y en otros lenguajes
es el archivo (file). Al igual que un arreglo unidim ensional, un archivo es una suce
sin de valores de un tipo particular. La diferencia est en que un archivo no tiene
tipo ndice; los elem entos slo son accesibles en el orden en que aparecen en el ar
chivo. En contraste, tanto el arreglo como el registro son estructuras de acceso alea
torio. lo cual significa que el tiem po necesario para acceder a un com ponente de
un arreglo o de un registro es independiente del valor del ndice del arreglo o del
selector de campo. La ventaja de agrupar por archivos en lugar de hacerlo por arre
glos es que el nm ero de elem entos de un archivo puede ser ilim itado y variable
con el tiempo.

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

TIPO S DE DATOS. ESTRU C TU R A S DE DATOS Y TIPO S DE D A TO S ABSTRACTOS

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.

Ejemplo de una estructura de datos.

Las celdas de la cadena de registros de la figura 1.10 son del tipo


type
tipo_reg = record
cursor, integer;
ap: t tipo_reg
end

www.FreeLibros.me

16

D ISE O Y AN ALISIS DE A LGO RITM OS

A la cadena apunta una variable llamada encabezamiento, que es de tipo t tipo_reg; en


cabezamiento apunta a un registro annim o de tipo tipo_reg t- Ese registro tiene valor
4 en el cam po cursor, este 4 se considera com o un ndice del arreglo lista-reg, y en
el cam po ap tiene un verdadero apuntador a otro registro annim o. Este ltim o tie
ne un ndice en su cam po cursor, que indica la posicin 2 en lista-reg, y un apunta
dor nil en su cam po ap.

1 .4

Tiempo de ejecucin de un programa

C uando se resuelve un problem a, con frecuencia hay necesidad de elegir entre va


rios algoritmos. Cmo se debe elegir? Hay dos objetivos que suelen contradecirse:
1.
2.

Que el algoritm o sea fcil de entender, codificar y depurar.


Que el algoritm o use eficientem ente los recursos del com putador y, en especial,
que se ejecute con la m ayor rapidez posible.

Cuando se escribe un program a que se va a usar una o pocas veces, el prim er ob


jetivo es el ms im portante. En tal caso, es m uy probable que el costo del tiem po de
program acin exceda en m ucho al costo de ejecucin del program a, de m odo que el
costo a optim ar es el de escritura del program a. En cam bio, cuando se presenta un
problem a cuya solucin se va a utilizar muchas veces, el costo de ejecucin del pro
grama puede superar en m ucho al de escritura, en especial si en la m ayor parte de
las ejecuciones se dan entradas de gran tam ao. Entonces, es ms ventajoso, desde
el punto de vista econm ico, realizar un algoritm o com plejo siem pre que el tiempo
de ejecucin del program a resultante sea significativam ente m enor que el de un pro
grama m s evidente. Y aun en situaciones com o esa, quiz sea conveniente im plantar
prim ero un algoritm o simple, con el objeto de determ inar el beneficio real que se
obtendra escribiendo un program a ms complicado. En la construccin de un sis
tem a complejo, a m enudo es deseable im plantar un prototipo sencillo en el cual se pue
dan efectuar sim ulaciones y m ediciones antes de dedicarse al diseo definitivo. De
esto se concluye que un program ador no slo debe estar al tanto de las form as de
lograr que un program a se ejecute con rapidez, sino que tam bin debe saber cundo
aplicar esas tcnicas y cundo ignorarlas.

Medicin del tiempo de ejecucin de un programa


El tiem po de ejecucin de un program a depende de factores como:
1.
2.

los datos de entrada al program a,


la calidad del cdigo generado por el com pilador utilizado para crear el progra
m a objeto,

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

TIE M PO DE EJEC U CIO N DE U N PR OGR AM A

3.
4.

17

la naturaleza y rapidez de las instrucciones de m quina em pleadas en la ejecu


cin del program a, y
la com plejidad de tiem po del algoritm o base del program a.

El hecho de que el tiem po de ejecucin dependa de la entrada, indica que el tiem


po de ejecucin de un program a debe definirse com o una funcin de la entrada. Con
frecuencia, el tiem po de ejecucin no depende de la entrada exacta, sino slo de
su tam ao. Un buen ejem plo de esto es el proceso conocido como clasificacin
(sorting), que se analizar en el captulo 8. En un problem a de clasificacin, se da
como entrada una lista de elem entos para ordenar a fin de producir com o salida
otra lista con los m ismos elem entos, pero clasificados de m enor a m ayor o vicever
sa. Por ejemplo, dada la lista 2, 1, 3, 1, 5, 8 com o entrada, se desea producir la lista
1, 1, 2, 3, 5, 8 como salida. Se dice entonces que los elem entos de la segunda lista
estn en orden de menor a mayor. La m edida natural del tam ao de la entrada a un
program a de clasificacin es el nm ero de elem entos a ordenar o, en otras palabras,
la longitud de la lista de entrada. En general, la longitud de la entrada es una m edi
da apropiada de tam ao, y se supondr que tal es la m edida utilizada a m enos que
se especifique lo contrario.
Se acostum bra, pues, a denom inar T(n) al tiem po de ejecucin de un program a
con una entrada de tam ao n. Por ejem plo, algunos program as pueden tener un tiem
po de ejecucin T(n) = en2, donde c es una constante. Las unidades de T(n) se dejan
sin especificar, pero se puede considerar a T{n) com o el nm ero de instrucciones
ejecutadas en un com putador idealizado.
Para m uchos program as, el tiem po de ejecucin es en realidad una funcin de la
entrada especfica, y no slo del tam ao de ella. En este caso se define T{n) como el
tiempo de ejecucin del peor caso, es decir, el m xim o valor del tiem po de ejecucin
para entradas de tam ao n. Tam bin suele considerarse Tprom(n), el valor medio
del tiem po de ejecucin de todas las entradas de tam ao n. A unque Tprom(n) parece
una m edida ms razonable, a m enudo es engaoso suponer que todas las entradas
son igualmente probables. En la prctica, casi siem pre es m s difcil determ inar el
tiem po de ejecucin prom edio que el del peor caso, pues el anlisis se hace intrata
ble en matemticas, y la nocin de entrada prom edio puede carecer de un signi
ficado claro. As pues, se utilizar el tiem po de ejecucin del peor caso como m e
dida principal de la com plejidad de tiem po, aunque se m encionar la com plejidad
del caso prom edio cuando pueda hacerse en form a significativa.
Considrense ahora las observaciones 2 y 3 anteriores; a saber, que el tiem po de
ejecucin depende del com pilador y de la m quina utilizados. Este hecho implica
que no es posible expresar T{n) en unidades estndares de tiempo, como segundos. An
tes bien, slo se pueden hacer observaciones como el tiem po de ejecucin de tal al
goritmo es proporcional a n2, sin especificar la constante de proporcionalidad, pues
depende en gran m edida del com pilador, la m quina y otros factores.

Notacin asinttica (o mayscula y omega mayscula)


Para hacer referencia a la velocidad de crecim iento de los valores de una funcin se
usar la notacin conocida como notacin asinttica (o mayscula). Por ejemplo, de

www.FreeLibros.me

18

DISEO Y ANALISIS DE A LGO RITM OS

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, ....

La tirana de la velocidad de crecimiento


Se supondr que es posible evaluar program as com parando sus funciones de tiempo
de ejecucin sin considerar las constantes de proporcionalidad. Segn este supuesto,
un program a con tiem po de ejecucin 0 (n 2) es m ejor que uno con tiem po de ejecut Obsrvese la asimetra existente entre ias notaciones o mayscula y omega mayscula. La razn de que
esta asim etra sea con frecuencia til, es que m uchas veces un algoritm o es rpido con m uchas entradas
pero no con todas. Por ejem plo, para probar si la entrada e s de longitud prim a, existen algoritm os que se
ejecutan m uy rpido si la longitud es par, de m odo que para el tiem po de ejecucin no es posible obtener
una buena cota inferior que sea vlida para toda n 2: n0.

www.FreeLibros.me

T IE M PO DE EJEC U CIO N D E U N PR OGR AM A

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.

Tiem pos de ejecucin de cuatro programas.

www.FreeLibros.me

20

DISE O Y ANALISIS DE A LGO RITM OS

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

Efecto de m ultiplicar por diez la velocidad del computador.

En la tercera colum na de la figura 1.12 se puede apreciar una superioridad evi


dente del program a 0(n)\ ste perm ite un aum ento del 1000% en el tam ao de pro
blem a para un increm ento del 1000% en la rapidez del com putador. Se observa que
los program as 0(n>) y 0 ( n 2) perm iten aum entos de 230% y 320%, respectivamente,
en el tam ao de problem a, para un increm ento del 1000% en la rapidez del com pu
tador. Estas razones se m antendrn vigentes para increm entos adicionales en la ra
pidez del com putador.
M ientras exista la necesidad de resolver problem as cada vez ms grandes, se pro
ducir una situacin casi paradjica. A m edida que los com putadores aum enten su
rapidez y dism inuyan su precio, como con toda seguridad seguir sucediendo, tam
bin el deseo de resolver problem as m s grandes y com plejos seguir creciendo. As,
la im portancia del descubrim iento y el empleo de algoritm os eficientes (aquellos cu
yas velocidades de crecim iento sean pequeas) ir en aum ento, en lugar de dism i
nuir.

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.

Si un program a se va a utilizar slo algunas veces, el costo de su escritura y de


puracin es el dom inante, de m anera que el tiem po de ejecucin raram ente in
fluir en el costo total. En ese caso debe elegirse el algoritm o que sea m s fcil
de aplicar correctam ente.
2. Si un program a se va a ejecutar slo con entradas pequeas, la velocidad de
crecim iento del tiem po de ejecucin puede ser m enos im portante que el factor
constante de la frm ula del tiem po de ejecucin. D eterm inar qu es una entra
da pequea, depende de los tiem pos de ejecucin exactos de los algoritm os im
plicados. Hay algoritm os (como el de m ultiplicacin de enteros de Schonhage y
Strassen [1971]) que son asintticam ente los m s eficientes para sus proble
mas, pero nunca se han llevado a la prctica ni siquiera con los problem as ms
grandes, debido a que la constante de proporcionalidad es dem asiado grande
com parada con la de otros algoritm os m enos eficientes.
3. Un algoritm o eficiente pero com plicado puede no ser apropiado porque poste
riorm ente puede tener que darle m antenim iento otra persona distinta del escri
tor. Se espera que al difundir el conocim iento de las principales tcnicas de di
seo de algoritm os eficientes, se podrn utilizar librem ente algoritm os m s com
plejos, pero debe considerarse la posibilidad de que un program a resulte intil
debido a que nadie entiende sus sutiles y eficientes algoritmos.
4. Existen ejem plos de algoritm os eficientes que ocupan dem asiado espacio para
ser aplicados sin alm acenam iento secundario lento, lo cual puede anular la efi
ciencia.
5. En los algoritm os num ricos, la precisin y la estabilidad son tan im portantes
como la eficiencia.

1 .5

Clculo del tiempo de ejecucin de un programa

Calcular el tiem po de ejecucin de un program a arbitrario, aunque slo sea una


aproxim acin a un factor constante, puede ser un problem a m atem tico complejo.
Sin embargo, en la prctica esto suele ser m s sencillo; basta con aplicar unos cuan
tos principios bsicos. Antes de presentar estos principios, es im portante aprender a
sum ar y a m ultiplicar en notacin asinttica.
Supngase que 7',(/z) y T 2(n) son los tiem pos de ejecucin de dos fragm entos de
program a P, y P 2, y que 7j(n) es CKfin)) y T2(n) es Cfig(n)). Entonces 7j(/t) +
+ T2(n), el tiem po de ejecucin de P , seguido de P2, es 0 (mx (fin), g(n))). Para saber
por qu, obsrvese que para algunas constantes, c, c2, n y n2, si n > n u entonces

www.FreeLibros.me

22

DISE O Y ANALISIS DE ALG O RITM O S

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

CALCULO D E L T IE M PO D E EJEC U CIO N D E U N PR OGR AM A

23

Ahora deben tenerse en cuenta las proposiciones condicionales y las de control


de ciclos. Las proposiciones if y for estn anidadas unas dentro de otras, de modo

(1)
(2)
(3)
(4)
(5)
(6)

procedure burbuja ( var A: array [l..] of integer );


burbuja clasifica el arreglo A de m enor a m ayor }
var
i, j, tem p: integer;
begin
for i
1 to n- 1 do
for j
n downto i + 1 do
if A [ j- 1] > A ] ) then begin
I intercam bia A \ j - 1] y Aj] |
t e m p : - A \ j - 1];
A [j-\]
A[j]A (j] tem p
end
end; I burbuja I
Fig. 1.13.

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

DISE O Y ANALISIS-DE A LGO RITM OS

En el captulo 8 se presentarn program as de clasificacin cuyo tiem po de ejecucin


es O(nlogn), que es considerablem ente m enor, dado que log/7 f es mucho m enor que
n para valores grandes de n.
Antes de proseguir con algunas reglas generales de anlisis, recurdese que la de
term inacin de una cota superior precisa para el tiem po de ejecucin de un progra
ma, unas veces es sencilla, pero otras puede ser un desafo intelectual profundo. No
existe un conjunto com pleto de reglas para analizar programas; en este libro slo se
proporcionarn ciertas sugerencias e ilustrarn algunos de sus aspectos ms sutiles
m ediante ejemplos.
Se enum erarn ahora algunas reglas generales para el anlisis de programas. En
general, el tiem po de ejecucin de una proposicin o de un grupo de ellas puede te
ner com o parm etros el tam ao de la entrada, una o ms variables, o am bas cosas.
El nico parm etro perm isible para el tiem po de ejecucin del program a completo
es n. el tam ao de la entrada.
1.

El tiem po de ejecucin de cada proposicin de asignacin (lectura y escritura),


por lo com n puede tom arse com o 0(1). Hay unas cuantas excepciones, como
en PL/I, donde una asignacin puede im plicar m atrices arbitrariam ente grandes,
y en cualquier lenguaje donde se perm itan llam adas a funciones en las proposi
ciones de asignacin.
2. El tiem po de ejecucin de una secuencia de proposiciones se determ ina por la
regla de la suma. Esto es, el tiem po de ejecucin de una secuencia es, dentro de
un factor constante, el m xim o tiem po de ejecucin de una proposicin de la se
cuencia.
3. El tiem po de ejecucin de una proposicin condicional if es el costo de las pro
posiciones que se ejecutan condicionalm ente, m s el tiem po para evaluar la con
dicin. El tiem po para evaluar la condicin, por lo general, es 0(1). El tiempo
para una construccin if-then-else es la sum a del tiem po requerido para evaluar
la condicin ms el m ayor entre los tiem pos necesarios para ejecutar las propo
siciones cuando la condicin es verdadera y el tiem po de ejecucin de las pro
posiciones cuando la condicin es falsa.
4. El tiem po para ejecutar un ciclo es la sum a, sobre todas las iteraciones del ci
clo, del tiem po de ejecucin del cuerpo y del em pleado para evaluar la condi
cin de term inacin (este ltim o suele ser 0 ( 1)). A m enudo este tiem po es, des
preciando factores constantes, el producto del nm ero de iteraciones del ciclo
y el m ayor tiem po posible para una ejecucin del cuerpo, pero, por seguridad,
debe considerarse cada iteracin por separado. P o r lo com n, se conoce con cer
teza el nm ero de iteraciones, pero en ocasiones no es posible determ inarlo con
precisin. Incluso puede ocurrir que un program a no sea un algoritm o y que no
exista un lm ite al nm ero de iteraciones de ciertos ciclos.

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

CA LCU LO DEL TIEM PO DE EJEC U CIO N DE U N PR OGR AM A

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.

Programa recursivo para calcular factoriales.

Suponiendo que n > 2, se puede desarrollar 7X n-l) en (1.1) para obtener

www.FreeLibros.me

1- 1)

26

DISEO Y ANALISIS DE A LGO RITM OS

Esto es, r ( n - l ) - c + T(n-2), com o se puede ver al sustituir n por n- 1 en (1.1). As


pues, es posible reem plazar T ( n - \) con c + T (n -2) en la ecuacin T(n) - c + T (n -l)
Despus, se puede usar (1.1) para desarrollar T in -2), con lo que se obtiene
T(n) - 3 c + T (n -3)

si n > 3

y as sucesivam ente. En general,


T(n) = ic + T (n -i)

si n > i

Por ltim o, cuando / = n -1 , se obtiene


T(n) = c ( n - \) + T ( \) - c ( n - \) + d

(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).

Programas con proposiciones COTO


Hasta ahora, al analizar el tiem po de ejecucin de un program a, se supuso de m a
nera tcita que el flujo de control dentro de un procedim iento estaba determ inado
por construcciones de ciclos y de ramificacin. Esto sirvi como base en la deter
m inacin del tiem po de ejecucin de grupos de proposiciones cada vez m s gran
des, al suponer que slo se necesitaba la regla de la sum a para agrupar secuencias
de proposiciones. Sin em bargo, las proposiciones goto (proposiciones de transferen
cia incondicional de control) hacen m s complejo el agrupam iento lgico de las pro
posiciones de un program a. Por esta razn, las proposiciones goto deberan evitarse,
pero Pascal carece de proposiciones para salir de un ciclo o term inarlo en form a anor
mal (como break y continu), por lo que con frecuencia se utiliza goto para estos
fines.
Para m anejar proposiciones goto que realicen saltos de un ciclo a cdigo que
con seguridad est despus del ciclo, se sugiere el siguiente enfoque. (Por lo general,

www.FreeLibros.me

CALCULO DEL T IE M PO DE EJEC U CIO N DE U N PR OGR AM A

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

DISE O Y AN ALISIS DE A LGO RITM OS

Buenas prcticas de programacin

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:

transate [A-Z] [a-z], espacio nueva_lnea


sort
unique
d iff diccionario

La program acin a nivel de m andatos requiere disciplina por parte de una co


m unidad de program adores; stos deben escribir program as como filtros, y escribir
herram ientas, en lugar de program as de propsito especial, siem pre que les sea po
sible. La recom pensa de esto, en funcin de la razn global entre trabajo y resulta
dos, es sustancial.

t U N IX e s marca registrada de los Laboratorios Bell.


t t Podra usarse un diccionario no abreviado, pero m uchos de los errores ortogrficos pueden ser pa
labras en desuso.

www.FreeLibros.me

30

DISE O Y ANALISIS DE A LGO RITM OS

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.

Programa de clculo de factoriales con proposiciones de retorno.

www.FreeLibros.me

EJER CICIOS

31

function fact ( n: in te g e r) : integer;


label
999;
begin
if n < - 1 then
begin
f a c t 1;
goto 999
end
else
begin
f a c t : n * fa c t(n -1);
goto 999
end
999:
end: i fact |
Fig. 1.16.

Programa resultante en Pascal.

La tercera extensin a Pascal que se utiliza consiste en usar expresiones como


nom bres de tipos a lo largo de un program a de m anera uniform e. Por ejemplo, una
expresin como t tip o .celd a, aunque puede em plearse en cualquier otra parte, no se
perm ite com o tipo de un parm etro de un procedim iento o como tipo del valor de
vuelto por una funcin. Tcnicam ente, Pascal requiere que se invente un nom bre
para la expresin de tipo, como ap_a_celda. En este libro se perm itir este uso de
las expresiones de tipo, y se sugiere inventar un nom bre para el tipo y que en forma
mecnica se reem placen las expresiones por los nom bres. As, se escribirn propo
siciones como
function y (A: array [L.IO] of integer): t tipo_celda
en lugar de
function y (A: arreglo_de_diez_enteros): ap_a_celda
Para concluir, debe hacerse una observacin acerca de las convenciones tipogr
ficas que se utilizan en los program as. Las palabras reservadas de Pascal se escriben
en negritas; los tipos, en redondas, y los nom bres de variables, en cursivas. Se har
distincin entre letras m aysculas y minsculas.

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

DISE O Y ANALISIS DE ALG O RITM O S

adem s, se enfrent al O y al F. El E ha jugado contra el C y el F. Cada


equipo tiene un encuentro por sem ana. Elabrese un calendario tal que cada
equipo haya jugado contra todos los dem s en el m enor nm ero posible de
sem anas. Sugerencia: Disese un grafo cuyos vrtices representen pares de
equipos que an no se hayan enfrentado. Cules deberan ser las aristas
para que en una coloracin lcita del grafo. cada color pudiera representar
los juegos realizados en una semana?
1.2

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

Supngase que se desean m ultiplicar cuatro matrices de nmeros reales: M, x


x M 2 x M j x A/, donde M , es de 10 por 20, M 2 de 20 por 50, A/3 de 50
por 1 y M 4 de 1 por 100. Supngase que la m ultiplicacin de una m atriz
de p x q por o tra de q x r requiere pqr operaciones escalares, como sucede
con el algoritm o usual de m ultiplicacin de matrices. Encuntrese el orden
ptim o de m ultiplicacin de m atrices que m inim ice el nm ero total de ope
raciones escalares. Cmo se encontrara ese ordenam iento ptim o si se tu
viera un nm ero arbitrario de m atrices?

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

En la seccin 1.2, se consider el TDA C O N JU N T O con las operaciones


ANULA, U N IO N y TAM AO. Supngase por conveniencia que todos los
conjuntos son subconjuntos de |0, 1,..., 31 {, y que el TD A CO N JU N TO se
interpreta com o el tipo de datos de Pascal set of 0..31. Escrbanse procedi
m ientos en PASCAL para esas operaciones utilizando esta realizacin de
CO N JU N TO .

1.7

El m xim o com n divisor de dos enteros p y q es el m ayor entero d que di


vide exactam ente p y q. Se desea desarrollar un program a para calcular el
m xim o com n divisor de dos enteros p y q con el siguiente algoritmo. Sea
r el residuo de d ividir p entre q. Si r es igual a cero, entonces q es el mxi
m o com n divisor. En caso contrario, hgase que p tom e el valor de q, y q
el de r, y reptase el proceso.
a) M ustrese que este proceso encuentra el m xim o comn divisor co
rrecto.

www.FreeLibros.me

E JER CICIO S

33

b) Refnese el algoritm o en la forma de un program a en seudolenguaje.


c) Convirtase el program a en seudolenguaje en un program a en Pascal.
1.8

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

Considrese un conjunto de n ciudades y una tabla de distancias entre pa


res de ellas. Escrbase un program a en seudolenguaje que encuentre un ca
m ino corto que pase por cada ciudad slo una vez y vuelva a la ciudad en
que empez. No se conoce un m todo que no realice una bsqueda exhaus
tiva para obtener el recorrido m s corto. As pues, intntese encontrar un
algoritm o eficiente para este problem a utilizando algn procedim iento heu
rstico razonable.
Considrense las siguientes funciones de n:
f(n) -

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

Para cada posible par de valores de i y j, indquese si f ( n ) es (X f^n)) o no,


y si f ( n ) es CK/^n)) o no.
1.11

Considrense las siguientes funciones de n:


1 nl para n par >: 0
i
*
[ n } para n im p ar > 1

S2(") gi(n) -

( n para 0 < n < 100


| n 3 para n > 100
25

Para cada par de valores de i y S indiqese si g,(n)esO (g/n)) o no, y si g,(n)


es Ci(g/rt)) o no.

www.FreeLibros.me

DISE O Y AN ALISIS DE A LGO RITM OS

1.12

M ediante la notacin asinttica, obtnganse los tiem pos de ejecucin del


peor caso supuesto para cada uno de los procedim ientos siguientes como
una funcin de n.
a)

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)

procedure misterio ( n: in te g e r);


var
i, j, kr. integer;
begin
for / 1 to n 1 do
for j
/ + 1 to n do
for k
1 to j do
I alguna proposicin que requiera tiem po 0(1)
end

c)

procedure m u y sim p a r ( n: integer );


var
i, j, x, y. integer;
begin
for i
1 to n do
if odd() then begin
for j
i to n do
x
x + 1;
for j
1 to i do

y+i

end
end
*d)

function recursiva ( n: integer ) : integer;


begin
if n < - 1 then
return (1)
else
return ( recursiva(rt - 1) + recursiva(n - 1))
end

www.FreeLibros.me

EJER CICIOS

1.13

35

M ustrese que las siguientes afirm aciones son verdaderas.


a) 17 es 0(1).
b) n (n -\)/2 es 0 ( n 2).
c) m x(/i3, 10n2) es 0 ( n 3).
d) X

i-i

'* es 0 ( n k*]) y (n*) para k entero.

e) Si p{x) es cualquier polinom io de grado k donde el coeficiente del tr


m ino de m ayor grado es positivo, entonces p{n) es 0 (n k) y l(nk).
*1.14

Supngase que T t(n) es &U(n)) y T 2(n) es 2(g(n)). Son verdaderas las si


guientes afirm aciones?
a) r,(n) + T 2(n) es 2(mx(/(n), g(n))).
b) T t(n)T 2(n) es Cl(J(n)g(n)).

*1.15

Algunos autores definen la notacin omega mayscula de la siguiente manera:


J[n) es Q((n)) si existen nQy c > O tales que para todo n > n0 se tiene que
J{n) > cg{n).
a) Es verdadero para esta definicin q u ejan ) es lQKn)) si, y slo si, g[n)
es 0(An)V.
b) Es a) verdadero para la definicin de omega mayscula que se dio en
la seccin 1.4?
c) Se cumplen con esta definicin de omega mayscula las afirmaciones a) y
b) del ejercicio 1.14?

1.16

Ordnense las siguientes funciones de acuerdo con su velocidad de creci


miento: a) n, b) V, c) logn, d) loglogn, e) log2n, f) nflogn, g) Vlog2n,
h) (1/3)", i) (3/2r , j) 17.

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;

while x < n do begin


x :- 2 * x-,
cuenta :- cuenta + 1
end;
writeln (cuenta)
end

www.FreeLibros.me

36

D ISE O Y ANALISIS DE A LGO RITM OS

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

NO TA S BIBLIO GRA FICAS

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

En este captulo se estudiarn algunos tipos de datos abstractos fundamentales. Se


considerarn las listas, que son secuencias de elem entos, y dos tipos especiales de
listas: las pilas, donde los elem entos se insertan y elim inan slo en un extremo, y las
colas, donde los elem entos se insertan por un extrem o y se elim inan por el otro. Se
estudiar despus, en form a breve, la correspondencia o m em oria asociativa (mapping), un TD A que se com porta com o una funcin. Para cada uno de estos TDA, se
considerarn varias realizaciones y se analizarn sus m ritos relativos.

2 .1

El tipo de datos abstracto lista

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

EL T IPO DE DATOS ABSTRACTO LISTA

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.

TIPO S DE D A TO S ABSTRACTOS FUNDA M ENTALES

SIGUIENTE(p, L) y AN TERIOR {p, L) devuelven las posiciones siguiente y an


terior, respectivam ente, a p en la lista L . Si p es la ltim a posicin de L , SI
G U IE N T E ^. L )-FIN (L ). SIG U IEN TE no est definida si p es FIN(L). AN TE
RIO R no est definida si p es 1. Ambas funciones estn indefinidas cuando L
no tiene posicin p.
ANULA(L). Esta funcin ocasiona que L se convierta en la lista vaca y devuel
ve la posicin FIN(L).
PRIM ERO(L). Esta funcin devuelve la prim era posicin de la lista L. Si L est
vaca, la posicin que se devuelve es FIN(L).
IMPRIM E_LISTA(L). Im prim e los elem entos de L en su orden de aparicin en
la lista.

Ejemplo 2.1. Con estos operadores se escribir un procedim iento PU R G A que


tom a com o argum ento una lista y elim ina sus elem entos con doble entrada. Los ele
m entos son de tipo tipo_elem ento, y una lista de ellos es de tipo LISTA; esta con
vencin se seguir en todo el captulo. H ay una funcin mism o(x, y), donde x e y
son de tipo tipo_elem ento, que es verdadera si x e y son el m ismo elem ento, y es
falsa en caso contrario. El significado de ser el m ism o es intencionalm ente im pre
ciso. Si tip o .elem en to es real, por ejem plo, podra desearse que m ism o(x, y) fuera
verdadera si, y slo si, x = y. Sin em bargo, si tipo_elem ento es un registro que con
tiene el nm ero de cuenta, el nom bre y la direccin de un suscriptor como en
type
tipo_elem ento - record
n m -cta: integer;
nombre, packed array [ 1..20] of char;
direccin: packed array [ 1..50] of char
end
por consiguiente podra desearse que m ism o(x,y) fuera verdadera siem pre que
x .n m -d a - y.nm ^cta f.
La figura 2.1 m uestra el cdigo de PU RG A . Las variables p y q se usan para re
presentar dos posiciones en la lista. Conform e el program a avanza, se elim inan de la
lista todas las entradas dobles de cualquier elem ento a la izquierda de la posicin p.
En una iteracin del ciclo (2)-(8), q se usa para revisar la lista a partir de la posicin
p, con el objeto de elim inar cualquier entrada doble del elem ento en la posicin p.
Despus, p avanza a la siguiente posicin y el proceso se repite.
En la siguiente seccin, se proporcionarn las declaraciones apropiadas para LIS
TA y posicin, y una aplicacin de las operaciones, de m anera que PU RG A se con
vierta en un program a ejecutable. Com o ya se dijo, el program a es independiente de
la forma en que se representen las listas, por lo que hay libertad para experim entar
con varias realizaciones de listas.
t En este caso, si se elim inan los registros que son el m ism o, podra desearse verificar que los nom
bres y direcciones fueran iguales; si los nm eros de cuenta fueran iguales, pero los otros datos no, e s po
sib le que se haya asignado inadvertidam ente e l m ism o nm ero de cuenta a dos personas. N o obstante, es
ms probable que el m ism o suscriptor aparezca m s de una vez en la lista, con diferentes nm eros y con
los dem s datos ligeram ente distintos. En tales casos, resulta difcil elim inar las entradas dobles.

www.FreeLibros.me

REALIZACION DE LISTAS

(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)

41

procedure PU RG A ( var L: LISTA ) ;


IPURGA elim ina los elem entos duplicados de la lista L\
var
p, q-. posicin; | p ser la posicin actual en L, y q
avanzar para encontrar elem entos iguales I
begin
p
PRIM ERO(L);
while p < > FIN(L) do begin
q
S IG U IE N T E ^, L);
while q < > FIN(L) do
if m/mo(RECUPERA(/7, L), RECU PERA R , L)) then
SU PRIM EN. L)
else
q
S IG U IE N T E ^, L);
p
SIG U IE N T E ^, L)
end
end, ! PU R G A |
Fig. 2.1.

Programa para elim inar duplicados.

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

En esta seccin se describirn algunas estructuras de datos que pueden utilizarse


para representar listas. Se considerarn realizaciones de listas basadas en arreglos,
apuntadores y cursores. Cada una de ellas perm ite realizar ciertas operaciones con
listas de m anera ms eficiente que otras.

Realizacin de listas m ediante arreglos


En la realizacin de una lista m ediante arreglos, los elem entos de sta se alm acenan
en celdas contiguas de un arreglo. Esta representacin perm ite recorrer con facili
dad una lista y agregarle elem entos nuevos al final. Pero insertar un elem ento en la
m itad de la lista obliga a desplazarse una posicin dentro del arreglo a todos los
elem entos que siguen al nuevo elem ento para concederle espacio. De la m ism a for

www.FreeLibros.me

42

T IPO S D E DATOS ABSTRACTOS FU NDA M ENTALES

m a, la elim inacin de un elem ento, excepto el ltim o, requiere desplazam ientos de


elem entos para llenar de nuevo el vaco form ado.

1
2

prim er elem ento

>

segundo elem ento


> lista

lt [

ltim o elem ento

s
> vaco

lo ng-m x
Fig. 2.2.

Realizacin de una lista mediante un arreglo.

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

procedure INSERTA ( x. tipo_elem ento; p: posicin; var L: LISTA );


I INSERTA coloca x en la posicin p de la lista L (
var
q: posicin;
begin
if L.ll > - lo ng-m dx then
error (la lista est llena)
else if (p > L.ll + 1) or (p < 1) then
error (la posicin no existe)
eise begin
for q
L.ll downto p do
i desplaza los elem entos en p .p + 1,... una posicin hacia abajo I
L.elementos [q+ 1]
L.elementos[q]\
L . l l L . l t + 1;
L.elementos[p] x
end
end; i INSERTA 1
procedure SU PRIM E (p : posicin; var L: LISTA );
I SU PRIM E elim ina el elem ento en la posicin p de la lista L }
var
q-. posicin;
begin
if (p > L.lt) or (p < 1) then
error (la posicin no existe)
else begin
L . l l L . l l - 1;
for q p to L.lt do
I desplaza los elem entos en p + 1, p + 2... una posicin hacia
arriba 1
L.elementos[q]
L.elementos[q + 1]
end
end; 1SU PRIM E i
function LOCALIZA ( x. tipo_elem ento; var L: LISTA ) : posicin;
I LOCALIZA devuelve la posicin de x en la lista L |
var
q-. posicin;
begin
for q
1 to L.lt do
if L.elementos[q] - x then
return (<?);
return (L.lt. + 1) j si no se encuentra I
end; I LOCALIZA |
Fig. 2.3.

Realizacin basada en arreglos de algunas operaciones con listas.

www.FreeLibros.me

44

T IPO S DE DATOS ABSTRACTOS FUNDA M ENTALES

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.

las definiciones de tipo_elem ento y de la funcin mismo.


las definiciones de LISTA, posicin y FIN (L) anteriores,
la definicin de SU PRIM E de la figura 2.3, y
definiciones adecuadas para los procedim ientos triviales PRIM ERO , SIG UIEN
TE y RECUPERA,

entonces se obtiene un procedim iento PU R G A ejecutable.


Al principio puede parecer tedioso escribir procedim ientos que rijan todos los ac
cesos a las estructuras subyacentes de un program a. Sin embargo, si se logra estable
cer la disciplina de escribir program as en funcin de operaciones de manipulacin
de tipos de datos abstractos en lugar de usar ciertos detalles de im plantacin particu
lares, es posible m odificar los program as m s fcilm ente con slo aplicar de nuevo
las operaciones, en lugar de buscar en todos los program as aquellos lugares donde
se hacen accesos a las estructuras de datos subyacentes. La flexibilidad que se obtie
ne con esto, puede ser especialm ente im portante en proyectos grandes, y no se debe
poner en tela de juicio este concepto por los ejemplos, necesariam ente pequeos,
que se encuentran en este libro.

Realizacin de listas m ediante apuntadores


La segunda forma de realizacin de listas, celdas enlazadas sencillas, utiliza apuntado
res para enlazar elem entos consecutivos. Esta im plantacin perm ite eludir el empleo
de m em oria contigua para alm acenar una lista y, por tanto, tam bin elude los des
plazam ientos de elem entos para hacer inserciones o rellenar vacos creados por la
elim inacin de elem entos. No obstante, por esto hay que pagar el precio de un es
pacio adicional para los apuntadores.
En esta representacin, una lista est form ada por celdas; cada celda contiene un
elem ento de la lista y un apuntador a la siguiente celda. Si la lista es a ,, a2, ..., a,
la celda que contiene a, tiene un apuntador a la celda que contiene a at, para
i = 1 , 2 1 . La celda que contiene a posee un apuntador nil. Existe tam bin una
celda de encabezamiento que apunta a la celda que contiene a,; esta celda de encabeza
miento no tiene ningn elementof. En el caso de una lista vaca, el apuntador del encabet El em pleo de una celda com pleta para el encabezamiento simplifica la implantacin de operaciones con
listas en Pascal. Es posible usar apuntadores com o encabezamientos si se pretende aplicar operaciones de m odo
que las inserciones y las elim inaciones al principio de la lista se manejen de manera especial. Vase el anlisis
de este m todo en esta m ism a seccin, en el apartado que explica la realizacin de listas mediante cursores.

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.

T IP O S D E D A TO S ABSTRACTOS FU NDA M ENTALES

usar una representacin de listas que incluya un apuntador de la ltim a celda, o


sustituir el uso de FIN(L) donde sea posible. Por ejemplo, la condicin
p < > F I N ( L ) de la lnea (2) de la figura 2.1 podra reem plazarse por
p f. sig < > nil, al costo de que ese program a dependa de una realizacin parti
cular de listas.

La figura 2.6 contiene rutinas para las operaciones INSERTA, SUPRIM E, LO


CALIZA y ANULA usando esta realizacin de listas con apuntadores. Las operacio
nes restantes se pueden obtener com o rutinas de un solo paso, con la excepcin de
AN TERIOR, que requiere revisar la lista desde el principio. Estas rutinas se dejan
com o ejercicio para el lector. Obsrvese que m uchos de los m andatos no necesitan
el parm etro L, la lista, por lo que se omite.
En la figura 2.7 se m uestra la mecnica del m anejo de apuntadores en el proce
dim iento INSERTA de la figura 2.6. La figura 2.7 (a) m uestra la situacin antes de
la ejecucin de INSERTA. Se desea insertar un nuevo elem ento ante la celda que
contiene b, por lo que p es un apuntador a la celda de la lista que contiene el apun
tador a b. En la lnea (1), tem p apunta a la celda que contiene b. En la lnea (2), se
crea una nueva celda de la lista y se hace que el cam po sig de la celda que contiene
a apunte hacia esta m ism a celda. En la lnea (3) se alm acena x en el cam po elemento
de la celda recin creada, y en la lnea (4), el cam po sig tom a el valor de tem p y, de
esta m anera, apunta a la celda que contiene b. La figura 2.7 (b) m uestra el resultado
de la ejecucin de INSERTA. Los apuntadores nuevos se representan con lneas pun
teadas y se m arca el paso en el cual fueron creados.
El procedim iento SU PRIM E es m s sencillo. La figura 2.8 m uestra las m anipu
laciones de apuntadores que realiza el procedim iento SU PRIM E de la figura 2.6.
Los apuntadores antiguos se representan por m edio de lneas de trazo continuo, y
los nuevos por m edio de lneas punteadas.
Obsrvese que una posicin en una im plantacin de listas enlazadas se com porta
de distinta form a que una posicin en una realizacin de arreglos. Supngase que
se tiene una lista con tres elem entos a, b, c y una variable p de tipo posicin que
tiene actualm ente el valor 3; es decir, apunta a la celda que contiene b y, por tanto,
representa la posicin de c. Si se ejecuta un m andato para insertar x en la posicin
2, la lista se convierte en a, x, b, c, con lo cual el elem ento b pasara a ocupar la po
sicin 3. Si se utilizara la realizacin de arreglos descrita anteriorm ente, b y c se mo
veran hacia el principio del arreglo, de m odo que b ocupara en realidad la tercera
posicin.

(1)
(2)
(3)
(4)

procedure INSERTA ( jt. tipo_elem ento; p\ posicin );


var
temp: posicin;
begin
tem p
p\.sig\
new(p\ ,sig)\
p\.sig].elem ento
x;
p \jig ts ig te m p
end; 1INSERTA 1

www.FreeLibros.me

REALIZACIO N DE LISTAS

47

procedure SU PRIM E ( p\ posicin );


begin
p \.s ig p j.s ig l.s ig
end; I SU PR IM E )
function LOCALIZA ( x . tipo_elem ento; L: LISTA ) : posicin;
var
p: posicin;
begin
P

L\

while p \.sig < > ni) do


if p \ .sig t.elemento - x then
return (p)
else
ppUigi
retnrn (p) 1si no es encontrado )
end; {LO C A L IZ A )
function ANULA ( var L : LISTA ) : posicin;
begin
new (L );

L f. n e x t : - nil;
return(L)
end; j A N U L A )
Fig. 2.6.

Algunas operaciones con la realizacin de listas enlazadas.

Pero, si se usara la realizacin de listas enlazadas, el valor de p, que es un apun


tador a la celda que contiene b, no cam biara com o consecuencia de la insercin, de
m odo que despus de sta el valor de p sera la posicin 4, no la 3. Esta variable
de posicin debe actualizarse si se va a usar despus com o posicin de b t-

(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

TIPO S DE DA TO S ABSTRACTOS FUNDA M ENTALES

Flg. 2.8.

Diagrama de SUPRIME.

Comparacin de los mtodos


Cabe preguntarse si en determ inadas circunstancias es m ejor usar una realizacin de
listas basada en apuntadores o una basada en arreglos. A m enudo, la respuesta de
pende de cules son las operaciones que se desea realizar, o las que se realizan ms
frecuentem ente. O tras veces, la decisin depende de lo larga que puede llegar a ser
la lista. Los aspectos m s im portantes a tener en cuenta son los siguientes.
1.

2.

3.

4.

La realizacin con arreglos requiere especificar el tam ao m xim o de una lista


en el m om ento de la com pilacin. Si no es posible acotar la probable longitud
de la lista, quiz deba optarse por una realizacin con apuntadores.
Ciertas operaciones son m s lentas en una realizacin que en otra. Por ejemplo,
INSERTA y SU PRIM E tienen un nm ero constante de pasos para una lista en
lazada, pero cuando se utiliza la realizacin con arreglos, requieren un tiempo
proporcional al nm ero de elem entos que siguen. A la inversa, la ejecucin de
A N TERIO R y FIN requiere un tiem po constante con la realizacin con arre
glos, pero se usa un tiem po proporcional a la longitud de la lista si se usan apun
tadores.
Si un program a efecta inserciones o supresiones que afecten al elem ento que
ocupa la posicin denotada por alguna variable de posicin, y el valor de esa va
riable se va a utilizar posteriorm ente, entonces la representacin con apuntado
res no se puede usar de la form a descrita aqu. Com o principio general, los apun
tadores se deben utilizar con gran cuidado y moderacin.
La realizacin con arreglos puede m algastar espacio, puesto que usa la cantidad
m xim a de espacio, independientem ente del nm ero de elem entos que en rea
lidad tiene la lista en un m om ento dado. La realizacin con apuntadores utiliza
slo el espacio necesario para los elem entos que actualm ente tiene la lista, pero
requiere espacio para el apuntador en cada celda. As, cualquiera de los dos m
todos podra usar m s espacio que el otro, dependiendo de las circunstancias.

Realizacin de listas basadas en cursores


Algunos lenguajes, com o FO RTRA N y ALGOL, no tienen apuntadores. Si se traba
ja con un lenguaje tal, se pueden sim ular los apuntadores m ediante cursores; esto es,
con enteros que indican posiciones en arreglos. Se crea un arreglo de registros para

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

Realizacin de listas enlazadas mediante cursores.

www.FreeLibros.me

50

T IPO S DE D A TO S ABSTRACTOS FUNDA M ENTALES

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.

Cam bio de una celda C de una lista a otra.

function mueve ( var p, q: integer) : boolean;


I mueve coloca la celda apuntada por p delante de la celda apuntada por q (
var
temp: integer;
begin

www.FreeLibros.me

REALIZACION DE LISTAS

51

if p - 0 then begin i celda inexistente I


writeln('l& celda no existe);
return (false)
end
else begin
tem p
q\
Q - P\

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.

Cdigo para cam biar una celda.

Listas doblem ente enlazadas


En algunas aplicaciones puede ser deseable recorrer eficientem ente una lista, tanto
hacia adelante como hacia atrs. O, dado un elem ento, podra desearse determ inar
con rapidez el siguiente y el anterior. En tales situaciones, quiz se quisiera poner
en cada celda de una lista un apuntador a la siguiente celda y otro a la anterior,
como se sugiere en la lista doblem ente enlazada de la figura 2.13. En el captulo 12
se m encionan algunas situaciones especficas en que las listas doblem ente enlazadas
son esenciales por razones de eficiencia.
procedure INSERTA ( x . tipo_elem ento; p: posicin; var L: LISTA);
begin
if p - 0 then begin
{ inserta en la prim era posicin 1
if m ueve ( disponible. L ) then
E SPA C IO [L], elemento
x
end
else I inserta en una posicin que no es la prim era |
if m ueve (disponible, ESPA C IO \p).sig) then
I celda que ocupar x ya apuntada por E SPA C IO [p]./g I
E SPACIO [ESPACIO [/>].$/]. elem ento : - x
end; | INSERTA !
procedure SU PRIM E {p: posicin; var L: LISTA);
begin
if p - 0 then
mueve (L . disponible)
else
mueve (ESPACIO [p].zg, disponible)
end, i SU PRIM E }

www.FreeLibros.me

52

TIPO S D E DA TO S ABSTRACTOS FUNDA M ENTALES

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.

Algunos procedim ientos para listas enlazadas basadas en cursores.

Fig. 2.13.

Una lista doblemente enlazada.

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

Supresin en una lista doblem ente enlazada.

Cambios de los apuntadores para realizar una supresin.

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.

T IPO S D E DATOS ABSTRACTOS FUNDA M ENTALES

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.

Programa que logra el efecto de los caracteres de borrado


y cancelacin de lnea.

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

lnea. Algunas realizaciones de pilas, com o la basada en arreglos, que se analizar a


continuacin, perm iten escribir un procedim iento sencillo para im prim ir los carac
teres de la pila a p a rtir de la base. Sin em bargo, en general, para invertir una pila,
cada elem ento debe sacarse y m eterse en otra pila; luego, los elem entos pueden sa
carse de la segunda pila e im prim irse en el orden en que se sacan.

Realizacin de pilas basada en arreglos


Todas las realizaciones de listas descritas sirven para pilas, puesto que una pila con
sus operaciones es un caso especial de lista con sus operaciones. La representa
cin de una pila como lista enlazada es sencilla, pues METE y SACA operan slo
con la celda de encabezam iento y con la prim era celda de la lista. De hecho, los en
cabezam ientos pueden ser apuntadores o cursores, m s que celdas com pletas, pues
to que para las pilas no existe la nocin de posicin para las listas y, por tanto,
no es necesario representar la posicin 1 en form a anloga a las dem s posiciones.
Sin embargo, la realizacin de listas basada en arreglos que se dio en la sec
cin 2.3 no es particularm ente adecuada para las pilas, dado que cada METE o
SACA tiene que m over la lista entera hacia arriba o hacia abajo, lo cual lleva un tiem
po proporcional al nm ero de elem entos de la pila. U n m ejor criterio para usar un
arreglo es el que tiene en cuenta el hecho de que las inserciones y las supresiones
ocurren slo en la parte superior. Se puede anclar la base de la pila a la base del
arreglo (el extrem o de ndice m s alto) y dejar que la pila crezca hacia la parte su
perior del arreglo (el extrem o de ndice m s bajo). U n cursor llam ado tope indicar
la posicin actual del prim er elem ento de la pila. Esta idea se ilustra en la figura 2.17.
1

* prim er elem ento


* segundo elem ento

tope

long^m x _________

- ltim o elem ento

elementos
Fig. 2.17.

Realizacin de una pila mediante un arreglo.

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

TIPO S DE DATOS ABSTRACTOS FUNDAM ENTALES

U n ejem plo de la pila consiste en la sucesin elementos[tope\, elementos[tope + 1],


.... elementos [lo n g -m x ]. Obsrvese que si tope - lo n g -m x + 1, la pila est vaca.
Las cinco operaciones tpicas con pilas estn realizadas en la figura 2.18. Obsr
vese que para que T O PE devuelva un objeto de tipo tipo-elem ento, ese tipo debe
ser lcito como resultado de una funcin. De lo contrario, TO PE debe ser un proce
dim iento que m odifique su segundo argum ento asignndole el valor TOPE(P) o una
funcin que devuelva un apuntador a tipo-elem ento.
procedure ANULA ( var R. PILA);
begin
P.tope
lo ng-m x + 1
end; | ANULA I
function VACIA ( R. PILA ): boolean;
begin
if P.tope > lo ng-m x then
return (true)
else
return (false)
end; { VACIA |
function TO PE ( var R PILA ): tipo_elem ento;
begin
if VACIA (P) then
error (la pila est vaca)
else
return (P.elementos[P.top\)
end; i TO PE |
procedure SACA ( var R PILA );
begin
if VACIA(P) then
error (la pila est vaca)
else
P.tope
P.tope + 1
end; f SACA I
procedure METE ( x . tipo_elem ento; R. PILA);
begin
if P.tope
1 then
error (la pila est llena)
else begin
P.tope
P. tope - 1;
P.elementos[P.tope] x
end
end; { METE i
Fig. 2.18.

Operaciones con pilas.

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.

ANULA(C) convierte la cola C en una lista vaca.


FRENTE(C) es una funcin que devuelve el valor del prim er elem ento de la cola
C. FRENTE(C) se puede escribir en funcin de operaciones con listas, como
RECUPERA(PRIM ERO(C),C).
3. PONE_EN_COLA(x, Q inserta el elem ento x al final de la cola C. En funcin
de operaciones con listas, PO N E_EN _ COLA(x. Q es INSERTA(x, FIN(C), Q .

4.

QUITA_DE_COLA(C) suprim e el prim er elem ento de C; es decir, QU ITA_DE_COLA(C) es SU PR IM E (P R IM E R O (Q , Q .

5.

VACIA(C) devuelve verdadero si, y slo si, C es una cola vaca.

Realizacin de colas basada en apuntadores


Igual que en el caso de las pilas, cualquier realizacin de listas es lcita para las colas.
No obstante, para aum entar la eficacia de PO NE_EN _COLA es posible aprovechar
el hecho de que las inserciones se efectan slo en el extrem o posterior. En lugar de
recorrer la lista de principio a fin cada vez que se desea hacer una insercin, se pue
de m antener un apuntador (o un cursor) al ltim o elem ento. Com o en las listas de
cualquier clase, tam bin se m antiene un apuntador al frente de la lista; en las colas,
ese apuntador es til para ejecutar m andatos del tipo FRENTE o Q U IT A -D E -C O LA. En Pascal, se utilizar una celda ficticia como encabezam iento y se tendr el apun
tador frontal dirigido a ella. Esta convencin perm ite m anejar convenientem ente
una cola vaca.
Aqu se desarrollar una im plantacin de colas basada en apuntadores de Pas
cal. Se puede desarrollar una realizacin anloga basada en cursores, pero en el caso
de las colas se dispone de una representacin orientada a arreglos, m ejor que la que
se puede obtener por im itacin directa de apuntadores m ediante cursores. Al final
de esta seccin se analizar otra im plantacin, llam ada de arreglos circulares. Para
la realizacin basada en apuntadores, se definirn las celdas como antes:
type
tipo-celda - record
elemento-. tipo_elem ento;
sig-. \ tipo-celda
end;

www.FreeLibros.me

58

TIPO S DE DATOS ABSTRACTOS FUNDA M ENTALES

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.

Realizacin de colas con arreglos circulares


La representacin de listas por m edio de arreglos analizada en la seccin 2.2 puede
usarse para las colas, pero no es m uy eficiente. Es cierto que con un apuntador al
ltim o elem ento es posible ejecutar P O N E -E N -C O L A en un nm ero fijo de pasos,
pero Q U IT A -D E -C O L A , que suprim e el prim er elem ento, requiere que la cola com
pleta ascienda una posicin en el arreglo. As pues, QUITA_DE_COLA lleva un
tiem po 2(/?) si la cola tiene longitud n.
Para evitar este gasto, se debe adoptar un punto de vista diferente. Imagnese
un arreglo como un crculo en el que la prim era posicin sigue a la ltim a, en la
form a sugerida en la figura 2.21. La cola se encuentra en alguna parte de ese crculo,
ocupando posiciones consecutivas t , con el extrem o posterior en algn lugar a la iz
quierda del extrem o anterior. Para insertar un elem ento en la cola, se mueve el apun
tad o r C.post una posicin en el sentido de las m anecillas del reloj, y se escribe el ele
m ento en esa posicin. Para suprim ir, sim plem ente se m ueve C.ant una posicin en
el sentido de las m anecillas del reloj. De esta m anera, la cola se m ueve en ese mis
mo sentido conform e se insertan y suprim en elem entos. Obsrvese que utilizando

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

este modelo los procedim ientos PO NE_EN _COLA y Q U IT A -D E -C O L A se pueden


escribir de tal m an e ra que su ejecucin se realice en un n m ero c o n stan te de p a
sos.
Hay una sutileza que surge en la representacin de la figura 2.21 y en cualquier
variante m enor de esta estrategia (es decir, si C.post apunta a una posicin adelantada
con respecto al ltim o elem ento, en el sentido de las m anecillas del reloj, y no a ese
mismo elemento). El problem a reside en que no hay m anera de distinguir entre una
cola vaca y una que ocupa el crculo com pleto, a m enos que se m antenga un bit que
sea verdadero si, y slo si, la cola est vaca. Si no se est dispuesto a m antener ese
bit, se debe evitar que la cola llegue a llenar todo el arreglo.
Para com prender la razn de esto, supngase que la cola de la figura 2.21 tiene
lo ng-m x elem entos. Entonces C.post debera a p u n tar una posicin adelante de
C.ant en el sentido contrario al de las m anecillas del reloj. Y qu ocurrira si la cola
estuviera vaca? Para ver cm o se representa una cola vaca, considrese prim ero
una que tenga un solo elem ento. Entonces C.ant y C.post apuntan a la m ism a posi
cin. Si en estas condiciones se suprim e ese elem ento, C.ant avanza una posicin en
el sentido de las m anecillas del reloj, form ando una cola vaca. As, en una cola va
ca, C.post est a una posicin de C.ant en sentido contrario al de las m anecillas del
reloj; es decir, est exactam ente en la m ism a posicin relativa que ocupara si la cola
tuviera lo ng-m x elementos. Resulta evidente, pues, que aun cuando el arreglo ten
ga long-m x lugares, no se puede perm itir que la cola crezca m s que lo n g -m x -1,
a m enos que se introduzca un m ecanism o para distinguir las colas vacas.
procedure ANULA ( var C: COLA );
begin
new(C.ant); I crea la celda de encabezam iento |
C.ant].sig
nil;
C.post := C. ant t el encabezam iento es la prim era y la ltim a celdas I
end; I ANULA |
function VACIA ( C: COLA ): boolean;
begin
if C.ant - C. post then
return (true)
else
return (false)
end; | VACIA I
function FRENTE ( C: COLA ): tipo.elem ento;
begin
if VACIA(C) then
erroti,'la cola est vaca)
else
return ( C.ant].sig].elemento)
end; I FRENTE }

www.FreeLibros.me

60

TIPO S DE DATOS-ABSTRACTOS FU NDA M ENTALES

procedure PO NE_EN _COLA ( jc. tipo_elem ento; var C: COLA );


begin
new ( C. post].sig)-, | agrega una nueva celda en el extremo
posterior de la cola I
C .p o s tC .p o s t] .s ig \
C.posi\~3lemenlo
x\
C . p o s t ] . s i g nil
end; | PO NE_EN _COLA |
procedure QU ITA _DE_COLA ( var C: COLA );
begin
f VACIA(C) then
error (la cola est vaca)
else
C . a n t C . a n t ] .s i g
end; ! QU ITA _DE_COLA 1
Fig. 2.19.

Implantacin de mandatos para colas.

ANULA ( O
C. ant
C. post

Fig. 2.20.

Sucesin de operaciones con colas.

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

U na correspondencia o m em oria asociativa es una funcin de elem entos de un tipo


llam ado tipo-dom inio, a elem entos de otro tipo (quizs el m ismo) llam ado tipo-contradominio. Se expresa el hecho de que la correspondencia M asocia el elem ento r
de tipo tipo_contradom inio con el elem ento d de tipo tip o -d o m in io por M(d) - r.
Ciertas correspondencias, como cuadrado(i) - i2, se pueden obtener con facilidad
como una funcin de Pascal por m edio de una expresin aritm tica u otro m edio
sim ple de calcular M (d) a partir de d. Sin embargo, en el caso de muchas correspon
dencias, la nica m anera clara de describir M[d) consiste en alm acenar para cada d
el valor de M(d). Por ejem plo, para aplicar una funcin de nm ina que asocie a cada
em pleado un salario semanal, parece obligatorio alm acenar el salario actual de cada
empleado. En lo que resta de esta seccin se describir un m todo para im plantar fun
ciones como la funcin nm ina.
Considrese qu operaciones es deseable realizar en una correspondencia M.
Dado un elem ento d de un tipo dom inio, se podra desear obtener M(d) o saber si
M(d) est definida (es decir, si d pertenece actualm ente al dom inio de M). O quiz

www.FreeLibros.me

62

TIPO S D E DATOS ABSTRACTOS FU NDA M ENTALES

function su m a -u n o ( i : integer ): integer;


begin
return ((/ mod long-m x) + 1)
end; | su m a -u n o I
procedure ANULA ( var C: COLA );
begin
C. a n t 1;
C. p o s t l o n g - m x
end; | ANULA }
function VACIA ( var C: COLA ) : boolean;
begin
if sum a-uno(C . post) - C.ant then
return (true)
else
return (false)
end; f VACIA |
function FRENTE ( var C: COLA ) : tipo_elem ento;
begin
if VACIA ( O then
error ( i a cola est vaca)
else
return (C.elementos[C.ant])
end; FR EN TE I
procedure PO NE_EN _COLA ( x . tipo_elem ento; var C: COLA );
begin
if sum a-uno(sum a-uno(C .post)) = C.ant then
error (la cola est llena)
else begin
C.post :=* sum a-uno(C.post)\
C.elementos[C.post] x
end
end; { PO NE_EN _COLA !
procedure QU ITA _DE_COLA ( var C: COLA );
begin
if VACIA (C) then
error (la cola est vaca)
else
C .a n ts u m a - u n o ( C .a n t )
end; I Q U ITA _DE_COLA |
Fig. 2.22.

Realizacin circular de colas.

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.

Realizacin de correspondencias mediante arreglos


M uchas veces, el tipo dom inio de una correspondencia ser un tipo elem ental que
pueda usarse com o tipo ndice de un arreglo. En Pascal los tipos ndice incluyen to
dos los subcontradom inios finitos de los enteros, com o 1..100 17..23, el tipo char
y los subcontradom inios de char. como 'A '..'27, y los tipos enum erados como (norte,
sur, este, oeste). Por ejem plo, un program a para descifrar textos podra guardar una
correspondencia c if con *A ' . ' T como sus tip o -d o m in io y tipo_contradom inio, de
modo que cifletra-texto) sea la letra que en un m om ento dado se suponga que re
presenta a la letra letra-texto.
Tales correspondencias se pueden realizar sencillam ente por m edio de arreglos,
siempre que haya un valor del tipo_contradom inio que signifique indefinido. Por
ejemplo, la correspondencia c if anterior podra definirse con char como su tip o .co n tradom inio, en lugar de A '. . ' T , y T podra usarse para denotar indefinido.
Supngase que los tipos dom inio y contradom inio son tipo_dom inio y tipo-contradom inio, respectivam ente, y que tipo-dom inio es un tipo de Pascal bsico. En
tonces, se puede definir el tipo CO RRESPON DENCIA (estrictam ente hablando,
correspondencia de tipo_dom inio a tipo_contradom inio) por la declaracin:
type

CORRESPON DENCIA - array[tipo_dom inio] of tipo-contradom inio;


En el supuesto de que indefinido sea una constante de tipo_contradom inio y que
prim er_valor y ltim o .v alo r sean el prim ero y el ltim o valores de tip o .d o m in io t,
es posible im plantar los tres m andatos en correspondencias com o en la figura 2.23.

Realizacin de correspondencias mediante listas


Existen m uchas aplicaciones posibles de las correspondencias con dom inios finitos.
Por ejemplo, las tablas de dispersin (hash) son una excelente alternativa en mut Por ejem plo, prim er.va lo r - ' K y ltim o .v a lo r - Z \ si el tip o .d o m in io es 'A'..Z'.

www.FreeLibros.me

64

T IPO S DE DA TO S ABSTRACTOS FU NDA M ENTALES

chas situaciones, pero su anlisis se deja para el captulo 4. Cualquier corresponden


cia con un dom inio finito se puede representar m ediante la lista de pares (dh r,),
(d 2, r2) , ..., (dh rk), donde </,, d2, ..., dk son todos los m iem bros actuales del dom inio,
y ri es el valor que la correspondencia asocia a d. para / - 1 ,2 , .... k. Se puede en
tonces usar cualquier im plantacin de listas que se elija para representar esa lista de
pares.
Para precisar m s, el tipo de datos abstracto CORRESPON DENCIA se puede
aplicar por m edio de listas de tipo-elem ento si se define
type
tipo-elem ento - record
dominio: tipo-dom inio;
contradominio: tipo-contradom inio
end;
y luego se define CO RRESPON DENCIA como se hara con el tipo LISTA (de tipo_elem ento) en la realizacin de listas elegida. En la figura 2.24 se definen los tres
m andatos de correspondencias en funcin de m andatos sobre el tipo LISTA.
procedure ANULA ( var M: CO RRESPON DENCIA );
var
i: tipo_dom inio;
begin
for i p rim er.v alo r to ltim o .v a lo r do
M [] i n d e f i n i d o
end; | ANULA |
procedure ASIGNA ( var M: CORRESPON DENCIA;
d: tip o .d o m in io ; r. tipo.contradom inio);
begin
M[d\ := r
end; I ASIGNA }
function CALCULA ( var M: CORRESPONDENCIA;
d: tip o .d o m in io ; var r. tipo.contradom inio): boolean;
begin
if M[d\ - indefinido then
return (false)
else begin
r : - M[d\\
return (true)
end
end; {CALCULA i
Fig. 2.23.

Realizacin de correspondencias mediante arreglos.

www.FreeLibros.me

PILAS Y PR O C E D IM IEN TO S RECURSIVOS

2 .6

65

Pilas y procedim ientos recursivos

U na aplicacin im portante de las pilas se da en la aplicacin de procedim ientos re


cursivos en los lenguajes de program acin. La organizacin a tiem po de ejecucin de
uno de tales lenguajes es el conjunto de estructuras de datos usadas p a ra representar
los valores de las variables de un program a d urante su ejecucin. T odo lenguaje que,
como Pascal, perm ita procedim ientos recursivos, utiliza una pila de registros de ac
tivacin para registrar los valores de todas las variables que pertenecen a cada pro
cedim iento activo de un program a. C uando se llam a a un procedim iento P, se co
loca en la pila un nuevo registro de activacin para P, con independencia de si ya
existe en ella otro registro de activacin para ese m ism o procedim iento. Cuando P
vuelve, su registro de activacin debe estar en el tope de la pila, puesto que P no
puede volver si no lo han hecho previam ente todos los procedim ientos a los que P
ha llam ado. As, se puede sacar de la pila el registro de activacin correspondiente
a la llam ada actual de P y hacer que el control regrese al punto en el que P fue lla
m ado (este punto, conocido com o direccin de retorno, se coloc en el registro de ac
tivacin de P al llam ar a este procedim iento).
procedure ANULA ( var M: CORRESPO N D EN CIA );
j igual que para listas I
procedure ASIGNA ( var M : CORRESPON DENCIA;
d: tipo_dom inio; r tipo_contradom inio);
var
x. tipo_elem ento; | el par (d, r) |
p: posicin; I usada para ir de la prim era a la ltim a posicin de
la lista M }
begin
x .d o m in io d \
x .c o n tr a d o m in io r ,
p
PRIMERO(AZ);
while p < > FIN(M ) do
if RECU PERA R , M ).dom inio - d then
SUPRIM E(p, M) | elim ina el elem ento con dom inio d \
else
p
S IG U IE N T E ^, M)\
INSERTA (x, PRIMERO(A/), M ) | coloca (d, r.) al inicio de la lista )
end; {ASIGNA i
function CALCULA ( var M: CORRESPON DENCIA;
d: tipo_dom inio; var r. tipo.contradom inio): boolean;
var
p: posicin;
begin
p: PR IM ER O (M)\
while p < > FIN(M ) do begin
if RECUPERAR, A/). dom inio - d then begin

www.FreeLibros.me

66

T IPO S DE D A TO S ABSTRACTOS FUNDA M ENTALES

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.

Realizacin de correspondencias en funcin de listas.

La recursin sim plifica la estructura de m uchos program as. Sin embargo, en al


gunos lenguajes las llam adas a procedim ientos tienen un costo m ucho m ayor que el
de las proposiciones de asignacin, de m odo que la ejecucin de un program a puede
resultar m s rpida, en un factor constante considerable, si se elim inan las llamadas
recursivas. Al decir esto no se propugna la elim inacin habitual de la recursin o de
otras llam adas a procedim ientos; es frecuente que la sencillez estructural justifique
el tiem po de ejecucin. Sin em bargo, podra ser deseable elim inar la recursin en
las porciones de los program as que se ejecutan con m ayor frecuencia, y el propsito
del anlisis que sigue es ilustrar cmo se pueden convertir los procedim ientos recur
sivos en procedim ientos no recursivos m ediante la introduccin de una pila defini
da por el program ador.
Ejemplo 2.3. Considrense dos soluciones, una recursiva y otra no recursiva, a una
versin simplificada del clsico problema de la mochila, en el cual se da un objetivo o
y una coleccin de pesos p u p2, ..., p n (enteros positivos). Se pide determ inar si existe
una seleccin de pesos que totalice exactam ente o. Por ejemplo, si o - 10 y los pesos
son 7, 5, 4, 4 y 1, se pueden elegir el segundo, el tercero y el quinto, ya que
5+ 4+1-10.
La justificacin del nom bre problem a de la m ochila es que se desea llevar en
la espalda no m s de o kilogramos, y se tiene para elegir un conjunto de objetos de
pesos dados. Se supone, adem s, que la utilidad de los objetos es proporcional a su
peso f, y por ello se desea cargar la m ochila con un peso lo m s cercano posible al
objetivo.
En la figura 2.25 se puede ver una funcin mochila que opera en una m atriz
pesos: array(l..n] of integer.
La llam ada a mochila(s, i) determ ina si existe una coleccin de los elem entos entre
peso[i\ y peso[n] que sum e exactam ente s, e im prim e sus pesos de ser tal el caso. Lo
prim ero que mochila hace es determ inar si puede responder de inm ediato. Espec
ficamente, si 5 - 0, entonces el conjunto vaco de pesos es una solucin. Si s < 0, no
puede haber solucin, y si s > 0 e /' > n, entonces ya no hay m s pesos que consi
derar y, por tanto, no se puede encontrar una sum a de pesos igual a s.
Si no se tiene ninguno de estos casos, entonces sencillam ente se hace la llamada
a mochila(s - p,, i+ 1), para ver si existe una solucin que incluya a pr Si esa solut En el verdadero problem a de la m ochila, se dan valores de utilid ad y pesos, y se pide m axim izar
la utilidad de los objetos transportados, con una restriccin del peso.

www.FreeLibros.me

PILAS Y PR O CE D IM IEN TO S RECU R SIV O S

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,.

Eliminacin de la recursin de cola


A m enudo, es posible elim inar en form a m ecnica la ltim a llam ada que un proce
dim iento se hace a s m ismo. Si un procedim iento P(x) tiene com o ltim o paso una
llam ada a P[y), entonces es posible reem plazar la llam ada a P(y) por una asignacin
x-. - y, seguida de un salto al principio del cdigo de P. Aqu, y puede ser una ex
presin, pero x debe ser un parm etro pasado por valor, de m odo que su valor se
almacena en una localidad de m em oria privada de esta llam ada a P f. Por supuesto,
P podra tener m s de un parm etro, en cuyo caso se trataran exactam ente igual
que x e y.

(1)

(2)
(3)
(4)
(5)

(6)
(7)

(8)

function mochila ( objetivo: integer; candidato: integer ): boolean;


begin
if objetivo - 0 then
return ( true )
else if (objetivo < 0) or (candidato > ri) then
return(false)
else I considera soluciones con y sin candidato)
if mochila(objetivo-pesos[candidato], candidato + 1) then
begin

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.

Solucin recursiva al problem a de la mochila.

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

TIPO S DE DATOS ABSTRACTOS FUNDA M ENTALES

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).

Eliminacin com pleta de la recursin


El procedim iento de elim inacin de la recursin de cola suprim e la recursin por
com pleto slo cuando la llam ada recursiva se encuentra al final del procedim iento
y tiene la form a adecuada. Existe un enfoque m s general que convierte cualquier
procedim iento (o funcin) recursivo en no recursivo, pero que introduce una pila de
finida por el program ador. En general, una celda de esa pila contendr:
1.
2.
3.

los valores actuales de los parm etros del procedim iento;


los valores actuales de todas las variables locales del procedim iento, y
una indicacin de la direccin de retom o, esto es, del lugar a donde deber de
volver el control cuando la invocacin actual del procedim iento term ine.

En el caso de la funcin mochila, se puede hacer algo m s sencillo. Prim ero, se


observa que cada vez que se hace una llam ada (que im plica m eter un registro a la
pila), candidato se increm enta en 1. As pues, se puede dejar candidato como una va
riable global, increm entando su valor en 1 cada vez que se m ete un registro en la
pila y dism inuyndolo en 1 cada vez que se saca un registro.
U na segunda sim plificacin posible consiste en m antener dentro de la pila una
direccin de retom o m odificada. En trm inos estrictos, la direccin de retom o
para esta funcin es un lugar de otro procedim iento que llama a mochila, la llamada
de la lnea (5) o la llam ada de la linea (8). Estas tres posibilidades se representan por
una variable de estado que tiene uno de los tres valores siguientes:
1.
2.
3.

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].

Si se alm acena esta variable de estado com o la direccin de retom o, se puede m a


nejar objetivo com o una variable global. Cuando el estado cam bia de ninguno a in
cluido, se sustrae pesos[candidato] de objetivo, y se sum a de nuevo cuando el estado

www.FreeLibros.me

PILAS Y PR O C E D IM IEN TO S RECU R SIV O S

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

TIPO S D E DATOS ABSTRACTOS FUNDA M ENTALES

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.

Procedim iento no recursivo para el problem a de la mochila.

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

Escrbanse program as para insertar, suprim ir y localizar un elem ento en


una lista clasificada, usando realizaciones de
a) arreglos
b) apuntadores y
c) cursores.
Cul es el tiem po de ejecucin de cada uno de estos programas?

2.3

Escrbase un program a para intercalar


a) dos listas clasificadas,
b) n listas clasificadas.

2.4

Escrbase un program a para concatenar una lista de listas.

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

El siguiente procedim iento se hizo con el propsito de suprim ir todas las


apariciones de un elem ento x de una lista L. Expliqese por qu no siem
pre funciona y sugirase una m anera de arreglarlo de m odo que realice la
tarca para la que fue propuesto.
procedure suprim e (xtipo_elem ento; var L: LISTA);
var
p: posicin;
begin
p :- PR IM ER O (L);
while p < > FIN (L) do begin
if RECUPERA ( p , L ) - x then
SU PRIM E (p, L);
p:~ SIG U IEN TE (p, L)
end
end; I suprim e i

www.FreeLibros.me

72

TIPO S DE DATOS ABSTRACTOS FU NDA M ENTALES

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

Supngase que L es una LISTA y que p, q y r son posiciones. En funcin


de la longitud n de la lista L, determ nese cuntas veces se ejecutan en el
siguiente program a las funciones PRIM ERO , FIN y SIGUIENTE.
p :- PRIMERCKL);
while p < > FIN(L) do begin
q : - p\
while q < > FIN(L) do begin
q : - S IG U IE N T E ^. L);
r :- PRIMERCKL);
while r < > q do
r - S IG U IE N T E S L)
end;
p:~ SIG U IE N T E S , L)
end;

2.12

Reescrbase el cdigo de las operaciones con listas, suponiendo una repre


sentacin de listas enlazadas, pero sin celdas de encabezado. Supngase que
se usan apuntadores verdaderos y que la posicin 1 se representa por nil.

2.13

Agrguense al procedim iento de la figura 2.12 todas las verificaciones ne


cesarias para detectar errores.

2.14

O tra representacin de listas por m edio de arreglos consiste en insertar, co


mo en la seccin 2.2, pero suprim ir sim plem ente reem plazando el ele
m ento en cuestin por un valor especial suprim ido, que se supone ya no
aparece en las listas. Reescrbanse las operaciones con lisias para aplicar
esta estrategia. Cules son las ventajas y las desventajas de este enfoque
en com paracin con la representacin original de listas m ediante arreglos?

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

U na cola doble o de doble extrem o es una lista en la cual se pueden insertar


o suprim ir elem entos en cualquiera de los extremos. Desarrllense reali
zaciones para colas dobles basadas en arreglos, apuntadores y cursores.

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

Otra posible implantacin de colas mediante listas enlazadas consiste en no


usar una celda de encabezamiento y hacer que ant apunte directamente a la pri
m era celda. Si la cola est vaca, se hace que ant - post - nil. Obtngase
las operaciones con colas para esta representacin. Cmo se com para esta
aplicacin con la que se dio en la seccin 2.4, en funcin de la velocidad,
la utilizacin de espacio y la concisin del cdigo?

2.20

U na variante de la cola circular registra la posicin del elem ento frontal y


la longitud de la cola.
a) Es necesario en esta realizacin lim itar la longitud de la cola a
lo ng-m dx - 1?
b) Escrbanse las cinco operaciones con colas para esta realizacin.
c) Com prese esta realizacin con la de colas circulares de la seccin 2.4.

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

Se pueden alm acenar k pilas en un solo arreglo si se usa la estructura de


datos sugerida en la figura 2.27 para el caso k - 3. Para m eter y sacar de
cada pila se opera como se sugiere en la seccin 2.3, en relacin con la fi
gura 2.17. Sin embargo, si una insercin en la pila i hace que TOPE(i) igua
le a B A S E (/- 1), antes de efectuarla hay que desplazar todas las pilas, de
m odo que quede una separacin del tam ao apropiado entre cada par de
pilas adyacentes. Por ejemplo, es posible hacer que las separaciones entre
pilas sean todas iguales, o que la separacin que queda encim a de la pila i
sea proporcional al tam ao actual de la pila i (en el supuesto de que las pi
las m s grandes tienen m ayor probabilidad de crecer antes, y se desea pos
tergar la siguiente reorganizacin el m ayor tiem po posible).
a)

Si se dispone de un procedim iento reorganiza, al que se llama si las pi


las colisionan, escrbase el cdigo de las cinco operaciones con pilas.

www.FreeLibros.me

74

TIPO S D E DA TO S ABSTRACTOS FUNDA M ENTALES

Si existe un procedim iento haz-nuevos-topes que calcula nuevo~tope[i],


la posicin apropiada para el tope de la pila i, con 1 < - / < - k,
escrbase el procedim iento reorganiza. Sugerencia: Obsrvese que la
pila i puede moverse arriba o abajo y que hay que m over la pila / antes
que la j si la nueva posicin de j se traslapa con la posicin antigua de
i. Considrense las pilas 1, 2, 3
k en orden, pero m antngase una
pila de objetivos consistentes en desplazar una pila. Si al considerar
la pila i sta se puede m over con seguridad, hgase, y reconsidrese lue
go la pila cuyo nm ero est en el tope de la pila de objetivos. Si no
hay seguridad, m tase i en la pila de objetivos.
c) Qu realizacin es apropiada para la pila de objetivos de b)? Es real
m ente necesario m antenerla como una lista de enteros, o sera suficien
te con una representacin m s sucinta?
d) Obtngase haz-nuevos-topes de form a que el espacio que est sobre to
das las pilas sea proporcional a los tam aos actuales de stas.
e) Qu m odificaciones habra que hacer a la figura 2.27 para que esa rea
lizacin pueda trabajar con colas? Y con listas generales?

b)

2.23

M odifiqense las realizaciones de SACA y P O N E -E N -C O L A de las sec


ciones 2.3 y 2.4, de m odo que devuelven el elem ento suprim ido de la pila
o cola Qu m odificaciones habra que hacer si el tipo de los elem entos no
es alguno que pueda ser devuelto por una funcin?

2.24

Usese una pila para elim inar la recursin de los siguientes procedimientos.
a)

function comb (n, m : integer): integer;

{calcula ($,) suponiendo que 0 < m < n y n > 1>


begin
if (n - 1) or (m - 0) or (m - ri) then
return (1)
else
return (comb (n - 1, m ) + comb(n - 1, m - 1))
end; \comb\

Fig. 2.27.

Varias pilas en un arreglo.

www.FreeLibros.me

NOTAS BIBLIOGRAFICAS

b)

*2.25

75

procedure invierte (var L : LISTA);


I invierte la lista L I
var
x. tipo_elem ento;
begin
if not VACIA(L) then begin
x
RECUPERA (PRIM ERO (L), L);
SUPRIM E(PRIM ERO(Z.), L);
invierte(L)\
INSERTAU, FIN(L), L)
end
end; I invierte 1

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

Term inologa fundam ental

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.

Orden de los nodos


A m enudo los hijos de un nodo se ordenan de izquierda a derecha. As, los dos r
boles de la figura 3.2 son diferentes porque los dos hijos del nodo a aparecen en dis
tintos rdenes en los dos rboles. Si se desea ignorar explcitam ente el orden de los
hijos, se habla entonces de un rbol no ordenado.

Flfl. 3.2.

Dos rboles (ordenados) distintos.

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.

Orden previo, orden posterior y orden sim trico


Existen varias m aneras tiles de ordenar sistem ticam ente todos los nodos de un r
bol. Los tres ordenam ientos ms im portantes se llam an orden previo (preorder), or
den sim trico (inorder) y orden posterior (postorder)\ tales ordenam ientos se definen
recursivam ente com o sigue:

Si un rbol A es nulo, entonces la lista vaca es el listado de los nodos de A en


los rdenes previo, sim trico y posterior.
Si A contiene un solo nodo, entonces ese nodo constituye el listado de los nodos
de A en los rdenes previo, sim trico y posterior.

Si ninguno de los anteriores es el caso, sea A un rbol con raz n y subrboles A ,,


A 2, ..., A k, como se representa en la figura 3.4.

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.

procedure O RD _SIM ( n: nodo );


begin
if n es una hoja then

lista n
else begin

O RD _SIM (hijo de n de m s a la izquierda);


lista n\
for cada hijo c de n, excepto el de m s a la izquierda, en orden
desde la izquierda do
ORD_SIM (c)
end
end; I O R D .S IM 1

(b) procedim iento ORD_SIM .


Fig. 3.5.

Procedimientos recursivos de ordenamiento.

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.

Arboles etiquetados y rboles de expresiones


A m enudo es til asociar una etiqueta, o valor, a cada nodo de un rbol, siguiendo
la m ism a idea con que se asoci un valor a un elem ento de una lista en el captulo
anterior. Esto es, la etiqueta de un nodo no ser el nom bre del nodo, sino un valor
almacenado en l. En algunas aplicaciones, incluso se cam biar la etiqueta de un
nodo sin m odificar su nom bre. U na analoga til a este respecto es: rbol es a lista
como etiqueta es a elem ento y nodo es a posicin.
La figura 3.7 m uestra un rbol etiquetado que representa la expresin
aritm tica {a + b) * (a + c), donde n n2, ..., n-, son los nom bres de los nodos, cuyas
etiquetas se m uestran, por convencin, en las proxim idades de los nodos correspon
dientes. Las reglas para representar una expresin m ediante un rbol etiquetado son
stas:
Ejemplo 3.4.

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

presenta la expresin , y el hijo derecho la expresin 2. Entonces, n represen


ta la expresin ( ,) 0 (E 2). Los parntesis se pueden quitar si no son necesarios.
P o r ejem plo, el nodo n2 tiene al operador + como etiqueta, y sus hijos izquierdo
y derecho representan las expresiones a y b, respectivam ente. Por tanto, n2 repre
senta (a) + (>), o, m s simple, a + b. El nodo n , representa (a + b) * (a + c), puesto
que * es la etiqueta de / t , , y a + y a + c son las correspondientes expresiones re
presentadas por n2 y n3.

Fig. 3.7.

Arbol de expresin con etiquetas.

A m enudo, cuando se recorre un rbol en orden previo, sim trico o posterior, se


prefiere listar las etiquetas de los nodos, en vez de sus nombres. En el caso de un
rbol que representa una expresin, el listado en orden previo de las etiquetas da lo
que se conoce como form a prefija de la expresin, en la cual un operador precede a
sus operadores izquierdo y derecho. Para precisar, la expresin prefija correspon
diente a un solo operando a es a m ismo. La expresin prefija correspondiente a
( ,) 0 ( 2), donde 0 es un operador binario, es 0 P ,P 2, donde P, y P2 son las expre
siones prefijas correspondientes a , y 2. Obsrvese que en la expresin prefija no
se necesitan parntesis, dado que es posible revisar la expresin prefija 0 P ,P 2 e iden
tificar unvocam ente a P, como el prefijo m s corto (y nico) de P ,P 2, que es ade
ms una expresin prefija vlida.
Por ejemplo, el listado en orden previo de las etiquetas de la figura 3.7 es +ab+ac.
La expresin prefija correspondiente a n2, que es +ab, es el prefijo vlido m s corto
de +ab+ac.
De m anera similar, el listado en orden posterior de las etiquetas de un rbol de
expresin da lo que se conoce como representacin postfija (o polaca). La expresin
( ,) 0 ( 2) se representa con la expresin postfija P ,P 2 0, donde P, y P2 son las re
presentaciones postfijas de , y 2, respectivam ente. De nuevo, los parntesis son
innecesarios, porque se puede identificar a P2 buscando el sufijo m s corto de P,P;
que sea una expresin postfija vlida. Por ejemplo, la expresin postfija corres
pondiente a la figura 3.7 es ab+ac+*. Si se escribe una expresin en la forma P :P2*.
entonces P, es ac+, el sufijo m s corto de ab+ac+ que es una expresin postfija v
lida.

www.FreeLibros.me

EL TDA ARBOL

83

El recorrido en orden sim trico de un rbol de expresin da la expresin infija


misma, pero sin parntesis. Por ejem plo, el listado en orden sim trico de las etique
tas de la figura 3.7 es a+b * a+c. Se invita a elaborar un algoritm o que recorra un
rbol de expresin, y que produzca una expresin infija con todos los pares de pa
rntesis necesarios.

Determinacin de los antecesores


Los recorridos de un rbol en los rdenes previo y posterior perm iten determ inar
los antecesores de un nodo. Supngase que ord-post(n) es la posicin del nodo n en
el listado en orden posterior de los nodos de un rbol, y que desc{n) es el nm ero
de descendientes propios del nodo n. Por ejemplo, en el rbol de la figura 3.7 se ver
cmo las posiciones en orden posterior de los nodos nv nt y n son 3, 1 y 2, respectiva
mente.
Las posiciones en orden posterior de los nodos tienen la til propiedad de que
los nod o s de un su b rb o l con ra z n o cu p an p o sic io n e s c o n se cu tiv a s de
ord-posl(n)-desc(n) a ord-post(n). Para determ inar si un vrtice x es descendiente
de un vrtice y, basta verificar que se cum ple
ord-post(y)-desc{y) < ord-post(x) < ord-post(y)
Una propiedad sim ilar se cum ple para el recorrido en orden previo.

3 .2

El TDA ARBOL

En el captulo 2, se vieron las listas, pilas, colas y correspondencias com o tipos de


datos abstractos (TDA). En este captulo, los rboles se considerarn com o TDA y
tam bin como estructuras de datos. Uno de los usos m s im portantes de los rboles
se presenta en el diseo de implantaciones de varios TDA que se estudian en este libro.
Por ejemplo, en la seccin 5.1 se ver cm o un rbol binario de bsqueda puede
usarse para obtener tipos de datos abstractos basados en el m odelo m atem tico de
un conjunto ju n to con operaciones como INSERTA, SU PRIM E y M IEM BRO (esta
ltim a para probar si un elem ento es o no elem ento de un conjunto). Los dos cap
tulos siguientes presentan otras realizaciones de varios TD A m ediante rboles.
En esta seccin se describirn varias operaciones tiles con rboles y se ver
cmo disear algoritm os para rboles en funcin de esas operaciones. Igual que con
las listas, hay una gran variedad de operaciones que se pueden efectuar con rboles.
Aqu se considerarn las siguientes:
1. PADRE(, A). Esta funcin devuelve el padre del nodo n en el rbol A. Si n es
la raz, que no tiene padre, se devuelve A. En este contexto, A es un nodo nulo,
que se usa com o seal de que se ha salido del rbol.
2. HIJO_MAS_IZQ(rt, A) devuelve el hijo m s a la izquierda del nodo n en el r
bol A, y devuelve A si n es una hoja y, por tanto, no tiene hijos.

www.FreeLibros.me

84

ARBOLES

3.

4.
5.

6.
7.

HERM ANO_DER(/i, A) devuelve el herm ano a la derecha del nodo n en el r


bol A, el cual se define como el nodo m que tiene el m ismo padre p que n, de
form a que m est inm ediatam ente a la derecha de n en el ordenam iento de los
hijos de p. Por ejem plo, para el rbol de la figura 3.7, H IJO -M A S_IZ Q (n2) - n4,
HERM ANO_DER(rt) - n5 y H ERM A NO_D ER(/i5) - A.
ETIQ U ETA R. A) devuelve la etiqueta del nodo n en el rbol A. Sin embargo,
no se requiere que haya etiquetas definidas para cada rbol.
CREA/(v. A h A 2, ..., A,) es un m iem bro de una fam ilia infinita de funciones, una
para cada valor de i - 0, 1, 2, .... CREAi crea un nuevo nodo r con etiqueta v y
le asigna i hijos que son las races de los rboles A, A 2
A en ese orden desde
la izquierda. Se devuelve el rbol con raz r. Obsrvese que si i - 0, entonces r
es a la vez una hoja y la raz.
RAIZ(/4) devuelve el nodo raz del rbol A, o A si A es el rbol nulo.
ANULA(/1) convierte A en el rbol nulo.

Escrbase un procedim iento recursivo y otro que no lo sea, para listar


las etiquetas de los nodos de un rbol en orden previo. Se supone que los tipos de
datos nodo y ARBOL ya estn definidos, y que el tipo de datos ARBOL es para r
boles con etiquetas del tipo tip o -etiq u eta. La figura 3.8 m uestra un procedim iento
recursivo que, dado un nodo n, lista las etiquetas del subrbol con raz n en orden
previo. Para obtener un listado en orden previo correspondiente al rbol A se hace
la llam ada ORD _PRE(RAIZ(/t)).
Ejemplo 3.5.

procedure O R D _PR E ( n: nodo );

I lista las etiquetas de los descendientes de n en orden previo |


var
c. nodo;
begin

im prim e (E TIQ U ET A R , A));


c
H lJO _M A S_lZQ (n, A);
while c < > A do begin
ORD_PRE(c);
c HERM A NO_D ER(c, A)
end
end; i O R D _PR E t
Fig. 3.8.

Procedimiento recursivo de listado en orden previo.

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

U na m anera de efectuar un recorrido de un rbol en orden previo no recursivo


se da en el program a O R D _P R E -N O _R E C de la figura 3.9. Este program a tiene dos
modos de operacin. En el prim ero, desciende por el cam ino m s a la izquierda an
no explorado del rbol, im prim iendo y apilando los nodos a lo largo del cam ino, has
ta que alcanza una hoja.
Luego, el program a entra en el segundo m odo de operacin, en el cual regresa
por el cam ino apilado, sacando de la pila los nodos del cam ino hasta que encuentra
un nodo que tiene un herm ano derecho. El program a vuelve entonces al prim er m odo
de operacin, iniciando el descenso a p a rtir de ese herm ano derecho an no explo
rado.
El program a empieza en el prim er m odo de operacin en la raz, y term ina cuan
do la pila queda vaca. En la figura 3.9 se m uestra el program a completo.

3 .3

Realizaciones de rboles

En esta seccin se presentarn varias realizaciones bsicas de rboles y se analizarn


sus funciones para m an e ja r las operaciones con rboles presentadas en la
seccin 3.2.

Representacin de rboles mediante arreglos


Sea A un rbol cuyos nodos tienen nom bres 1, 2 ,..., n. Tal vez la representacin ms
sencilla de A que es capaz de m anejar la operacin PA DRE sea un arreglo lineal L
en la cual cada entrada L[z] constituya un apuntador o un cursor al padre del nodo i.
La raz de A se puede distinguir dndole como padre un apuntador nulo o que apun
te a s misma. En Pascal no se pueden usar apuntadores a elem entos de arreglos,
por tanto, habr que em plear un esquem a de cursores donde L[i] = j si el nodo j es
el padre del nodo /, y L[/] - 0 si el nodo i es la raz.
Esta representacin se basa en la propiedad de que en los rboles cada nodo tie
ne un padre nico, y perm ite hallar el padre de un nodo en un tiem po constante.
Un cam ino ascendente en un rbol, es decir de un nodo a su padre, de ste a su pa
dre y as sucesivam ente, se puede recorrer en un tiem po proporcional al nm ero de
nodos del cam ino. Tam bin es posible m anejar la operacin ETIQ U ETA agregando
otro arreglo E, tal que [/] sea la etiqueta del nodo i, o haciendo que los elem entos
del arreglo L sean registros que contengan un entero (cursor) y una etiqueta.
El rbol de la figura 3.10(a) tiene la representacin por apuntadores
al padre que se m uestra en el arreglo A de la figura 3.10(b).

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

La representacin por apuntadores al padre no facilita las operaciones que re


quieren inform acin de los hijos. D ado un nodo rt, resulta caro determ inar sus hijos
o su altura. Adem s, esta representacin no especifica el orden de los hijos de un
nodo. Por tanto, las operaciones com o H IJO -M A S -IZ Q y H E R M A N O -D ER no es
tn bien definidas. Se puede im poner un orden artificial, por ejemplo, num erando
los hijos de cada nodo despus de num erar al padre, y num erando los hijos en orden
procedure O R D _PR E _N O _R E C ( A: ARBOL );

I recorrido en orden previo no recursivo del rbol A |


var

m: nodo; I tem poral i


P. PILA; I pila de nodos que contiene el cam ino de la raz al padre TOPE(P) del nodo actual m |
begin

1 asigna valor inicial I


A N U L A (P );

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

la exploracin del cam ino contenido en la pila est com pleta |


f VACIA*/1) then
return;

I explora el herm ano derecho del nodo al tope de la pila )


m
HERM A NO_D ER(TOPE(P), A)\
S A C A (P)
end
end; 1 O R D _P R E _N O _R E C }
Fig. 3.9.

Procedim iento no recursivo de listado en orden previo.

ascendente, de izquierda a derecha. C on esa suposicin se ha escrito la funcin HER


M A N O -D E R de la figura 3.11, para los tipos nodo y ARBOL que se definen como
sigue:
type

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 |

representacin por apuntadores al padre.

Un rbol y su representacin mediante apuntadores al padre.

function HERM A N O _D ER ( n : nodo; A: ARBOL ) : nodo;

I devuelve el herm ano derecho del nodo n del rbol A |


var

i, padre, nodo;
begin

padreA[ri\\
for /':-/+ 1 to nodos-m x do

I busca un nodo despus de n que tenga el m ism o padre I


if A[] - padre then
return (/);
return (0) i devuelve el nodo nulo si no se encontr herm ano

derecho |
end; ! H E R M A N O .D E R
Fig. 3.11.

Operacin HERMANO .DER usando la representacin por arreglos.

Representacin de rboles mediante listas de hijos


U na m anera im portante y til de representar rboles consiste en form ar una lista de
los hijos de cada nodo. Las listas se pueden representar con cualquiera de los m to
dos sugeridos en el captulo 2, pero com o el nm ero de hijos que cada nodo puede
tener es variable, la representacin por m edio de listas enlazadas es a m enudo ms
apropiada.
La figura 3.12 sugiere cmo se podra representar el rbol de la figura 3.10(a).
Hay un arreglo de celdas de encabezam iento indizadas por nodos, los cuales se supone

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.

Representacin de un rbol por listas enlazadas.

Prim ero se desarrollarn las estructuras de datos necesarias en funcin de un tipo


de datos abstracto LISTA (de nodos), y luego se dar una realizacin particular para
las listas y se ver cmo las abstracciones com paginan entre s. Despus se m ostra
rn algunas sim plificaciones posibles. Se em pieza con las siguientes declaraciones de
tipo:
type

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;

i devuelve el hijo m s a la izquierda del nodo n del rbol A !


var

L: LISTA; i abreviatura para la lista de hijos de n I

www.FreeLibros.me

REALIZACIONES DE ARBOLES

89

begin

L
A .encabezamento[n];
if VACIA(Z-) then | n es una hoja (
return (0)
else

return (RECUPERA(PRIM ERO(L), L))


end; i H IJO_M A S_IZQ 1
Fig. 3.13.

Funcin para hallar el hijo ms a la izquierda.

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

espacio-.celdas\ array [1 ..nodos..mx] of record


nodo: integer;
sig-. integer
end;

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;

( devuelve el hijo m s a la izquierda del nodo n del rbol A


var
L: integer; i un cursor al principio de la lista de hijos de n [
begin

A.encabezado[n]\

if L - 0 then I n es una hoja I


return (0)
else
return (espacio-celdas[L\.nodo)
end; I H IJO_M A S_IZQ

(a)

La funcin H IJO .M A S .IZ Q .

function PADRE ( n: nodo; A: ARBOL ) : nodo;

! devuelve el padre del nodo n del rbol A |

www.FreeLibros.me

90

ARBOLES

var

p: nodo; | recorre los posibles padres de n !


i: posicin; I recorre la lista de hijos de p (
begin
for p

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;

return (0) I devuelve el nodo nulo si no se encontr padre )


end; i P A D R E 1

(b)
Fig. 3.14.

La funcin PADRE.

Dos funciones que emplean representacin por listas enlazadas de


rboles.

Representacin hijo ms a la izquierda hermano derecho


La estructura de datos descrita antes adolece, entre otras cosas, de no ser adecuada
para crear rboles grandes a partir de rboles m s chicos por m edio de los operado
res CREA/. La razn es que, a pesar de que todos los rboles com parten espacio-celdas para las listas ligadas de hijos, cada uno tiene su arreglo propio de encabezamien
tos correspondiente a sus nodos. Por ejemplo, si se deseara obtener CREA2(v, A ,, .-2X
se tendra que copiar A, y A 2 en un tercer rbol y agregar un nuevo nodo con eti
queta v y dos hijos: las races de A, y A.
Si se desea construir rboles a partir de otros menores, es m ejor que las repre
sentaciones de los nodos de todos los rboles com partan un rea. La extensin l
gica de la figura 3.12 para lograr esto consiste en reem plazar el arreglo de encabe
zam ientos por un arreglo espacio-nodos que contenga registros con dos cam pos eti
queta y encabezamiento. Este arreglo contendr los encabezam ientos de la totalidad
de nodos de todos los rboles. As pues, se declara:
var
espacio-nodos: array [\..nodos-m x[ of record
etiqueta: tipo_etiqucta;
encabezamiento: integer i cursor a espacio-celdas I
end;

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.

La figura 3.15(a) m uestra un rbol, y la figura 3.15(b), la estructura


de datos correspondiente, en la cual los nodos con etiquetas A, B, C. y D se han co
locado de m anera arbitraria en las posiciones 10, 5, 11 y 2 de espacio-nodos. T am
bin se ha hecho una eleccin arbitraria de las celdas de espacio-celdas utilizadas
para las listas de hijos.

espacio-celdas
(b)
Fig. 3.15.

Estructura de datos

O tra estructura de listas enlazadas para rboles.

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

espacio ^celdas-, array [1 ..nodos-m x] of record


etiqueta: tipo_etiqueta;
h ijo -m s-izq : integer;
herm ano-der. integer
end;

El rbol de la figura 3.15(a) se representa con la nueva estructura de


datos en la figura 3.16. Para los nodos se han utilizado los m ismos ndices arbitra
rios de la figura 3.15(b).
Ejemplo 3.8.

izq

der
espacioceldas

Fig. 3.16.

Representacin "hijo ms a la izquierda-herm ano derecho" de un


rbol.

En la representacin hijo m s a la izquierda-herm ano derecho, todas las opera


ciones son fciles de realizar, excepto PADRE. Esta requiere de una bsqueda en
todo espacio-celdas. Si es necesario realizar la operacin PA DRE eficientem ente, se
puede agregar a espacio-celdas un cuarto cam po que indique al padre de un nodo
directam ente.
Com o ejem plo de una operacin con rboles escrita para utilizar una estructura
hijo m s a la izquierda-herm ano derecho, com o la de la figura 3.16, se da la fun
cin CREA2 en la figura 3.17. Se supone que las celdas no utilizadas estn enlaza
das en una lista de espacio disponible, encabezada por disp. y que este enlace utiliza
los cam pos herm ano derecho. La figura 3.18 m uestra los apuntadores antiguos (con
lneas de trazo continuo) y los nuevos (con lneas punteadas).

www.FreeLibros.me

REALIZACIONES DE ARBOLES

93

function CREA2 ( v: tipo_etiqueta; A l, A 2: integer ) : integer;

I devuelve un nuevo rbol con raz v, que tiene A 1 y A2 como subrboles


var

temp: integer; I guarda el ndice de la prim era celda disponible


para la raz del nuevo rbol (
begin

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.

Cambios de apuntadores producidos por 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).

Representacin de rboles binarios


U na forma conveniente de estructurar datos para representar un rbol binario con
siste en dar a sus nodos los nom bres 1, 2 ,..., n, y utilizar un arreglo de registros de
clarado como
var

espacio-celdas: array [\..nodos-tnx] o record


h ijo -izq : integer;
hijo-der. integer
end;

La idea es que espacio~celdas[i).hijo-izq sea el hijo izquierdo del nodo i, y que su


ceda lo m ism o con hijo-der. Un valor 0 en cualquiera de esos cam pos indicar la
ausencia de un hijo.

www.FreeLibros.me

ARBOLES BINARIOS

95

(a)

(b)

Fig. 3.19.

Dos rboles binarios.

5
Fig. 3.20.

Un rbol ordinario.

Ejemplo 3.10. El rbol binario de la figura 3.19(a) puede representarse com o se


m uestra en la figura 3.21.

Un ejemplo: cdigos de Huffman


Para ejem plificar la form a en que los rboles binarios pueden usarse com o estruc
turas de datos, se ver un problem a particular que consiste en la construccin de c
digos de Huffman. Supngase que se tienen mensajes com puestos por secuencias
de caracteres. En cada mensaje, los caracteres son independientes entre s, y apare
cen con una probabilidad conocida en cualquier posicin dada del mensaje; las pro
babilidades son las m ismas para todas las posiciones. C om o ejemplo, supngase que
se tiene un mensaje constituido por los caracteres a, b, c, d, e, los cuales aparecen
con probabilidades 0.12, 0.4, 0.15, 0.08 y 0.25, respectivam ente.
Se desea codificar cada carcter por m edio de una sucesin de ceros y unos, de
m anera que ninn cdigo de un carcter sea prefijo del cdigo de otro carcter. Esta
propiedad de prefijos perm itira decodificar una cadena de ceros y unos, elim inado
repetidas veces de la cadena los prefijos que sean cdigos de caracteres.

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.

Representacin de un rbol binario.

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

Dos cdigos binarios.

T am bin es fcil verificar que el cdigo 2 tiene la propiedad de prefijos. Se pue


de decodificar una cadena de bits tom ando repetidas veces los prefijos que sean c
digos de caracteres y quitndolos, tal como se hizo con el cdigo 1. La nica dife
rencia consiste en que no se puede rebanar la sucesin com pleta de bits de una
sola vez, porque lom ar dos o tres bits para un carcter depende de los bits. Por ejem
plo, si una cadena com ienza con 1101001, se puede asegurar de nuevo que los ca
racteres codificados fueron bcd. Los dos prim eros bits, 11, deben proceder de b, por
tanto, es posible quitarlos y preocuparse slo de 01001. Se deduce, entonces, que los
bits 01 proceden de c, y as sucesivam ente.
El problem a que se enfrenta es: dado un conjunto de caracteres y sus probabili
dades, encontrar un cdigo con la propiedad de prefijos, tal que la longitud media
del cdigo de un carcter sea m nim a. La razn por la que se desea m inim izar la lon
gitud m edia de un cdigo es que ello perm ite com prim ir la longitud de un mensaje
tipo. C uanto m s corta sea la longitud m edia de un carcter, tanto m s corta ser
la longitud de un mensaje codificado. Por ejem plo, el cdigo 1 tiene una longitud

www.FreeLibros.me

ARBOLES BINARIOS

97

m edia de cdigo de 3. Esta longitud se obtiene m ultiplicando las longitudes de los


cdigos de todos los sm bolos por sus respectivas probabilidades de aparicin. El c
digo 2 tiene una longitud m edia de 2.2, puesto que los sm bolos a y d, que en con
ju n to aparecen el 20% de las veces, tienen cdigos de longitud 3, y los otros sm bo
los, cdigos de longitud 2.
Se puede obtener un cdigo mejor que el 2? U na respuesta com pleta a esta pre
gunta consistira en exhibir un cdigo con la propiedad de prefijos que tuviera una
longitud media de 2.15. Ese sera el m ejor cdigo posible para las probabilidades da
das de aparicin de los smbolos. U na tcnica que perm ite hallar cdigos de prefijos
ptim os recibe el nom bre de algoritmo de H uffm an. Funciona seleccionando dos ca
racteres, como a y b, que tengan las probabilidades m s pequeas, y reem plazndo
los con un nico carcter (imaginario), por ejem plo x , cuya probabilidad de apari
cin sea la sum a de las probabilidades de a y b. Despus se encuentra un cdigo de
prefijos ptim o para este conjunto m s pequeo de caracteres, usando recursivamente el m ismo procedim iento. Los cdigos para el conjunto original de caracteres
se obtienen usando el cdigo para x seguido de un cero, com o cdigo para a, y se
guido de un uno, como cdigo para b.
Se pueden considerar los cdigos de prefijos como cam inos en rboles binarios.
Pinsese que seguir el cam ino de un nodo a su hijo izquierdo es como agregarle un
cero a un cdigo, y que tom ar el cam ino hacia el hijo derecho es com o agregarle un
uno. Si se etiquetan las hojas de un rbol binario con los caracteres representados,
se puede sim bolizar cualquier cdigo de prefijos por m edio de un rbol binario. La
propiedad de prefijos garantiza que ningn carcter puede tener un cdigo que
corresponda a un nodo interior y, recprocam ente, etiquetar las hojas de cualquier
rbol binario con caracteres da un cdigo con la propiedad de prefijos de esos carac
teres.
Los rboles binarios correspondientes a los cdigos 1 y 2 de la figura
3.22 se m uestran en la figura 3.23(a) y (b), respectivam ente.

Ejemplo 3.12.

Se obtendr el algoritm o de Huffm an m ediante un bosque o conjunto de rboles,


cada uno de los cuales tendr sus hojas etiquetadas con los caracteres cuyos cdigos
se desea seleccionar, y sus races etiquetadas con la sum a de las probabilidades de
todas las etiquetas de las hojas. Estas sum as se denom inan pesos de los rboles. Ini
cialmente, cada carcter estar en un rbol de un solo nodo, y cuando el algoritm o
term ine se tendr un solo rbol con todos los caracteres como hojas. En este rbol,
el cam ino de la raz a cualquier hoja representar el cdigo para la etiqueta de esa
hoja, de acuerdo con el esquem a izquierda = 0, derecha = 1 de la figura 3.23.
El paso fundam ental del algoritm o consiste en seleccionar los dos rboles del bos
que que tengan los pesos m s bajos (decidiendo arbitrariam ente en caso de empate),
y en com binar esos dos rboles en uno solo, cuyo peso sea la sum a de los pesos de
ambos. Para com binar los rboles se crea un nuevo nodo que queda como raz que
tiene las races de los dos rboles dados como sus hijos izquierdo y derecho (sin im
portar cul sea uno y otro). Este proceso contina hasta que quede un solo rbol re
presentativo del cdigo que, para las probabilidades dadas, tenga la m enor longitud
m edia de cdigo posible.

www.FreeLibros.me

98

ARBOLES

(b)

(a)

Fig. 3.23.

Arboles binarios que representan cdigos con la propiedad de


prefijos.

Ejemplo 3.13. La secuencia de pasos seguidos para los caracteres y probabilidades


del ejem plo que se est desarrollando se m uestra en la figura 3.24. En la parte (e),
se puede ver que las palabras de cdigo para a, b, c, d y e son 1111,0, 110, 1110 y
10. En este ejemplo, hay un solo rbol no trivial, pero, en general, puede haber va
rios. Por ejemplo, si las probabilidades de b y e fueran 0.33 y 0.32, entonces, des
pus del paso (c) de la figura habra que com binar b y e en vez de aadir e al rbol
m s grande, como se hizo en el paso (d).
Se describen ahora las estructuras de datos necesarias. Prim ero, se usa un arre
glo ARBOL de registros del tipo
record
htjo-izq: integer;
hijo-der. integer;
padre, integer
end
para representar los rboles binarios. Los apuntadores al padre facilitan el hallazgo
de cam inos de las hojas a la raz, que perm iten descubrir los cdigos de los caracte
res. En segundo trm ino, se usa un arreglo ALFABETO de registros del tipo
record
smbolo: char;
probabilidad: real;
hoja: integer ! cursor a un rbol
end
0.12

0.40 0.15 0.08 0.25

b
(a)

0.20

a
(b)

Inicial

www.FreeLibros.me

0.40 0.15

0.25

Com bina a y d

ARBOLES BINA RIOS

0 .3 5

d
(c)

99

0 .6 0

0.40

0.25

0.40
b

1.00

C om bina a,d con c

d
(d)

d
(e)
Flg. 3.24.

C om bina a.c.d con e

Arbol final

Pasos para la construccin de un rbol de Huffman.

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

simbo- proba hoja


lo bilidad

BO SQ U E

A LF AB E TO
F ig . 3 .2 5 .

Contenido inicial de los arreglos.

www.FreeLibros.me

h ijo - hijo_ padre


izq
der
ARBOL

100

ARBOLES

(1)

while haya m s de un rbol en el bosque do


begin
i := ndice del rbol de m enor peso en BO SQ U E;
j := ndice del segundo rbol de m enor peso en BO SQ U E;
crea un nuevo nodo con hijo izquierdo BOSQUE[i].raz
e hijo derecho BOSQUE[j).rair,
reem plaza el rbol i de BO SQ U E por un rbol cuya
raz es el nuevo nodo y cuyo peso es
BOSQUE[i].peso + BOSQUE[j].peso\
elim ina el rbol j de BOSQU E
end;

(2)
(3)
(4)
(5)

(6)

Fig. 3.26.

Esbozo de la construccin de rboles de Huffman.

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

function crea ( rboLizq, rbol-der. integer ) : integer;


i devuelve un nuevo nodo cuyos hijos son BOSQU E[rboLizq\.
raz y BOSQUE[rboLder].raz |
begin
lt-nodo
lt-nodo + 1;
I la celda para el nuevo nodo es A RBO L[lt-nodo] I
A RB O L[lt-nodo].hijo-izq
BOSQUE[rboLizq].raz:
A R B O L [!-nodo].hijo-derB O SQ U E [rboL der].raz\
I ahora asigna apuntadores padre al nuevo nodo y a sus hijos 1
A RBOL[lt-nodo].padre := 0;
ARBOL[BOSQUE[rbol-izq].raz].padre
lt-nodo\
ARBOL[BOSQUE[rboLder].raiz].padre :- lt-nodo;
return ( lt-nodo)
end; 1 crea |
Fig. 3.27.

Dos procedim ientos.

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

La figura 3.29 m uestra la estructura de datos de la figura 3.25 despus de que


ll-rbol ha quedado reducido a 3; es decir, cuando el bosque tiene el aspecto de la
figura 3.24{c).

ALFABETO

6
3
0
hijo-izq hijo-der padre
ARBOL

Fig. 3.29.

Estructura de datos de un rbol despus de dos iteraciones.

Despus de term inada la ejecucin del algoritmo, el cdigo de cada smbolo se


puede determ inar como sigue. Encuntrese el smbolo en el campo smbolo del arre
glo ALFABETO. Sgase el campo hoja del mismo registro para obtener un registro
del arreglo ARBOL, este registro corresponde a la hoja asociada al smbolo en cues
tin. Sgase repetidam ente el apuntador padre desde el registro actual, por ejem
plo, el del nodo n. al registro en el arreglo ARB O L de su padre p. Hgase esto sin ol
vidar el nodo n, de m anera que sea posible examinar los apuntadores hijo-izq e hijo -d e r de p y determ inar cul de ellos apunta a n. En el prim er caso, imprmase 0;
en el segundo, 1. La secuencia de bits impresa de esta forma ser el cdigo del sm
bolo con el orden de los bits invertido. Si se desea im prim ir los bits en el orden
correcto, se pueden m eter en una pila conforme se sube por el rbol, tras lo cual se
sacan en forma reiterada bits de la pila, imprimindolos al mismo tiempo.

Realizacin de rboles binarios basada en apuntadores


En vez de utilizar cursores para apuntar a los hijos izquierdos y derechos (y a los
padres, si se desea), es posible usar apuntadores genuinos de Pascal. Por ejemplo, se
puede declarar
type
nodo = record
hijo-izq-, fnodo;
hijo-der. fnodo;
padre-, fnodo
end

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

Respndase a las siguientes preguntas acerca del rbol de la figura 3.31.


a)
b)
c)
d)
e)
f)

g)
h)
i)
j)

Qu nodos son hojas?


Qu nodo es la raz?
Cul es el padre del nodo C?
Qu nodos son los hijos de C?
Qu nodos son los antecesores de C
Qu nodos son los descendientes de ?
Cules son los hermanos derechos de D y ?
Qu nodos estn a la izquierda y a la derecha de (7?
Cul es la profundidad del nodo C?
Cul es la altura del nodo C?

www.FreeLibros.me

104

ARBOLES

3.2

Cuntos caminos distintos de longitud 3 hay en el rbol representado en


la figura 3.31?

3.3

Escrbanse programas para calcular la altura de un rbol, usando cada una


de las tres representaciones de rboles de la seccin 3.3.

3.4

Lstense los nodos de la figura 3.31 en


a) orden previo,
b) orden posterior, y
c) orden simtrico.

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.

Mrquese la interseccin de la fila i con la colum na j si las situaciones re


presentadas por esa fila y esa columna pueden ocurrir simultneamente.
ord-pre(n)
< ord-pre(m)

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

Supngase que se tienen los arreglos ORD_PRE[eiJ, ORD_SIM[n] y


ORD_POST(n] que dan las posiciones en los rdenes previo, simtrico y
posterior, respectivam ente, de cada nodo n de un rbol. Descrbase un al
goritmo que diga si un nodo i es un antecesor o no de un nodo j, para cual
quier par de nodos i, j. Expliqese cmo trabaja el algoritmo.

*3.8

Es posible probar si un nodo m es un descendiente propio o no de un nodo


n. determ inando si m precede a rt en orden X, pero sucede a n en orden Y,
donde X e Y se eligen Ipre, post, simj. Determnense todos los pares X, Y
para los cuales se cumple esta afirmacin.

www.FreeLibros.me

EJERCICIOS

3.9

105

Escrbase un program a para recorrer un rbol binario en


a) orden previo,
b) orden posterior,
c) orden simtrico.

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

Dibjense representaciones de rbol para las expresiones


a) a + b * c + de
b) * a + b + cde.

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

Escrbase un program a para evaluar expresiones aritm ticas en


a) orden previo
b) orden posterior.

3.15 Como modelo m atemtico, es posible definir un rbol binario como un


TDA con estructura de rbol binario y con operaciones como HIJO_IZQ(n), H IJO -D E R (n), PADRE(n) y NULO(n). Las tres prim eras ope
raciones devuelven el hijo izquierdo, el hijo derecho y el padre del nodo n
(A , si no existe), y la ltim a devuelve verdadero si, y slo si, n es A . Im
plntense estos procedim ientos con la representacin de rboles binarios de
la figura 3.21.
3.16 Obtnganse las siete operaciones con rboles de la seccin 3.2, usando las
siguienies realizaciones de rboles:
a) apuntadores al padre,
b) listas de hijos,
c) apuntadores al hijo ms a la izquierda, herm ano derecho.
3.17

El grado de un nodo es el nm ero de hijos que tiene. Mustrese que en cual


quier rbol binario el nm ero de hojas es uno ms que el nm ero de nodos
de grado dos.

www.FreeLibros.me

106

ARBOLES

3.18

Mustrese que el mximo nmero de nodos de un rbol binario de altura


h es 2*41 - 1. Un rbol binario de altura h con ese mximo nmero de no
dos se denomina rbol binario lleno.

*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

Supngase que los caracteres a, b. c. d, e. y / tienen probabilidades 0.07,


0.09, 0.12, 0.22, 0.23 y 0.27, respectivamente. Encuntrese un cdigo de
Huffman ptim o y dibjese el rbol de Huffman correspondiente. Cul es
la longitud media del cdigo?

*3.21

Supngase que A es un rbol de Huffman y que la hoja del smbolo a tiene


una profundidad mayor que la del smbolo b. Demustrese que la probabi
lidad del smbolo b no es menor que la del smbolo a.

*3.22

Demustrese que el algoritmo de Huffman funciona, es decir, que produce


un cdigo ptimo para las probabilidades dadas. Sugerencia. Utilcese el
ejercicio 3.21.

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

Introduccin a los conjuntos

U n conjunto es una coleccin de miembros (o elementos); cada m iem bro de un con


junto puede ser un conjunto, o un elem ento prim itivo que recibe el nom bre de to
mo. Todos los miembros de un conjunto son distintos, lo cual significa que ningn
conjunto puede contener dos copias de un m ismo elemento.
Por lo general, cuando los tom os se usan como herram ientas para el diseo de
algoritmos y estructuras de datos, son enteros, caracteres o cadenas, y todos los ele
mentos de cualquier conjunto suelen ser del m ismo tipo. A m enudo se har la su
posicin de que los tom os estn ordenados linealm ente por una relacin que se de
signa m ediante el smbolo < , y se lee m enor que o precede a. Un orden li
neal < sobre un conjunto 5 satisface dos propiedades:
Para cualesquiera a y b en 5, slo una de las afirm aciones a < b, a - b o b < a
es verdadera.
2. Para todo a. b y c en S, si a < b y b < c, entonces a < c (transitividad).
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

OPERACIONES BASICAS CON CO NJUN TO S

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

Por ejemplo, si A = la, b, c\ y B = Ib. d, entonces A U B = la. b, c, d\. A n B = |>} y


A - B = la. el.

Tipos de datos abstractos basados en conjuntos


Se considerarn ahora los TDA que incorporan diversas operaciones con conjuntos.
Algunas colecciones de estas operaciones reciben nom bres especiales y tienen reali
zaciones muy eficientes. Algunas de las operaciones con conjuntos ms comunes son
las siguientes.
I .-3. Los procedimientos U N IO N R , B, C ), IN T E R SE C C IO N ^, B. Q y DIFEREN
C IA R . B, C) tom an los argumentos A y B cuyos valores son conjuntos y asig
nan el resultado, A J B, A C\ B o A - B. respectivam ente, a la variable C de
conjuntos.
4.

Algunas veces se emplea una operacin llamada combinacin o unin de con


juntos disjuntos, que no difiere de la unin, pero supone que sus operandos
son disjuntos (no tienen m iem bros en comn). El procedim iento COM BINAR,
B, O asigna a la variable C de conjuntos el valor A [J B, pero no est definido
cuando A n B
0 , es decir, si los conjuntos A y B no son disjuntos.

5.

La funcin MIEMBROR, A) toma el conjunto A y el objeto x, cuyo tipo es el


de los elementos de A, y devuelve un valor booleano: verdadero si x e A y fal
so si x $ A.

6.

El procedimiento A N ULAR), hace que el conjunto nulo sea el valor de la va


riable conjunto A.

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.

SU PRIM ER, A) elim ina x de A, es decir, A se reemplaza por A - j x |. Si x no


est originalmente en A, SU PRIM ER, A) deja sin cambios el conjunto A.

9.

ASIGNAR, B) hace que el valor de la variable A de conjuntos sea igual al va


lor de la variable B , tambin de conjuntos.

10.

La funcin M IN R ) devuelve el elem ento m enor del conjunto A. Esta opera


cin slo es aplicable cuando los miembros del conjunto parm etro estn or
denados linealmente. Por ejemplo, MIN(|2, 3, 1}) = 1 y MIN(la, b, cl) = a.
Tam bin se utiliza la funcin MAX, cuyo significado es obvio.

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.

La funcin ENCUENTRA(x) opera en un am biente donde hay una coleccin


de conjuntos disjuntos. EN CU EN TRA R) devuelve el nom bre del (nico) con
junto del cual x es miembro.

www.FreeLibros.me

110

4 .2

OPERACIONES BASICAS CO N CONJUN TO S

Un TDA con UNION, INTERSECCION y DIFERENCIA

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

UN TDA CO N UN IO N , INTERSECCION Y DIFERENCIA

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.

Diagrama de flujo para el algoritm o de Euclides.

www.FreeLibros.me

112

OPERACIONES BASICAS CON CO NJUN TO S

El conjunto ELIM[i] es el conjunto de las definiciones d que no estn en B, y ta


les que B, contiene una definicin de la misma variable que d. Por ejemplo, en la
figura 4.1, GEN[A[ - {6}, puesto que la definicin 6 (de la variable l) est en fi4 y no
hay ninguna definicin posterior de t en B t.ELIM\4] 1, 9}, puesto que 1 y 9 son
las definiciones de la variable t que no se encuentran en B A.
Adems de los DEF-ENT[i], se calcula el conjunto DEF-SAL[i] para cada uno
de los bloques B r De la m isma m anera que DEF-ENT[i] es el conjunto de defini
ciones que alcanzan el principio de B, DEF-SAL[i] es el conjunto de definiciones
que alcanzan el final de B r Existe una frmula muy sencilla que relaciona
D E F -E N T y D EF-SAL.
D E F -SA L V ) - (DEF-ENT[) - E LIM [i]) U GEN[i]

(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

REALIZACION DE C O N JU N TO S M EDIANTE VECTORES DE BITS

113

En la figura 4.3 se m uestran los valores sucesivos de DEF-ENT[i] despus de


cada iteracin del ciclo repeat de la figura 4.2. Obsrvese que ninguna de las asig
naciones ficticias 1, 2 y 3 alcanza un bloque donde se emplea su variable, por tanto,
en el programa de la figura 4.1 no hay usos de variables indefinidas. Obsrvese tam
bin que al diferir la aplicacin de (4.2) para B, hasta antes de aplicar (4.1) para B,.
hara que en general el proceso de la figura 4.2 convergiera en menos iteraciones.

4 .3

Realizacin de conjuntos mediante vectores de bits

Obtener la mejor realizacin para un TDA C O N JU N TO depende de las operaciones


que se vayan a efectuar y del tam ao de los conjuntos. Cuando todos los conjuntos
del dom inio en cuestin son subconjuntos de un pequeo conjunto universal cu
yos elementos son los enteros 1, 2, .., N, para algn A'fijo, se puede usar una reali
zacin basada en un vector de bits (arreglo booleano). Un conjunto se representa me
diante un vector de bits en el que el /-simo bit es verdadero si / es un elem ento del
conjunto. La principal ventaja de esta representacin radica en que las operaciones
MIEMBRO, INSERTA y SUPRIM E se pueden realizar en un tiem po constante me
diante una referencia directa al bit apropiado. UNION, INTERSECCION y DIFE
RENCIA se pueden realizar en un tiem po proporcional al tam ao del conjunto uni
versal.
var
GEN, ELIM . D EF-ENT. DEF-SAL: array[l..8] of CONJUNTO;
I se supone que GEN y E L IM se calculan por fuera }
i: integer;
hay-cambios: boolean;
procedure propaga ( G.K.I: CON JUN TO ; var O. CO N JU N TO );
I aplica (4.1) y asigna verdadero a hay-cambios si se detecta algn cambio
en D E F -SA L 1
var
TEME. CONJUNTO;
begin
DIFERENCIAR, K, TEMP)\
UNION(rA//>, G. TEMP)\
if not \G \JN U TE M P , O) do begin
A S IG N A (a TEMP),
h a y - c a m b i o s true
end
en d ;| propaga I
begin
for / :* 1 to 8 do
\S\G N A (D E F -SA L [i], GEN\i])\

www.FreeLibros.me

114

OPERACIONES BASICAS CO N CO N J UNTOS

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.

Programa para calcular definiciones de alcance.

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.

DEF_ENT [/] despus de cada iteracin.

Si el conjunto universal es suficientemente pequeo para que un vector de bits quepa


en una palabra de com putador, entonces U N IO N , INTERSECCION y DIFEREN
CIA se pueden realizar m ediante una sola operacin lgica del lenguaje de la m
quina en cuestin. Algunos conjuntos pequeos se pueden representar directamente
en Pascal por medio de la construccin set. El tam ao mximo de tales conjuntos
depende del com pilador particular que se est usando y, por desgracia, a m enudo es
dem asiado pequeo para problemas tpicos con conjuntos. Sin embargo, al escribir
los propios program as no es necesario restringirse a un limite para el tam ao de los
conjuntos, siem pre que sea posible tratar cualquier conjunto como un subconjunto
de algn conjunto universal |l,..., M. Se pretende que si A es un conjunto represen
tado por un arreglo booleano, entonces A[i\ ser verdadero si, y slo si, el elemento

www.FreeLibros.me

REALIZACION DE CO NJUN TO S M EDIANTE LISTAS ENLAZADAS

115

i es m iem bro de A. As, se puede definir un TDA C O N JU N TO m ediante la decla


racin en Pascal
const
N - Icualquier valor adecuado};
type
CO N JU N TO - packed array[l.JV] of boolean;
Se puede implantar entonces el procedimiento UNION tal como se muestra en la figu
ra 4.4. Para implantar INTERSECCION y DIFERENCIA basta reemplazar or en la fi
gura 4.4, por and y and not, respectivam ente. Es posible poner en prctica las otras
operaciones mencionadas en la seccin 4.1 (exceptuando COM BINA y ENCUEN
TRA, que tienen poco sentido en este contexto) a m anera de ejercicios sencillos.
Se puede utilizar la im plantacin de conjuntos m ediante vectores de bits, cuando
el conjunto universal es un conjunto finito diferente de un conjunto de enteros con
secutivos. De ordinario, se necesitara una m anera de traducir entre los miembros
del conjunto universal y los enteros 1, ..., N. As, en el ejemplo 4.1, se supuso que
las definiciones de datos tenan asignados nm eros del 1 al 9. En general, las tra
ducciones en ambas direcciones se pueden efectuar m ediante el TDA CORRESPON
DENCIA descrito en el captulo 2. Sin embargo, la traduccin en sentido inverso de
enteros a elementos del conjunto universal puede lograrse mejor con un arreglo A
en el cual A[i] sea el elem ento correspondiente al entero i.
procedure UNION ( A, B : CON JUN TO ; var C: C O N JU N T O );
var
/: integer;
begin
for i
1 to N do
Q /] > A[i] or B[i]
end
Fig. 4.4.

4 .4

Realizacin de UNION.

Realizacin de conjuntos mediante listas enlazadas

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

OPERACIONES BASICAS CON CO NJUN TO S

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

REALIZACION DE C O N JU N TO S M EDIANTE LISTAS ENLAZADAS

(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)

(12)
(13)
(14)
(15)

117

procedure INTERSECCION ( encab-a, encab-b: t tipo_celda;


var apc. t tipo_celda );
i calcula la interseccin de las listas clasificadas A y B con celdas de en
cabezam iento encab-a y encab-b. dejando el resultado como una
lista clasificada a cuyo encabezam iento apunta apc i
var
.ctuaLa, actuaLb, actuaLc. t tipo_celda;
I las celdas actuales de las listas A y B y la ltim a celda agregada a la
lista C 1
begin
new(apc)\ I crea el encabezam iento de la lista C \
actual-a
encab-a] .sig,
actuaLb := encab-b].sig-,
actuaLc := apc,
while (actual-a < > nil) and (actual-b < > nil) do begin
I com para los elem entos actuales de las listas A y B I
if actuaLa] .etemento = actuaLb].elem ento then begin
I agrega a la interseccin
new{actual-c\.sig)\
actuaLc \= actuaLc].sig,
actuaLc].elemento := actuaLa].elemento',
actuaLa := actuaL a .sig
actuaLb
actual-b].sig
end
else f elem entos distintos 1
if actuaLa],elem ento < actuaLb].elem ento then
actuaLa
actuaLa],sig
else
actuaLb
actuaLb].sig
end;
actuaLc].sig := nil
end; {INTERSECCION
Fig. 4.5.

Procedimiento de interseccin que utiliza listas clasificadas.

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

OPERACIONES BASICAS CON CONJ UNTOS

es sencillo; slo devuelve el prim er elem ento de la lista. SUPRIM E y ENCUENTRA


se pueden realizar encontrando el elem ento objetivo como se expuso para las listas
generales y en el caso de SUPRIM E, elim inando su celda.
Por ltimo, la insercin no es difcil de im plantar, pero debe hacerse de modo que
se inserte el nuevo elem ento en la posicin apropiada. La figura 4.6 m uestra un pro
cedim iento INSERTA que tom a como parm etros un elem ento y un apuntador a la
celda de encabezam iento de una lista, e inserta el elem ento en la lista. La figura 4.7
m uestra las celdas y apuntadores cruciales antes (lneas de trazo continuo) y despus
(lneas punteadas) de la insercin.
procedure INSERTA ( x. tipo_elem ento; a: t tipo_celda );
i inserta x en la lista a cuyo encabezam iento apunta p 1
var
actual, ceLnue. t tipo_celda;
begin
actual := a\
while actual],sig < > nil do begin
if actualLsig],elemento = a then
return; | si x ya est en la lista, regresa I
if actual],sig],elemento > x then
goto agrega; f salida del ciclo I
a c tu a la c tu a l] ,s ig
end;
agrega: f actual es ahora la celda despus de la cual se debe insertar x (
neMceLnue)',
ceLnue].elem ento
x;
ceLnue],sig := actual.sig-,
actual],sig := ceLnue
end; j INSERTA |
Fig. 4.6.

4 .5

Procedimiento de insercin.

El diccionario

Cuando se usa un conjunto en el diseo de un algoritmo, quiz no sean necesarias


algunas operaciones poderosas como unin e interseccin. A menudo, lo nico que
se necesita es m antener un conjunto de objetos actuales, con inserciones y supre
siones peridicas en el conjunto. Con cierta frecuencia, tam bin puede ser necesario
saber si un elem ento particular est en el conjunto. Un TDA CON JUN TO con las
operaciones INSERTA, SUPRIM E y MIEMBRO recibe el nom bre de diccionario.
Se incluir tam bin ANULA como una operacin de diccionario para asignar un va
lor inicial a cualquier estructura utilizada en la aplicacin. Se considerar un ejem
plo de realizacin del diccionario para despus analizar algunas realizaciones apro
piadas para representar diccionarios.

www.FreeLibros.me

EL DICCIONARIO

119

Ejemplo 4.2. La Sociedad para la Prevencin de Injusticias con el Atn (SPIA) m an


tiene una base de datos que registra los votos ms recientes de los legisladores en
asuntos de importancia para los am antes del atn. Desde el punto de vista concep
tual, esta base de datos consta de dos conjuntos de nom bres de legisladores llama
dos chicos-buenos y chicos-tnalos. La sociedad olvida con facilidad los errores del
pasado y, de igual modo, tiende a olvidar a quienes fueron amigos. Por ejemplo, si
se efectuara una votacin para decidir acerca de la prohibicin de la pesca de atn
en el lago Erie, todos los legisladores que votaran a favor se incluiran en chicos-buenos y se excluiran de chicos-malos, y lo contrario sucedera con los que votaran en
contra. Los legisladores que se abstuvieran, perm aneceran en el conjunto donde se
encontraran, si estuvieran en alguno.
Cuando est en operacin, el sistema de bases de datos acepta tres mandatos,
cada uno representado por un solo carcter, seguido de una cadena de diez caracte
res que denota el nombre de un legislador; cada m andato est en una lnea aparte.
Los mandatos son:
1. F (sigue un legislador con voto favorable)
2. D (sigue un legislador con voto desfavorable)
3. ? (determina el estado del legislador que sigue).
Tambin se permite el carcter E en la lnea de entrada para sealar el fin del pro
ceso. La figura 4.8 m uestra un esbozo del programa, escrito en funcin del TDA D IC
CIONARIO an no definido, que en este caso se pretende que sea un conjunto de
cadenas de longitud 10.

actual

ceLnue

Fig. 4.7.

Representacin de la insercin.

www.FreeLibros.me

120

4 .6

OPERACIONES BASICAS CON CO NJUN TO S

Realizaciones sencillas de diccionarios

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

REALIZACIONES SENCILLAS DE DICCIO NA RIOS

121

else if MIEMBRO(su/fo, chicos-malos) then


wnteln(sujeto, 'es un enemigo)
else
writeln('no se tiene informacin sobre, sujeto)
end; consulta}
begin I program a principal 1
ANULA(c/ cos_ u os);
ANULA(c/t/cos_/wa/0.s);
reud(mandato)\
while m andato < > E do begin
read!n(legislador)\
if mandato - F then
favorable{legislador)
else if m andato = D then
desfavorable{legislador)
else if m andato = *? then
consulta{legislador)
else
error? m andato desconocido);
read(mandato)
end
end. 1atn (
Fig. 4.8.

Esbozo del programa de base de datos SPIA.

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

OPERACIONES BASICAS CON CONJUN TO S

procedure INSERTA ( x: tipo_nom bre; var A: DICCIONARIO );


begin
if not MIEMBRO(x, A) then
if A.lt < tam ao-m x then begin
A . l l A . l t + 1;
A.datos[A.lt)
x
end
else error{'la base de datos est llena)
end; t INSERTA |
procedure SUPRIM E ( x: tipo_nom bre; var A: DICCIONARIO );
var
i: integer;
begin
if A.lt > 0 then begin
i
1;
while (A.dalos[i] < > x) and (/' < A.lt) do
/ := i + 1;
I cuando se llega aqu, se ha encontrado x o el elemento
actual es el ltim o del conjunto A, o ambas cosas }
if A.datos[i] - x then begin
A .datos[i]A .datos[A .lt]\
! pasa el ltim o elem ento al lugar ocupado por x; ob
srvese que si i = A.lt, este paso no hace nada,
pero el siguiente elim ina x )
A . ltA . lt - 1
end
end
end; I SUPRIM E !
Fig. 4.9.

4 .7

Declaraciones de tipos y procedim ientos para un diccionario basado en


arreglos.

La estructura de datos tabla de dispersin

En prom edio, la realizacin de diccionarios m ediante arreglos requiere O (N) pasos


para la ejecucin de una sola instruccin INSERTA, SUPRIM E o MIEMBRO en
un diccionario de N elementos; si se usa una realizacin m ediante listas, se obtiene
una velocidad similar. En la realizacin m ediante vectores de bits, cualquiera de es
tas tres operaciones utiliza un tiem po constante, pero existe la limitacin de traba
ja r con conjuntos de enteros en un intervalo pequeo para la realizacin que sea fac
tible.
Existe otra tcnica im portante y muy til para im plantar diccionarios, y se deno
m ina dispersin (hashing). La dispersin utiliza tiem po constante por ope
racin, en promedio, y no existe la exigencia de que los conjuntos sean subconjuntos de algn conjunto universal finito. En el peor caso, este m todo requiere, para

www.FreeLibros.me

LA ESTRUCTURA DE DATOS TABLA DE DISPERSION

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.

Organizacin de datos en la dispersin abierta.

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

OPERACIONES BASICAS CO N CO NJUN TO S

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.

function h ( x. tipo_nom bre ) : 0..-1;


var
i, suma: integer;
begin
sum a > 0;
for i > I to 10 do
sum a
sum a + ord(x\])\
h
sum a mod B
end; I h )
Fig. 4.11.

Una funcin de dispersin sencilla h.

Con el fin de especificar, se presenta ahora una funcin de dispersin para


cadenas de caracteres que es muy buena, aunque no perfecta. La idea es considerar
a los caracteres como enteros, utilizando el cdigo de caracteres de la mquina para
definir la correspondencia. Pascal proporciona la funcin incorporada ord, donde
ord(c) es el cdigo entero del carcter c. As, si x es una clave y el tipo de las claves
es a rra y [l..l0 ] of char (lo que se llam tipo_nom bre en el Ejemplo 4.2), se podra
declarar la funcin de dispersin h como en la figura 4 .1 1. En esa funcin, se su
man los enteros para cada carcter y se divide el resultado entre B , tom ando el re
siduo, que es un entero entre 0 y B - \.
En la figura 4.12 se observan las declaraciones de las estructuras de datos para
una tabla de dispersin abierta y los procedimientos que realizan las operacio
nes para un diccionario. El tipo de los m iem bros del diccionario se supone que es
tipo_nom bre (un arreglo de caracteres), de modo que estas declaraciones se pueden
usar en forma directa en el ejemplo 4.2. Debe observarse que en la figura 4.12 se ha
hecho que los encabezamientos de las listas de cubetas sean apuntadores a celdas, en
lugar de celdas completas. Esto se hizo as, porque la tabla de cubetas, donde se en
cuentran los encabezamientos, podra ocupar tanto espacio como las propias listas si
fuera un arreglo de celdas, en lugar de uno de apuntadores. Obsrvese, sin embargo,
que se paga un precio por este ahorro de espacio. Ahora, el cdigo del procedimien
to SUPRIM E debe hacer distincin entre la primera celda y las restantes.

www.FreeLibros.me

LA ESTRUCTURA DE DATOS TABLA DE DISPERSION

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

OPERACIONES BASICAS CO N CO NJUN TO S

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.

Realizacin de un diccionario mediante una tabla de dispersin abierta.

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

DE DATOS TABLA DE DISPERSION

127

que a va a la cubeta 3, b a la 0 y c a la 4. Al insertar d, prim ero se hace la prueba


con h(d) = 3 para encontrar que est llena. Luego se intenta con h(d) - 4 y ocurre
lo mismo. Por ltimo, se prueba con h2(d) = 5, se encuentra un espacio vaco y d se
coloca all. Las posiciones resultantes estn en la figura 4.13.
La prueba de pertenencia de un elem ento x al conjunto requiere exam inar h(x),
/i,(x), h2( x ) , ..., hasta encontrar x o una cubeta vaca. Para ver por qu es posible de
tenerse al alcanzar una cubeta vaca, supngase prim ero que las supresiones no es
tn permitidas. Si h ^x ) es la prim era cubeta vaca encontrada en la serie, no es po
sible que x est en las cubetas ht(x), h5(x) o m s adelante en la sucesin, porque x
no pudo haber sido colocada all a m enos que h}(x) hubiera estado llena en el mo
mento de insertarla.
0
i

3
4
5
6
7
Fig. 4.13.

Tabla de dispersin parcialmente llena.

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

OPERACIONES BASICAS CON CONJUNTOS

al buscar d y com enzar en h(d) - 3, se pueden exam inar 4 y 5 para encontrar d, y


no detenerse en 4 como se hubiera hecho de haber puesto vacio en esa cubeta.
En la figura 4.14 se observan las declaraciones de tipos y las operaciones para el
TDA DICCIONARIO con m iem bros de conjunto del tipo tipo-nom bre y la tabla
de dispersin cerrada como estructura fundamental. Se utiliza una funcin de
dispersin arbitraria h, de la cual la figura 4.11 es una posibilidad, y se usa la
estrategia de dispersin lineal para redispersar en caso de colisiones. Por con
veniencia, se identifica vaco con una cadena de diez espacios y suprimido con una
de diez asteriscos, con la suposicin de que ninguna de esas cadenas puede ser una
clave real. (En la base de datos SPIA esas cadenas tienen poca probabilidad de ser
nom bres de legisladores.) El procedim iento INSERTAR, A) prim ero usa localiza
para determ inar si x ya est en A, y si no, utiliza una rutina especial localiza 1 para
encontrar una localidad en la cual se pueda insertar x. Obsrvese que localizal bus
ca localidades m arcadas tanto con vacio como con suprimido.
const

vacio - *
i 10 espacios !
suprimido - '*********; | io asteriscos f
type

DICCIONARIO - array[0..fl-l] of tipo_nombre;


procedure ANULA ( var A: DICCIONARIO );
var

i: integer;
begin
for i

0 to B - 1 do
A[\
vacio
end; I ANULAl
function localiza ( x: tipo_nom bre ) : integer;

I localiza examina el DICCIONARIO desde la cubeta para h(x) hasta que


se encuentre x, o una cubeta vaca, o se haya revisado toda la tabla
y determ inado que no contiene a x; localiza devuelve el ndice
de la cubeta en la que se detiene por cualquiera de esas razones I
var

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

ESTIMACION DE LA EFICIENCIA DE LAS FUNCIONES DE DISPERSION

129

function localiza1 ( x . tipo_nom bre ): integer;

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);

if (A[cubet\ - vacio) or (A[cubeta) - suprim ido) then

A[cubeta\

else

error (INSERTA fall: la tabla est llena)


end;

jINSERTA 1

procedure SUPRIM E ( x: tipo.nom bre; var A: DICCIONARIO );


var

cubeta; integer;
begin

cubeta
locahza(x)\
if A[cubeta] - x then
Afcubeta]
suprimido
end; | SUPRIM E
Fig. 4.14.

4 .8

Realizacin de un diccionario mediante una tabla


de dispersin cerrada.

Estimacin de la eficiencia de las funciones de dispersin

Como ya se mencion, la dispersin es una m anera eficiente de representar dic


cionarios y otros tipos de datos abstractos basados en conjuntos. En esta seccin se
examinar el tiempo prom edio por operacin de diccionario en una tabla de dis
persin abierta. Si hay B cubetas y N elem entos alm acenados en la tabla de dis
persin, las cubetas tienen, en prom edio, N /B m iem bros y se puede esperar que una
operacin normal INSERTA, SUPRIM E o MIEMBRO lleve un tiem po 0{ l + N/B).
La constante 1 representa el tiem po necesario para hallar la cubeta, y N/B. el tiem
po para buscar en ella. Si puede elegirse B casi igual a N, este tiem po se convierte

www.FreeLibros.me

130

OPERACIONES BASICAS CON CONJUNTOS

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

ESTIMACION DE LA EFICIENCIA DE LAS FUNCIONES DE DISPERSION

131

clave un nm ero n de 5 dgitos y se eleva al cuadrado, se obtiene un nm ero de 9


10 dgitos. Los dgitos medios, como los que estn entre las posiciones cuarta y
sptima a la derecha, tienen valores que dependen de casi todos los dgitos de n\ por
ejemplo, el cuarto dgito depende de todos ellos excepto del que se encuentre ms a
la izquierda de n, y el quinto depende de todos los dgitos de n. De m odo que si
B - 100, se podran tom ar los dgitos sexto y quinto para form ar el nm ero de cubeta.
Esta idea se puede generalizar para situaciones en las que B no sea una potencia
de 10. Supngase que las claves son enteros en el intervalo 0, 1, ..., K. Si se escoge
un entero C tal que BC1 sea casi igual a K2, la funcin
h(n) - [ n2/C J mod B
efectivamente extrae un dgito de base B del centro de n2.
Ejemplo 4.6.

Si k - 1000 y B = 8, se puede elegir C - 354. Entonces,


(4 5 6 )- ( ^ ^ j mod 8 = 587 mod 8 - 3.
354

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.

Anlisis de dispersin cerrada


En un esquema de dispersin cerrada, la velocidad de insercin y de otras ope
raciones no slo depende de lo aleatoriam ente que la funcin de dispersin dis
tribuye ios elem entos en las cubetas, sino tam bin de lo bien que la estrategia de re
dispersin evita colisiones adicionales cuando una cubeta ya est llena. Por ejem
plo, la estrategia lineal para resolver colisiones no es la mejor posible. Aunque el an
lisis de este hecho no se efecta en este libro, es posible observar lo siguiente. Tan
pronto como se llenen unas cuantas cubetas consecutivas, cualquier clave que se dis
persa a una de ellas ser enviada al final del grupo por la estrategia de redis
persin, con lo cual el tam ao de ese grupo de cubetas consecutivas se incrementar.
De este modo, es probable encontrar sucesiones ms largas de cubetas consecutivas
t Si las cadenas pueden ser m uy largas, esta sum a tendra que hacerse para alguna constante c. Por ejem
plo, c valdra uno ms que el mayor entero que se pudiera obtener de un solo bloque.

www.FreeLibros.me

132

OPERACIONES BASICAS CON CONJUNTOS

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
/

(4.3) se usa para (N/B)', es


, de m anera que la aproxim acin obtenida
B+ [- N
es buena, excepto cuando N se acerca bastante a B.
B+1
Obsrvese q u e ---------------------crece en una forma muy lenta conforme N comienB + \-N
za a crecer de 0 a B - 1, que es el mayor valor de N para el cual es posible otra in
sercin. Por ejemplo, si N es la m itad de B, se necesitan alrededor de dos sondeos
para la siguiente insercin. El costo de insercin prom edio por cubeta para llenar M
1
1
B+ 1
1 fM-i g
de las B cubetas e s
V -----------------, que se aproxim a a l
dx, o
M
o B + l - N
M o
B -x
B
B
logf (
). Llenar por completo la tabla (M = B) requiere un promedio de
M
B -M + 1
log,i? sondeos por cubeta o B lo g ji sondeos en total. Sin embargo, llenar la tabla al
90% de su capacidad (M - 0.9 B) slo requiere B(( 10/9)logt. 10) o unos 2.56B sondeos.
El costo medio de la prueba de pertenencia para un elem ento no existente es idn

www.FreeLibros.me

ESTIMACION DE LA EFICIENCIA DE LAS FUNCIONES DE DISPERSION

133

tico al de insertar el siguiente elemento, pero el costo de la prueba de pertenencia


para un elemento que est en el conjunto, es el costo prom edio de todas las inser
ciones realizadas hasta el momento, el cual es m enor en gran m edida si la tabla est
bastante llena. Las supresiones tienen el m ismo costo m edio que las pruebas de per
tenencia, pero, a diferencia de la dispersin abierta, las supresiones de una tabla
de dispersin cerrada no ayudan a acelerar las inserciones o pruebas de perte
nencia posteriores. Se debe subrayar que si no se perm ite que las tablas de dis
persin cerradas se llenen en m s de una fraccin fija, m enor que uno, de su capaci
dad total, el costo medio de las operaciones es una constante; esa constante crece con
forme lo hace la fraccin de la capacidad que se perm ite usar. En la figura 4.15 se
puede ver una grfica del costo de las inserciones, supresiones y pruebas de perte
nencia como una funcin del porcentaje de la tabla que est lleno cuando se realiza
la operacin.

Fig. 4.15.

Costo medio de operacin.

Estrategias aleatorias de resolucin de colisiones


Se ha observado que la estrategia de redispersin lineal tiende a agrupar las cu
betas llenas en bloques grandes consecutivos. Tal vez se pueda lograr un com porta
m iento ms aleatorio si se hacen los sondeos a intervalos constantes mayores que

www.FreeLibros.me

134

OPERACIONES BASICAS CON CONJUNTOS

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.

25 13 se calcula tom ando


25 =
13 -

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

ESTIMACION DE LA EFICIENCIA DE LAS FUNCIONES DE DISPERSION

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

Clculo de una sucesin de registros de desplazamiento.

Reestructuracin de tablas de dispersin


Si se usa una tabla de dispersin abierta, el tiempo m edio de las operaciones cre
ce con N /B , cantidad que crece con rapidez conforme el nm ero de elementos ex
cede el nm ero de cubetas. De m anera similar, para una tabla de dispersin
cerrada, como se vio en la figura 4.15, la eficiencia dism inuye a m edida que N se
acerca a B, y no es posible que N exceda a B.
Para m antener el tiem po constante por operacin, que en teora es posible con
las tablas de dispersin, se sugiere que si N crece demasiado, por ejemplo
N > 0.9 B para una tabla cerrada o N > 2 B para una abierta, sencillamente se pro
duzca una nueva tabla de dispersin con el doble de cubetas. La insercin de los
elementos actuales del conjunto en la nueva tabla llevar, en prom edio, m enos tiem
po que el requerido para insertarlas en la tabla ms pequea, y ese costo se compen
sa cuando se realizan operaciones de diccionario posteriores.

www.FreeLibros.me

OPERACIONES BASICAS CON CONJUNTOS

136

4 .9

Realizacin del TDA CORRESPONDENCIA

Recurdese el anlisis del TDA CORRESPONDENCIA del captulo 2, en el cual se


defini una correspondencia como una funcin de los elementos de un dom inio a
los elem entos de un contradom inio. Las operaciones de este TDA son:
1.
2.
3.

ANULA(/4) inicializa la correspondencia A, dejando cada elemento del dominio


sin valor asignado en el contradom inio.
A SIG N A R, d, r) define A(d) como r.
CALCULAR, d. r.) devuelve verdadero y hace que r tome el valor A(d) si A(d)
est definido; en caso contrario, devuelve falso.

Las tablas de dispersin son una forma efectiva de obtener correspondencias.


Las operaciones ASIGNA y CALCULA se realizan de la m isma m anera que las ope
raciones INSERTA y MIEMBRO para un diccionario. Considrese prim ero una ta
bla de dispersin abierta. Se supone que la funcin de dispersin h(d) asocia
elem entos del dom inio con nm eros de cubeta. M ientras que para el diccionario las
cubetas consistan en listas enlazadas de elementos, para la correspondencia se ne
cesita una lista de elem entos del dom inio pareados con sus correspondientes valores
del contradom inio.Para esto, la definicin de celda de la figura 4.12 se reemplaza por
type
tipo_celda - record
elem ento-dom inio: tipo-dom inio;
contradominio: tipo_contradom inio;
sig: ttipo_celda
end

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

CORRESPONDENCIA - array[0..fi - 1) of tipo-celda


Este arreglo es el arreglo de cubetas para una tabla de dispersin. El procedimien
to ASIGNA est escrito en la figura 4.17. Los cdigos de ANULA y CALCULA se
dejan como ejercicio.
De m anera parecida, es posible usar una tabla de dispersin cerrada como una
correspondencia. Se definen las celdas como campos de elementos del dom inio y de
elementos del contradom inio, y se declara una CORRESPONDENCIA como un
arreglo de celdas. Com o ocurre con las tablas de dispersin abiertas, se hace que la
funcin de dispersin se aplique a los elem entos del dom inio, no a los del contra
dom inio. Se deja como ejercicio la realizacin de las operaciones de correspondencia
usando una tabla de dispersin cerrada.

www.FreeLibros.me

COLAS DE PRIORIDAD

4 .1 0

137

Colas de prioridad

La cola de prioridad es un TDA basado en el modelo de conjunto con las operacio


nes INSERTA y SU PR IM E-M IN , as como con ANULA para asignar valores ini
ciales a la estructura de datos. Con el fin de definir la nueva operacin SUPRIM E-M IN , prim ero se supone que los elem entos del conjunto tienen una funcin
prioridad definida sobre ellos; para cada elem ento a, p(), la prioridad de a es un
nm ero real o, en trm inos ms generales, un m iem bro de algn conjunto lineal
mente ordenado. La operacin INSERTA tiene el significado habitual, mientras que
SUPRIM E_M IN es una funcin que devuelve un elem ento de ms baja prioridad
y, como efecto colateral, lo suprim e del conjunto. As, como su nom bre indica, SUPRIM E-M IN es una combinacin de las operaciones SUPRIM E y MIN estudiadas
antes en este captulo.
procedure ASIGNA ( var A: CORRESPONDENCIA; a: tipo_dom inio;
r. tipo_contradom inio );
var
cubeta: integer;
actuai. t tipo_celda;
begin
cubeta > h(d)\
a c tu a lA [c u b e ta ]\
while actual < > nil do
if actual f. elem ento-dom inio - d then begin
actual t. contradominio
r, ! reemplaza cl valor anterior
de d I
return
end
else

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.

El procedimiento ASIGNA para una tabla de dispersin abierta.

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

OPERACIONES BASICAS CON CONJUNTOS

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;

La prioridad de un proceso es el valor del cam po de prioridad, que se ha definido


como un entero. La funcin de prioridad se puede definir como sigue;
function p (a: tipo-proceso): integer;
begin
return (a.prioridad)
end;

Para seleccionar el proceso que reciba una porcin de tiempo, el sistema m an


tiene una cola de prioridad ESPERA con elem entos de tipo tipo-proceso, y emplea
dos procedim ientos, inicial y selecciona, para m anejar la cola de prioridad mediante
las operaciones INSERTA y SU PR IM E-M IN . Siempre que un proceso comienza,

www.FreeLibros.me

REALIZACIONES DE COLAS DE PRIORIDAD

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

Asignacin de tiempo a procesos.

Realizaciones de colas de prioridad

Con excepcin de la tabla de dispersin, todas las realizaciones estudiadas hasta


el momento para los conjuntos son tam bin apropiadas para las colas de prioridad.
La razn de que la tabla de dispersin no sea adecuada, es que no proporciona

www.FreeLibros.me

140

OPERACIONES BASICAS CON CONJUNTOS

un medio conveniente de encontrar el m enor elemento, por lo que la dispersin


slo agrega complicaciones y no m ejora el rendim iento respecto a una lista enlaza
da, por ejemplo.
En caso de m anejarse una lista enlazada, se tienen las opciones de clasificarla
o dejarla sin clasificar. Si la lista se clasifica, es fcil encontrar un mnimo; basta to
m ar su prim er elemento. En cambio, la insercin requiere revisar en prom edio la mi
tad de la lista para m antenerla clasificada. Por otro lado, es posible dejar la lista sin
clasificar, lo que facilita la insercin y dificulta la seleccin del mnimo.
Ejemplo 4.10. Se obtendr SUPR1ME_MIN para una lista no clasificada de elemen
tos del tipo tipo_proceso, que se defini en el ejemplo 4.9. El encabezado de la lista
es una celda vaca; las aplicaciones de INSERTA y ANULA son directas, y la apli
cacin por m edio de listas clasificadas se deja como ejercicio. La figura 4.19 pro
porciona la declaracin de las celdas, para el tipo CO LA-PRIORIDA D, y para el
procedim iento SU PR IM E-M IN .

Realizacin de colas de prioridad


mediante rboles parcialmente ordenados
T anto si se desee emplear listas clasificadas como no clasificadas para representar
colas de prioridad, se debe gastar un tiem po proporcional a n para realizar INSER
TA o SU PRIM E_M IN en conjuntos de tam ao n. Existe otra realizacin en la que
ambas operaciones requieren Ofiogn) pasos, una m ejora sustancial para valores gran
des de n (como n > 100). La idea bsica consiste en organizar los elementos de la
cola de prioridad en un rbol binario que est lo ms balanceado posible; hay un
ejemplo en la figura 4.20. En el nivel ms bajo, en el cual pueden faltar algunas ho
jas, se exige que las hojas que falten estn a la derecha de las que se encuentran en
el nivel ms bajo.
Ms im portante an, el rbol es parcialmente ordenado, es decir, la prioridad del
nodo v no es m ayor que la de los hijos de v, donde la prioridad de un nodo es el
nm ero de prioridad del elem ento alm acenado en ese nodo. Obsrvese en la figu
ra 4.20 que los nodos con nm ero de prioridad pequeo no necesitan estar a niveles
m s altos que los de nm ero de prioridad ms grande. Por ejemplo, el nivel tres tie
ne 6 y 8. que son nm eros de prioridad menores que el 9, que aparece en el nivel
dos. En cam bio, el padre de 6 y 8 tiene prioridad 5, la cual es, y debe ser, al menos
tan pequea como las prioridades de sus hijos.
Para ejecutar SUPRIM E_M IN, se devuelve el elem ento de m enor prioridad, que,
como se puede ver con facilidad, debe estar en la raz. Sin embargo, si lo nico que
se hace es elim inar la raz, lo que queda ya no es un rbol. Para que se mantenga la
propiedad de rbol parcialm ente ordenado, lo ms balanceado y con hojas tan a la
izquierda posible, se tom a la hoja de ms a la derecha del nivel ms bajo y se coloca
de m odo provisional en la raz. La figura 4.21 (a) m uestra este cam bio a partir de la
figura 4.20. Despus, este elem ento se coloca en el rbol lo ms abajo posible, in
tercam bindolo con el hijo que tenga la prioridad ms baja, hasta que el elemento

www.FreeLibros.me

REALIZACIONES DE COLAS DE PRIORIDAD

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

actual: ] tipo_celda; I celda anterior a la exam inada |


menor-prioridad: integer; | prioridad m s baja encontrada
preganador. t tipo.celda; i celda anterior a la del elem ento con m enor
prioridad }
begin
if A

siguiente - nil then


error (no puede encontrar el m enor de una lista vaca)

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

OPERACIONES BASICAS CON CONJUNTOS

if p(actual] .siguiente] .elemento) < menor-prioridad then begin


p r e g a n a d o r a c tu a l;
menor .p r io r id a d p (a c tu a l] .siguiente] .elemento)
end;
actual - actual] .siguiente
end;
SU PRIM E_M IN
preganador].siguiente-,
I devuelve el apuntador al ganador !
preganador].siguientepreganador].siguiente].siguiente
I elim ina el ganador de la lista I
end
end; I SUPRIM E_M IN (
Fig. 4.19.

Realizacin de una cola de prioridad mediante listas enlazadas.

Obsrvese tam bin que SU PR IM E .M IN consume un tiem po CK}ogn), aplicado


a un conjunto de n elementos. Esto ocurre porque ningn cam ino del rbol tiene
ms de l + logn nodos y el proceso de forzar el descenso de un elem ento en el rbol
consum e un tiem po constante por nodo. Obsrvese que para cualquier constante c,
la cantidad c(l + logn) es, a lo sumo, igual a 2c logn para n > 2. Por consiguiente,
c( l + log/t) es CHlogn).
3

/ \ 18

10

Fig. 4.20.

10

Un rbol parcialmente ordenado.

Ahora se considerar cmo debera trabajar INSERTA. En prim er lugar, se co


loca el nuevo elem ento lo m s a la izquierda posible en el nivel ms bajo, iniciando
un nuevo nivel si el m s bajo actual se encuentra lleno en su totalidad. La figura
4.22(a) m uestra el resultado de colocar un elem ento con prioridad 4 en el rbol de
la figura 4.20. Si el nuevo elem ento tiene una prioridad ms baja que la de su padre,
se intercam bia con l. El nuevo elemento queda entonces en una posicin de m enor
prioridad que cualquiera de sus hijos, pero puede ser tam bin que tenga m enor prio
ridad que su padre, en cuyo caso se debe intercam biar con l y repetir el proceso has
ta que el nuevo elem ento llegue hasta la raz o alcance una posicin en la que tenga
m ayor prioridad que su padre. La figura 4.22(b) y (c) m uestra el ascenso de 4 en
este proceso.

www.FreeLibros.me

143

REALIZACIONES DE COLAS DE PRIORIDAD

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.

a es el nuevo elem ento y asciende en el rbol reem plazando al padre anterior


de b. Sea c la prioridad del padre anterior de b. Entonces, a < c, de otro modo,
el intercam bio no habra tenido lugar. Pero c < b, puesto que el rbol original
estaba parcialm ente ordenado. Por tanto, a < b. Tmese como ejem plo la figu
ra 4.22(c), donde 4 se convierte en el padre de 6 despus de reem plazar a un pa
dre de mayor prioridad, 5.
a fue desplazado hacia abajo en el rbol debido a un intercam bio con el nuevo
elemento. En este caso, a tiene que haber sido un antecesor de b en el rbol par
cialmente ordenado original. Por tanto, a < b. Por ejemplo, en la figura 4.22(c),
5 se convierte en el padre de los elem entos con prioridad 8 y 9. Originalmente,
5 era el padre del prim ero y el abuelo del segundo.
b sera el nuevo elem ento y asciende hasta ser un hijo de a. Si ocurriera que
a > b, entonces a y b se intercam biaran en el siguiente paso, con lo que se eli
m inara la violacin de la propiedad parcialm ente ordenada.

6
10

9
8

10

18

10

10

18
(b)
9

10

18

(c)
Fig. 4.21.

Descenso de un elemento en un rbol.

www.FreeLibros.me

10

144

OPERACIONES BASICAS CON CONJUNTOS

/ \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.

El tiem po necesario para efectuar una insercin es proporcional a la distancia


que el elem ento asciende en el rbol. Com o en el caso de SU PRIM E-M IN , se ob
serva que esta distancia tal vez no sea m ayor que 1 + logn, de modo que tanto IN
SERTA como SUPRIM E MIN dan O (logn) pasos.

Realizacin por arreglos de los rboles parcialmente ordenados


El hecho de que los rboles que se han estado considerando sean binarios, lo ms
balanceados posible, y tengan sus hojas del nivel ms bajo lo ms a la izquierda po
sible, perm itir utilizar para ellos una representacin poco usual, conocida como
montculo (heap). De haber n nodos, se usan las n prim eras posiciones de un arre
glo A. A[ 1] contiene la raz. El hijo izquierdo del nodo A[i], si existe, est en A[2i],
y el hijo derecho, si existe, en A[2i + 1). U na m anera equivalente de expresar esto
es decir que el padre de A[i] es A[i div 2], para / > 1. O tra observacin, tam bin equi
valente, es que los nodos del rbol llenan A[ 1], A[2) , ..., A[n] nivel a nivel, desde arri
ba, y de izquierda a derecha dentro de cada nivel. Por ejemplo, la figura 4.20 corres
ponde a un arreglo que contiene los elem entos 3, 5, 9, 6, 8, 9, 10, 10, 18, 9.
Se puede declarar una cola de prioridad con elementos de cierto tipo, como tipo_proceso del ejemplo 4.9, como un arreglo de tipos tipo_proceso y un entero lt que
indica cul es el ltimo elem ento de un arreglo que en un m omento dado est en
uso. Si se supone que ta m ^m x es el tam ao deseado para los arreglos de colas de
prioridad, se puede declarar:
type

COLA_DE_PRIORIDAD - record
contenido-. array[l../am_m<x] of tipo-proceso;
lt: integer
end;

La realizacin de las operaciones con colas de prioridad se puede ver en la figu


ra 4.23.

www.FreeLibros.me

REALIZACIONES DE COLAS DE PRIORIDAD

145

procedure ANULA ( var A: COLA_DE_PRIORIDAD );


begin

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

error{'la cola de prioridad est llena)


else begin

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 |

function SU PR IM E.M IN ( var A: COLA_DE_PRIORIDAD ) : f tipo.proceso;


var

i.
j: integer;
temp: tipo.proceso;
m nim o: tipo_proceso;
begin
if A.lt - 0 then

error{'la cola de prioridad est vaca)


else begin

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

OPERACIONES BASICAS CON CONJUNTOS

while i < - A.lt div 2 do begin

! lleva hacia abajo el anterior ltim o elemento


en el rb o l!
if (p(A.contenido[2*i\) < p(A.contenido[2*i + 1]))
or (2*11- A.lt) then
j :- 2*i
else

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

Realizacin de colas de prioridad mediante arreglos.

Algunas estructuras complejas de conjuntos

En esta seccin se considerarn dos usos ms complejos de los conjuntos para re


presentar datos. El prim er problem a ser el de representar asociaciones de muchos
a muchos, como las que pueden presentarse en un sistema de bases de datos. Un se
gundo caso de estudio m ostrar cmo un par de estructuras de datos que represen
tan el mismo objeto (una correspondencia en el ejemplo que se analizar), pueden
d ar una representacin ms eficiente que cualquiera de ellas por separado.

Asociaciones de muchos a muchos y la estructura de listas mltiples


Un ejemplo de asociacin de muchos a muchos entre estudiantes y cursos est re
presentada en la figura 4.24. Esta asociacin se llama de muchos a muchos por
que puede haber m uchos estudiantes que tomen un curso y cada estudiante puede
tom ar m uchos cursos.

www.FreeLibros.me

ALGUNAS ESTRUCTURAS COMPLEJAS DE CONJUNTOS

Alan
Alejandro
Alicia
Amanda
Andrs
Anglica

CS101

CS202

147

CS 303
X
X

X
X
X

X
X

Inscripcin
Fig. 4.24.

Ejemplo de relacin entre estudiantes y cursos.

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

OPERACIONES BASICAS CON CONJUNTOS

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)

I e est tom ando el curso c}.

De la m isma m anera, se puede definir


E: = {(*, c) I e est tom ando el curso c|.
Obsrvese que la nica diferencia en el significado de las propiedades de estos dos
conjuntos es que, en el prim er caso, e es constante, y en el segundo lo es c. Por ejem
plo, con base en la figura 4.24,
= {(Alejandro, CS101), (Alejandro, CS202))
Y ^ csioi {(Alejandro, C S 101), (Amanda, CS101), (Anglica, CS101)}.

Estructuras de listas mltiples


En general, una estructura de listas m ltiples es cualquier coleccin de celdas, don
de algunas contienen m s de un apuntador y pueden, por tanto, pertenecer a ms
de una lista a la vez. Para cada tipo de celda de una estructura de listas mltiples,
es im portante distinguir entre los campos apuntadores, de modo que se pueda set En la prctica, seria til colocar algunos cam pos, c o m o calificaciones y otros, en los registros d e ins
cripcin, pero el planteam iento original del problema no los requiere.

www.FreeLibros.me

ALGUNAS ESTRUCTURAS COMPLEJAS DE CONJUNTOS

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.

Representacin de la figura 4.24 con listas mltiples.

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

OPERACIONES BASICAS CON CONJUNTOS

Para responder a una pregunta como qu estudiantes toman el cur


so C S 101?, se busca el registro de curso correspondiente a CS101. Cmo encontrar
este registro depende de la form a en que se m antiene el conjunto de cursos. Por ejem
plo, podra haber una tabla de dispersin que tuviera todos esos registros, y para
obtener el registro deseado se aplicara cierta funcin de dispersin a CS101.
Luego se sigue el apuntador del registro de CS101 al prim er registro de inscrip
cin del anillo de CS101. Este es, en la figura, el segundo registro de inscripcin des
de la izquierda. Despus, hay que buscar al estudiante propietario de este registro
de inscripcin, lo cual se logra siguiendo los apuntadores c s i g (el primero en los re
gistros de inscripcin), hasta llegar a un registro de estudiantes f- En este caso, des
pus del tercer registro de inscripcin se llega al registro de estudiante para Alejan
dro; ahora se sabe que Alejandro est tom ando el curso CS 101.
A continuacin, se debe encontrar el siguiente estudiante CS 101, y se hace si
guiendo el apuntador e s i g (el segundo apuntador) del segundo registro de inscrip
cin, el cual conduce al quinto registro de inscripcin. El apuntador c s i g de ese re
gistro conduce directam ente a su propietario, Amanda, de modo que ella est en el
curso CS101. Por ltimo, se sigue el apuntador e s i g del quinto registro de inscrip
cin hasta el octavo. El anillo de apuntadores c s i g de ese registro conduce al no
veno registro de inscripcin, y de ah, al registro de estudiante de Anglica, de modo
que ella est inscrita en CS101. El apuntador e s i g del octavo registro de inscrip
cin conduce de vuelta a CS101, por tanto no hay m s estudiantes inscritos en
CS101.
Ejemplo 4.11.

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

Esta asignacin a e se puede expresar como


/ > e-,
repeat
/ : - / ) . c s ig
until

/ es un apuntador a un registro de estudiante;


cam po nom bre-estudiante del registro apuntado p o r/,

donde e es un apuntador al prim er registro de inscripcin en el conjunto para CS 101.


Para aplicar una estructura como la de la figura 4.25 en Pascal, se necesita un
solo tipo de registro, con variantes para cubrir los casos de registros de estudiantes,

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

ALGUNAS ESTRUCTURAS COMPLEJAS DE CONJUNTOS

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.

Estructuras de datos duales para mayor eficiencia


Con frecuencia, un problem a aparentem ente simple de representacin de un conjun
to o correspondencia, conlleva un difcil problem a de eleccin de estructuras de d a
tos. La eleccin de una estructura de datos para el conjunto simplifica ciertas ope
raciones, pero hace que otras lleven dem asiado tiempo, y, al parecer, no existe una
estructura de datos que haga ms sencillas todas las operaciones. En tales casos, la
solucin suele ser el uso sim ultneo de dos o m s estructuras diferentes para el mis
mo conjunto o correspondencia.
Supngase que se desea m antener una escala de tenistas en la que cada juga
dor est situado en un solo peldao. Los jugadores nuevos se agregan en la base
de la escala, es decir, en el peldao con la num eracin ms alta. Un jugador puede
retar a otro que est en el peldao inm ediato superior, y si le gana, cam bia de pel
dao con l. Se puede representar esta situacin m ediante un tipo de datos abstrac
to cuyo modelo fundamental sea una correspondencia de nombres (cadenas de ca
racteres) con peldaos (los enteros 1, 2, ...).
Las tres operaciones a realizar son:
\G R E G A(nombre) agrega a la persona nom brada al peldao de num eracin ms
alta.
2. RETA (nombre) es una funcin que devuelve el nom bre de la persona del pelda
o i - 1 si el jugador nom brado est en el peldao / > 1.
3. CAMBIA(j) intercam bia los nom bres de los jugadores que estn en los peldaos
i e / - 1, i > 1.
1.

type

tipo_e - array[1..20] of char;


tipo_c - array[1..5] of char;
clase_registro - ( estudiante, curso, inscripcin)-,
tipo_registro - record
case clase: clase_registro of
estudiante: (nombre-estudiante. tipo_e;
primer.curso: ttipo_registro);
curso: {nombre.curso: tipo_c;
primer.estudiante. tipo_registro);
inscripcin: (c .jig , e^ig-. tipo_registro)
end;

www.FreeLibros.me

152

OPERACIONES BASICAS CON CONJUNTOS

procedure imprime-estudiantes ( nombre-C. tipo_c );


var

c, e, f. tipo_registro;
begin

c : - apuntador al registro de curso con c t .nombre-curso - nombre-c,


I depende de la aplicacin del conjunto curso |
e c \ .primer-estudiante,
| e recorre el anillo de inscripciones apuntadas por c (
while e t .clase - inscripcin do begin
f:-e ,
repeat

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.

Realizacin de una bsqueda en una lista mltiple.

Obsrvese que se ha elegido pasar a CAMBIA slo el nm ero de peldao ms alto,


m ientras que las otras dos operaciones tienen un nom bre como argumento.
Com o alternativa, se podra considerar el uso de un arreglo ESCALA, en la que
ESCALA[i] sea el nom bre de la persona del peldao /. Si adem s se lleva la cuenta
del nm ero de jugadores, la adicin de un jugador al prim er peldao desocupado se
puede hacer en un pequeo nm ero constante de pasos.
CAMBIA tam bin es fcil, puesto que slo hay que intercam biar dos elementos
del arreglo, pero RETA (nombre) requiere exam inar todo el arreglo en busca del
nombre, lo cual lleva un tiem po 0(n), si n es el nm ero de jugadores en la escala.
Por otra parte, se podra considerar el uso de una tabla de dispersin para
representar la correspondencia de nom bres a peldaos. En el supuesto de que es po
sible m antener el nm ero de cubetas proporcional al nm ero de jugadores, AGRE
GA llevara en prom edio un tiem po 0(1). A un reto le llevara un tiem po promedio
0(1) buscar el nom bre dado, un tiem po 0 (n ) encontrar el nom bre que ocupa el pel
dao con el siguiente nm ero ms bajo, dado que para eso se necesitara buscar en
toda la tabla de dispersin. El intercam bio de jugadores requerira un tiempo
0 (n ) para hallar los jugadores en los peldaos i t i - 1.
Supngase, sin embargo, que se com binan las dos estructuras. Las celdas de la
tabla de dispersin contendrn pares com puestos de un nom bre y un peldao,
m ientras que el arreglo tendr en ESCALA[i\ un apuntador a la celda correspondien
te al jugador que ocupe el peldao i. como se sugiere en la figura 4.27.

www.FreeLibros.me

EJERCICIOS

153

de cubetas
Fig. 4.27.

Estructura combinada para alto rendimiento.

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

Si A - (l, 2, 3} y B - 3. 4, 5(, cules son los resultados de


a)
b)
c)
d)
e)
O
g)

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

OPERACIONES BASICAS CON CONJUNTOS

*4.2

Escrbase un procedimiento en funcin de las operaciones bsicas con con


juntos que imprim a todos los elementos de un conjunto (finito). Puede su
ponerse que se dispone de un procedimiento para imprim ir un objeto del
tipo de los elementos. El conjunto a im prim ir no debe quedar destruido.
Qu estructuras de datos seran las ms apropiadas para implantar conjuntos
en este caso?

4.3

La realizacin de conjuntos mediante vectores de tyts se puede usar siem


pre que el conjunto universal se pueda traducir a los enteros de 1 a N.
Descrbase cmo se hara esa traduccin si el conjunto universal fuera
a)
b)
c)
d)
e)

los enteros 0, 1, ..., 99


los enteros d e n a m para cualquier n < m
los enteros n, n +2, n + 4, ..., n + 2k, para cualesquiera n y k
los caracteres a, b \ ..., z
arreglos de dos caracteres, cada uno de ellos elegidos entre 'a ' y z \

4.4

Escrbanse procedimientos ANULA, UNION, INTERSECCION, MIEM


BRO, MIN, INSERTA y SUPRIME para conjuntos representados median
te listas enlazadas, por medio de las operaciones abstractas del TDA lista
clasificada. Obsrvese que la figura 4.5 es un procedimiento para INTER
SECCION que maneja una realizacin especfica del TDA lista.

4.5

Reptase el ejercicio 4.4 para las realizaciones de conjuntos siguientes:


a) tabla de dispersin abierta (sense operaciones abstractas con listas den
tro de las cubetas).
b) tabla de dispersin cerrada con resolucin lineal de colisiones.
c) lista no clasificada (emplense operaciones abstractas con listas).
d) un arreglo de longitud fija con un apuntador a la ltima posicin usada.

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

Supngase que se estn dispersando enteros en una tabla de dispersin de


siete cubetas sirvindose de la funcin de dispersin h(i) = i mod 7.
a) Mustrese la tabla de dispersin abierta si se insertan los cubos perfec
tos 1, 8, 27, 125, 216, 343.
b) Reptase el apartado a) usando una tabla de dispersin cerrada con re
solucin lineal de colisiones.

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

Obtnganse las operaciones del TDA correspondencia, con tablas de disper


sin abiertas y cerradas.

www.FreeLibros.me

EJERCICIOS

155

4.10

Para m ejorar la velocidad de las operaciones podra desearse reem plazar


una tabla de dispersin abierta con B cubetas con m s de B elem entos por
otra tabla de dispersin con B2 cubetas. Escrbase un procedim iento para
construir la nueva tabla a partir de la anterior, usando las operaciones del
TDA lista para procesar cada cubeta.

4.11

En la seccin 4.8 se habl de las funciones de dispersin aleatorias para


las cuales h,(X), la cubeta en la que se va a probar despus de i colisiones,
es (h(x) + d,) mod B para cierta sucesin ,, d2, ..., dB_. Tam bin se sugiri
que una m anera de calcular una sucesin sem ejante apropiada era elegir
una constante k, y un
> 0 arbitrario, y hacer
^

2d,_i

si 2dhl < B

(2dhl- B ) k

si 2rf(_, > B

donde i > 1, B es una potencia de 2, y representa la suma mdulo 2 bit


a bit. Si B - 16, encuntrense los valores de k para los cuales la sucesin ,,
d2, ..., 15 incluye todos los enteros entre 1 y 15.
4.12

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.13 Supngase que se representa el conjunto de cursos m ediante

a) una lista enlazada


b) una tabla de dispersin
c) un rbol binario de bsqueda.
Modifiqense las declaraciones de la figura 4.26 para cada una de estas es
tructuras.
4.14 Modifiqese la estructura de datos de la figura 4.26 de modo que cada re

gistro de inscripcin tenga un apuntador directo al estudiante y curso pro


pietarios. Escrbase otra vez el procedim iento im prim e-estudiantes de la fi
gura 4.26, aprovechando esta estructura.
4.15

Supngase que hay 20 000 estudiantes, 1000 cursos y cada estudiante en


un prom edio de tres cursos; comprese la estructura de datos de la figura
4.26 con la modificacin sugerida en el ejercicio 4.14 en lo referente a
a) la cantidad de espacio requerida
b) el tiem po prom edio de ejecucin de im prim e-estudiantes
c) el tiem po prom edio de ejecucin del procedim iento anlogo que im pri
ma los cursos que tom a un estudiante dado.

4.16

Considrese la estructura de datos de la figura 4.26, dado un registro de cur


so c y un registro de estudiante e y escrbanse procedimientos para insertar
y suprim ir el hecho de que e tom a c.

www.FreeLibros.me

156

OPERACIONES BASICAS CO N C O NJUN TO S

4.17

Si existe, cul es la diferencia entre la estructura de datos del ejercicio 4.14


y la estructura en la que los conjuntos Ce y Ec se representan mediante lis
tas de apuntadores a los registros de cursos y estudiantes, respectivamente?

4.18

Los empleados de cierta compaa se representan en la base de datos de la


com paa por su nom bre (que se supone nico), nm ero de empleado y n
mero de seguridad social. Sugirase una estructura de datos que permita,
dada una representacin de un empleado, encontrar las otras dos represen
taciones del mismo individuo. Qu rpida, en prom edio, puede lograrse
que sea cada una de esas operaciones?

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

Arboles binarios de bsqueda

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

METODOS AVANZADOS DE REPRESENTACION DE CONJUNTOS

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.

Se escribir una funcin recursiva simple MIEMBRO(x, A) para realizar esta


prueba de pertenencia. Se supondr que los elem entos del conjunto son de un tipo
no especificado que se denom inar tipo_elemento. Por conveniencia, se supone que
tipo_elem ento es un tipo para el cual estn definidos < e =. Si no es as, se deben de
finir las funciones MQ(a, b) e IG(a, b). donde a y b son del tipo tipo-elem ento, tal
que MQ(a, b) es cierto si, y slo si, a es m enor que 6, e lG(a, b) es cierto si, y slo
si, a y b son iguales.
El tipo de los nodos consta de un elem ento y dos apuntadores a otros nodos:
ty p e

tipo_nodo = reco rd
elemento: tipo-elem ento;
hijo-izq, hijo-der. t tipo_nodo
end;

Entonces es posible definir el tipo CO N JU N TO como un apuntador a un nodo, que


aqu ser la raz del rbol binario de bsqueda que representa el conjunto. Esto es:
ty p e

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

ARBOLES BINARIOS DE BUSQUEDA

159

mos, MIEMBRO puede llamarse a s m ism o en subrboles, como si stos represen


taran conjuntos. De hecho, el conjunto puede dividirse en el subconjunto de los
miembros menores que x y en el subconjunto de los m iem bros mayores que x.
function MIEMBRO ( x: tipo_elem ento; A: CO N JU N TO ) : boolean;
I devuelve verdadero si x est en A, y falso en caso contrario I
begin
if A - nil then
return (false) I x nunca est en 0 I
else if x - A \.elem ento then
return (true)
else if x < A\.elem ento then
return (MIEMBRO(x, A \.hijo.izq))
else I x > Al.elem ento I
return (MIEMBRO(x, A\.hijo-der))
end; I M IE M B R O !
FO- 5-2.

Prueba de pertenencia en un rbol binario de bsqueda.

El procedimiento INSERTA(x, A ), que agrega un elem ento x al conjunto A , tam


bin es fcil de escribir. La prim era accin que INSERTA debe efectuar es probar
si A = nil, esto es, si el conjunto est vaco. De ser as, se crea un nodo nuevo para
colocar x y hacer que A le apunte. Si el conjunto no est vaco, se busca x ms o
menos como lo hace MIEMBRO, pero al encontrar un apuntador nil durante la bs
queda, se reemplaza por un apuntador a un nodo nuevo que contenga x. Entonces x
estar en el lugar correcto, esto es, donde la funcin MIEMBRO lo encuentre. El c
digo de INSERTA se m uestra en la figura 5.3.
procedure INSERTA ( x: tipo_elem ento; var A: C O N JU N TO );
I agrega x al conjunto A |
begin
if A - nil then begin
new(A);
A],elem ento
x
A \.h ijo -izq
nil;
A \ . h i j o - d e r nil
end
else if x < A\.elem ento then
INSERTA(x, A \.hijo-izq)
else if x > A \.elem ento then
INSERTAfx, A\.hijo-der)
I if x - A],elemento, no se hace nada; x ya est en el conjunto )
end; 1 INSERTA
Fig. 5.3.

Insercin de un elemento en un rbol binario de bsqueda.

www.FreeLibros.me

160

M ETODOS AVANZADOS DE REPRESENTACION DE CO NJUN TO S

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;

I devuelve y elim ina el elem ento ms pequeo del conjunto A !


beg in
if A \.hijO -izq = n il th e n b e g in

IA apunta al elem ento ms pequeo 1


SU PRIM E_M IN
A\.elemento-,
A
A\.hijO-der,
I reemplaza el nodo apuntado por A por su hijo derecho 1
end
e ls e | el nodo apuntado por A tiene un hijo izquierdo I

SU PRIM E_M IN

SU PRIM E_M IN (/!t./i// 0_/ztf)

en d ; I SU PR IM E-M IN |

Fig. 5.4.

Eliminacin del elemento ms pequeo.

p ro c e d u re SUPRIM E ( x: tipo_elem ento; v a r A: CO N JU N TO );

I elim ina x del conjunto A I


beg in
if A < > n il th e n
if x < A \.elem ento th e n

SUPRIM E(x, A \.hijo-izq)


e ls e if x > A\.elem ento th e n

SUPRIM E(x, A \.hijo-der)


si se llega aqu, x es el nodo apuntado por A |
e lse if (A \.hijo-izq - n il) a n d (A].hijo-der - n il) th e n
A
n il | suprim e la hoja que contiene a x (
e ls e if A \.h ijo -izq - n il th e n
A
A].hijo-der
t Puede ser tam bin el nodo con valor m s alto entre los descendientes del hijo izquierdo.

www.FreeLibros.me

ANALISIS EN TIEM PO DE LAS OPERACIONES PARA ARBOLES BINARIOS DE BU SQU EDA

161

else if A \.hijo-der = nil then


A
A \.h ijo -izq
else i am bos hijos estn presentes i
A ] . e l e m e n t o SUPRIME_MIN(/lT./j//o-ter)
end; | SUPRIM E I
Fig. 5.5.

Eliminacin en un rbol binario de bsqueda.

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

Arbol de la figura 5.1 (a) despus de suprim ir 10.

Anlisis en tiem po de las operaciones para rboles binarios


de bsqueda

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

M ETODOS AVANZADOS DE REPRESENTACION DE CO NJUN TO S

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.

Arbol binario de bsqueda.

www.FreeLibros.me

ANALISIS EN TIEM PO DE LAS OPERACIONES PARA ARBOLES BINARIOS DE BUSQUEDA

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

El ltimo paso est justificado, ya que

i < nzl 2 y, por tanto el ltim o trm ino

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

METODOS AVANZADOS DE REPRESENTACION DE CONJUNTOS

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.

Evaluacin del rendimiento de los rboles binarios de bsqueda


Las realizaciones de diccionarios por m edio de tablas de dispersin requieren un
tiem po constante por operacin en prom edio. Aunque este rendim iento es mejor
que el de un rbol binario de bsqueda, una tabla de dispersin requiere 0(n) pasos
para la operacin M IN; as, si M IN se usa con frecuencia, el rbol binario de bs
queda ser la mejor opcin; si MIN no se usa, tal vez sera preferible la tabla de dis
persin.
El rbol binario de bsqueda debe com pararse tam bin con el rbol parcialmen
te ordenado empleado para las colas de prioridad del captulo 4. Un rbol parcial
mente ordenado con n elem entos requiere slo 0(\ogn) pasos para cada operacin
INSERTA y SU PR IM E-M IN no slo en el prom edio, sino tam bin en el peor caso.
Ms an, la constante real de proporcionalidad que acom paa al factor logn ser
ms pequea para un rbol parcialm ente ordenado que para un rbol binario de bs
queda. Sin embargo, este ltim o permite las operaciones generales SUPRIM E y
MIN, as como la combinacin SUPRIM E_M IN, m ientras que el rbol parcialm en
te ordenado slo permite la ltim a. Adems, MIEMBRO requiere 0(n ) pasos en un
rbol parcialm ente ordenado, pero slo 0(logn) pasos en un rbol binario de bs
queda. As, m ientras que el rbol parcialm ente ordenado es adecuado para realizar
colas de prioridad, no puede efectuar de form a tan eficiente ninguna de las ope
raciones adicionales que el rbol binario de bsqueda puede hacer.

www.FreeLibros.me

TRIES

5 .3

165

Tries

En esta seccin se presenta una estructura especial para representar conjuntos de ca


denas de caracteres. El mismo mtodo funciona para la representacin de tipos de
datos que son cadenas de objetos de cualquier tipo, como las cadenas de enteros.
Esta estructura se conoce como trie, derivada de las letras centrales de la palabra retrieval (recuperacin) t- A m anera de introduccin, considrese el siguiente uso de
un conjunto de cadenas de caracteres.
Ejemplo 5.2.

Com o se indic en el captulo 1, una form a de im plantar un revisor de


ortografa es leer un archivo de texto, separarlo en palabras (cadenas de caracteres
separados por espacios y caracteres de nueva lnea) y encontrar las palabras que no
estn en un diccionario estndar de palabras de uso comn. Las palabras que estn
en el texto, pero no en el diccionario, se im prim en como posibles faltas de ortogra
fa. La figura 5.8 muestra el esbozo de un posible programa orto. Este utiliza un pro
cedim iento toma~palabra(x, t) que asigna a x la siguiente palabra en el archivo de
texto /; la variable x es del tipo llamado tipo-palabra, que se define ms adelante.
La variable A es de tipo CONJUNTO; las operaciones necesarias sobre C O N JU N
TO son INSERTA, SUPRIM E, ANULA e IMPRIME. El operador IM PRIM E im
prime los miembros del conjunto.
program orto ( inpul, output, diccionario );
type

tipo_palabra - | a definir 1
CO N JU N TO - | a definir m ediante la estructura de trie i;
var

A: CON JUN TO ; retiene las palabras de entrada no encontradas


en el diccionario
siguiente-palabra: tipo.palabra;
diccionario: file of char;
procedure toma-palabra ( var jc tipo_palabra; f: file of char );

I procedim iento a definir que hace que x


sea la siguiente palabra en el archivo / i
procedure INSERTA ( x: tipo_palabra; var A: CO N JU N TO );

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

M ETODOS AVANZADOS DE REPRESENTA CION DE CO NJUN TO S

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.

Esbozo de revisor de ortografa.

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.

Cada nodo tiene hasta 27 hijos, uno para cada letra y $.


La m ayor parte de los nodos tiene mucho menos de 27 hijos.
U na hoja que sigue a una arista etiquetada con $ no puede tener hijos e incluso
podra no existir.

Nodos de un trie como TDA


Un nodo de trie puede considerarse como una correspondencia cuyo dom inio es
Ia , B, .... Z, $ (o cualquier alfabeto que se escoja) y cuyo conjunto de valores es de
tipo apuntador a nodo de trie. Ms an, el trie m ismo puede identificarse con su
propia raz, por lo que los TDA TRIE y N O D O -T R IE tienen el m ismo tipo de da
tos, aunque sus operaciones son sustancialmente diferentes. En un N O D O -T R IE ,
se necesitan las operaciones siguientes:
procedimiento ASIGNA(nofo, c, p ) que asigna el valor p (un apuntador a un
nodo) al carcter c de nodo.
2. funcin VALOR_DE(nofo, c) que produce el valor asociado con el carcter c de
nodo t , y
3. procedimiento TOMA_NUEVO(o/o, c) para hacer que el valor de nodo para
el carcter c apunte a un nodo nuevo.
1.

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.

t V A L O R _D E es u n a v e rsi n d e la fu n ci n C A L C U L A de la seccin 2.5.

www.FreeLibros.me

168

M ETODOS AVANZADOS DE REPRESENTACION DE CO NJUN TO S

procedure ANULA ( var nodo: NODO_TRIE );

I hace de nodo una hoja, es decir, una correspondencia nula }


var

c. char;
begin
for c

'A ' to '$ ' do


nodo[c] := nil
end; iANULA }

procedure ASIGNA ( var nodo: N O D O -T R IE ; r. char; p: fNODO_TRIE );


begin

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.

Operaciones en nodos de un trie.

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

i: integer; I cuenta las posiciones en la palabra x


/: TRIE; 1empleado para apuntar a nodos del trie que corresponden
a los prefijos de x I

www.FreeLibros.me

TRIES

169

begin

i
/

1;
palabras;

while x[i] < > '$ do begin


if VALOR_DE(/t, x(/]) = nil then

I si el nodo actual no tiene hijo para el carcter jc[/], crea uno !


TOM A_NUEVO(ft, *(/]);
VALOR_DE(/f, jcfiJ);
I prosigue al hijo de para
el carcter jc(/], sin im portar si
ese hijo fue creado o no (
/+1 I se mueve en la palabra x )

end;

I ahora se ha alcanzado el prim er '$ en x (


ASIGNA(t, '$ , t)
i hace un ciclo para '$ para representar una hoja I
end; I INSERTA 1
Fig. 5.11.

Procedimiento INSERTA.

Representacin de nodos de un trie por medio de listas


La representacin de nodos de un trie m ediante
arreglos tom a
una coleccin de pa
labras, teniendo en ellas p diferentes prefijos, y las representa con 21p bytes de al
macenamiento. Esta cantidad de espacio puede exceder con facilidad la longitud to
tal de las palabras del conjunto. Sin embargo, existe otra realizacin de tries que pue
de ahorrar espacio. Recurdese que cada nodo del trie es una correspondencia, como
se expuso en la seccin 2.6. En principio, cualquier im plantacin de correspon
dencias puede funcionar, pero en la prctica se desea una representacin adecuada
para correspondencias con un dom inio pequeo y para las definidas por relativa
mente pocos m iem bros del dom inio. La representacin con listas enlazadas satisfa
ce en buena m edida esos requisitos. Se puede representar una correspondencia, que
es un nodo de un trie, por m edio de una lista enlazada de caracteres para la cual el
valor asociado no es el apuntador nil. O sea, un nodo de un trie es una lista enlaza
da de celdas de tipo
type

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

M ETODOS AVANZADOS DE REPRESENTACION DE CO NJUN TO S

cedimientos, las operaciones sobre tries como INSERTA, de la figura 5.11, y otras
que quedaron como ejercicios, deben funcionar correctamente.

Evaluacin de la estructura de datos trie


Com prense el tiem po y el espacio necesarios para representar n palabras con un to
tal de p prefijos diferentes y una longitud total I usando una tabla de dispersin
y un trie. En lo que sigue, se supondr que los apuntadores requieren cuatro bytes.
Quizs el medio ms eficaz en cuanto al espacio para alm acenar palabras y al ma
nejo de las operaciones INSERTA y SUPRIM E sea una tabla de dispersin. Si las
palabras son de longitud variable, las celdas de las cubetas no deben contener las pa
labras mismas, sino que deben constar de dos apuntadores, uno para enlazar entre
s las celdas de la cubeta y otro para apuntar al principio de la palabra que pertenece
a la cubeta.
Las palabras mismas se almacenan en un gran arreglo de caracteres, y el fin de
cada palabra se indica por m edio de un carcter de fin como
Por ejemplo, las
palabras THE, THEN, y T H IN pueden alm acenarse como
THE$THEN$THIN$...
Los apuntadores de las tres palabras son cursores a las posiciones 1, 5 y 10 del arre
glo. La cantidad de espacio utilizado en las cubetas y el arreglo de caracteres es
1.
2.

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.

As, el espacio total es 9n + I bytes ms la cantidad empleada para los encabezamientos


de las cubetas.
En com paracin, un trie con nodos aniirados or m edio de listac e n c a d a *

www.FreeLibros.me

C:

C
slevel-

www.FreeLibros.me

[200|

Grafos dirigidos

En los problem as originados en ciencias de la com putacin, matemticas, ingeniera


y muchas otras disciplinas, a m enudo es necesario representar relaciones arbitrarias
entre objetos de datos. Los grafos dirigidos y los no dirigidos son modelos naturales
de tales relaciones. Este captulo presenta las estructuras de datos bsicas que pue
den usarse para representar grafos dirigidos. Tam bin se presentan algunos algorit
mos bsicos para la determ inacin de conectividad en grafos dirigidos y para en
contrar los caminos ms cortos.

6 .1

Definiciones fundamentales

Un grafo dirigido G consiste en un conjunto de vrtices V y un conjunto de arcos


A. Los vrtices se denom inan tam bin nodos o puntos; los arcos pueden llamarse ar
cos dirigidos o lineas dirigidas. Un arco es un par ordenado de vrtices (v. w); v es
la cola y w la cabeza del arco. El arco (v, w) se expresa a m enudo como v w y se
representa como

Obsrvese que la punta de la flecha est en el vrtice llamado cabeza, y la cola,


en el vrtice llamado cola. Se dice que el arco v w va de v a w, y que w es ad
yacente a v.
Ejemplo 6.1.

La figura 6.1 muestra un grafo dirigido con cuatro vrtices y cinco ar

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

REPRESENTACIONES DE GRAFOS D IRIG ID OS

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.

En un grafo dirigido etiquetado, un vrtice puede tener a la vez un nombre y


una etiqueta. A m enudo se em plear la etiqueta del vrtice como si fuera el nombre.
As, los nmeros de la figura 6.2 pueden interpretarse como nombres o como eti
quetas de vrtices.

6 .2

Representaciones de grafos dirigidos

Para representar un grafo dirigido se pueden em plear varias estructuras de datos; la


seleccin apropiada depende de las operaciones que se aplicarn a los vrtices y a
los arcos del grafo. Una representacin comn para un grafo dirigido G - {V, A) es
la m atriz de adyacencia. Supngase que V - |l , 2, ..., n\. La m atriz de adyacencia
para G es una m atriz A de dimensin n x n . d e elem entos booleanos, donde A[i,j] es
verdadero si, y slo si, existe un arco que vaya del vrtice i al j. Con frecuencia se
exhibirn matrices de adyacencias con 1 para verdadero y 0 para falso; las matrices
de adyacencias pueden incluso obtenerse de esa forma. En la representacin con una

www.FreeLibros.me

202

GRAFOS DIRIGIDOS

m atriz de adyacencia, el tiem po de acceso requerido a un elem ento es independien


te del tam ao de V y A. As. la representacin con m atriz de adyacencia es til en
los algoritmos para grafos, en los cuales suele ser necesario saber si un arco dado
est presente.
a

Grafo dirigido de transiciones.

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.

Matriz de adyacencia etiquetada para el grafo dirigido de la figura 6.2.

La principal desventaja de usar una m atriz de adyacencia para representar un gra


fo dirigido es que requiere un espacio 2(n2) aun si el grafo dirigido tiene menos de
n2 arcos. Slo leer o exam inar la m atriz puede llevar un tiem po 0 (n 2), lo cual inva
lidara los algoritmos 0(n) para la m anipulacin de grafos dirigidos con 0(n) arcos.
Para evitar esta desventaja, se puede utilizar otra representacin comn para un
grafo dirigido G - ( V , A) llamada representacin con lista de adyacencia. La lista
de adyacencia para un vrtice i es una lista, en algn orden, de todos los vrtices
adyacentes a i. Se puede representar G por m edio de un arreglo CABEZA, donde
CABEZA[i] es un apuntador a la lista de adyacencia del vrtice i. La representa
cin con lista de adyacencia de un grafo dirigido requiere un espacio proporcional
a la suma del nm ero de vrtices m s el nm ero de arcos; se usa bastante cuando

www.FreeLibros.me

REPRESENTACIONES DE GRAFOS D IRIG ID O S

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

Representacin con lista de adyacencia para el grafo dirigido


de la figura 6.1

Si hubo inserciones y supresiones en las listas de adyacencias, sera preferible te


ner el arreglo CABEZA apuntando a celdas de encabezamiento que no contienen vrti
ces adyacentes f. Por otra parte, si se espera que el grafo permanezca fijo, sin cam
bios (o con muy pocos) en las listas de adyacencias, sera preferible que CABEZA[i]
fuera un cursor a un arreglo ADY, donde AD Y\CABEZA[i\\, ADY[CABEZA[\ + 1],
..., y as sucesivamente, contuvieran los vrtices adyacentes al vrtice hasta el pun
to en A D Y donde se encuentra por prim era vez un cero, el cual marca el fin de la
lista de vrtices adyacentes a i. Por ejemplo, la figura 6.1 puede representarse con
la figura 6.5.

TDA grafo dirigido


Se podra definir un TDA que correspondiera form alm ente al grafo dirigido y estu
diar las im plantaciones de sus operaciones. No se redundar dem asiado en esto, por
que hay poco material en verdad nuevo y las principales estructuras de datos para
grafos ya han sido cubiertas. Las operaciones ms comunes en grafos dirigidos in
cluyen la lectura de la etiqueta de un vrtice o un arco, la insercin o supresin de
vrtices y arcos, y el recorrido de arcos desde la cola hasta la cabeza.
Las ltim as operaciones requieren ms cuidado. Con frecuencia, se encuentran
en proposiciones informales de program as como
for cada vrtice w adyacente al vrtice v do

lalguna accin sobre w|

(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 .

Otra representacin con lista de adyacencia


de la figura 6.1.

Para obtener esto, es necesaria la nocin de un tipo ndice para el conjunto de vr


tices adyacentes a algn vrtice v. Por ejemplo, si las listas de adyacencias se usan
para representar el grafo, un ndice es, en realidad, una posicin en la lista de adya
cencia de v. Si se usa una m atriz de adyacencia, un ndice es un entero que repre
senta un vrtice adyacente. Se requieren las tres operaciones siguientes en grafos diri
gidos.
1.
2.
3.

PRIMERO(v), que devuelve el ndice del prim er vrtice adyacente a v. Se de


vuelve un vrtice nulo A si no existe ningn vrtice adyacente a v.
SIGUIENTE(v, /), que devuelve el ndice posterior al ndice i de los vrtices ad
yacentes a v. Se devuelve A si i es el ltimo vrtice de los vrtices adyacentes a v.
VERTICE(v, i), que devuelve el vrtice cuyo ndice i est entre los vrtices ad
yacentes a v.

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

y que 0 se emplea para A. Despus, se obtiene la proposicin (6.1) como en la figura


6.7.
function PRIM ERO ( v: integer): integer;
v ar

i: integer;

www.FreeLibros.me

PROBLEMA DE LOS CAM INOS MAS CORTOS CO N UN SOLO OR IG EN

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

function SIGUIENTE ( v; integer; /: integer ): integer;


var

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 .

Operaciones para recorrer vrtices adyacentes.

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

Iteracin en vrtices adyacentes a v.

Problema de los caminos ms cortos con un solo origen

En esta seccin se considera un problem a comn de bsqueda de cam inos en grafos


dirigidos. Supngase un grafo dirigido G - ( V, A ) en el cual cada arco tiene una eti
queta no negativa, y donde un vrtice se especifica com o origen. El problema es de
term inar el costo del cam ino ms corto del origen a todos los dems vrtices de V,
donde la longitud de un camino es la suma de los costos de los arcos del camino.
Esto se conoce con el nom bre de problem a de los caminos ms cortos con un solo
origen f. Obsrvese que se hablar de cam inos con longitud aun cuando los cos
tos representan algo diferente, como tiempo.
Sea G un mapa de vuelos en el cual cada vrtice representa una ciudad, y cada
t Se puede esperar que un problema ms natural sea encontrar el cam ino ms corto entre el origen y
un vrtice deslino particular. Sin embargo, ese problema parece tan difcil en general com o el de los cam i
nos ms cortos con un solo origen (a m enos que se tenga la suerte de encontrar el cam ino al destino antes
que alguno de los otros vrtices y as terminar el algoritmo un poco antes que si se buscaran los cam inos
hacia lodos los vrtices).

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

PROBLEMA DE LOS CAMINOS MAS CORTOS CON UN SOLO OR IG EN

(3)
(4)
(5)
(6)
(7)

for i

(8 )

207

D[i\ : C [l, /']; ( asigna valor inicial a D 1


1 to -1 do begin
elige un vrtice w en F -S tal que >[w] sea un mnimo;
agrega w a S ;
for cada vrtice v en F -S do
Z3[v]min(Z)[v],Z)[w] + C I h " , v ] )

end
end; | Dijkstra I
Fig. 6.8.

Algoritmo de Dijkstra.

Grafo dirigido con arcos etiquetados.

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

Clculos d e Dijkstra en el grafo dirigido de la figura 6.9.

Por qu funciona el algoritm o de Dijkstra


El algoritmo de Dijkstra es un ejemplo donde la avidez funciona, en el sen
tido de que lo que aparece localmente como lo mejor, se convierte en lo mejor de
todo. En este caso, lo mejor localmente es encontrar la distancia al vrtice w que

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.

Camino hipottico ms corto a w.

www.FreeLibros.me

PROBLEMA DE LOS CAMINOS MAS CORTOS EN TRE TO DO S LOS PARES

\ origen (
anterior S
Fig. 6.12.

209

--------

Camino especial ms corto imposible.

Tiempo de ejecucin del algoritm o de Dijkstra


Supngase que la figura 6.8 opera en un grafo dirigido con n vrtices y a aristas. Si
se emplea una m atriz de adyacencia para representar el grafo dirigido, el ciclo de
las lneas (7) y (8) lleva un tiem po 0(n), y se ejecuta n - 1 veces para un tiem po to
tal de 0 (n 2). El resto del algoritmo, como se puede observar, no requiere m s tiempo
que esto.
Si a es mucho m enor que n2, puede ser mejor utilizar una representacin con lis
ta de adyacencia del grafo dirigido y emplear una cola de prioridad obtenida a ma
nera de rbol parcialm ente ordenado para organizar los vrtices de V - S. El ciclo
de las lneas (7) y (8) se puede realizar recorriendo la lista de adyacencia para w y ac
tualizando las distancias en la cola de prioridad. Se har un total de a actualiza
ciones, cada una con un costo de tiem po 0(log), por lo que el tiempo total consu
mido en las lneas (7) y (8) es ahora Ofalogn), en vez de 0 (n 2).
Las lneas (1) a (3) llevan un tiem po 0(n), al igual que las lneas (4) y (6). Al m a
nejar la cola de prioridad para representar V - S, las lneas (5) y (6) im plantan exac
tam ente la operacin SU PR IM E-M IN y cada una de las n - 1 iteraciones de esas
lneas requiere un tiem po 0(logn).
Como resultado, el tiem po total consum ido en esta versin del algoritmo de
Dijkstra est acotado por 0(alogn). Este tiem po de ejecucin es mucho mejor que
<9(fl2) si a es muy pequea, com parada con ri1.

6 .4

Problema de los caminos ms cortos entre todos los pares

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.

Inclusin de k entre los vrtices que van de i a j.

Considrese el grafo dirigido ponderado que se m uestra en la figura


6.14. En la figura 6.15 se m uestran los valores iniciales de la m atriz A, y despus de
tres iteraciones.
Como A k[i, k] - Ak_ ,[/, A:] y Ak[k,j] - Ak_ ,[/c, j ] , ninguna entrada con cualquier
subndice igual a k cam bia durante la Ar-sima iteracin. Por tanto, se puede realizar
el clculo slo con una copia de la m atriz A. En la figura 6.16 se m uestra un progra
m a para realizar este clculo en matrices de n x n.
Es evidente que el tiem po de ejecucin de este program a es 0 ( 3), ya que el pro
grama est conform ado por el triple ciclo anidado for. Para verificar que este prograEjemplo 6.8.

www.FreeLibros.me

PROBLEMA DE LOS CAMINOS MAS CORTOS ENTRE TODOS LOS PARES

Fig. 6.14.

211

Grafo dirigido ponderado.

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]

Valores de matrices A sucesivas.

precedure F loyd ( var A: array[l..n, l..n] of real;


C: array[ 1
l..n] of re a l);

I Floyd calcula la m atriz A de cam inos ms cortos dada la m atriz de costos


de arcos C
var
i, j, k: integer;
begin
for i
1 to n do
for j :
= 1 to n do
A [ i.j\C [ i,j] \
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, k] + A[k, ;]) < A[i,j] then
A [i.j-):-A [i.k] + A [k,j)
end; ! F lo y d }
Fig. 6.16.

Algoritmo de Floyd.

www.FreeLibros.me

212

GRAFOS D IRIG ID OS

Comparacin entre los algoritmos de Floyd y Dljkstra


Dado que la versin de Dijkstra con m atriz de adyacencia puede encontrar los ca
m inos ms cortos desde un vrtice en un tiem po 0 (n 2), como el algoritmo de Floyd,
tam bin puede encontrar todos los cam inos ms cortos en un tiempo 0 (n 3). El com
pilador, la m quina y los detalles de realizacin determ inarn las constantes de pro
porcionalidad. La experimentacin y medicin son la forma ms fcil de descubrir
el mejor algoritmo para la aplicacin en cuestin.
Si a, el nm ero de aristas, es mucho m enor que n2, aun con el factor constante
relativam ente bajo en el tiempo de ejecucin 0 (n }) de Floyd, cabe esperar que la ver
sin de Dijkstra con lista de adyacencia, tom ando un tiem po 0{na logn) para re
solver el CM CP, sea superior, al m enos para grafos grandes y poco densos.

Recuperacin de los caminos


En m uchos casos se desea im prim ir el cam ino ms econmico entre dos vrtices.
Un modo de lograrlo es usando otra m atriz P, donde P[i, j] tiene el vrtice k que
perm iti a Floyd encontrar el valor ms pequeo de A[i, j]. Si P[i, j] - 0, el camino
m s corto de i a j es directo, siguiendo el arco entre ambos. La versin modificada
de Floyd de la figura 6.17 alm acena los vrtices interm edios apropiados en P.
procedure m s-corlo ( var A: array[l..n, \..n] of real;
C: array[l..n, l..n] of real; R array[l../i, l..n] of integer );

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.

Programa para los caminos ms cortos.

www.FreeLibros.me

PROBLEMA DE LOS CAM INOS MAS CORTOS EN TRE TO DO S LOS PARES

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.

Procedimiento para imprimir el camino ms corto.

La figura 6.19 m uestra la m atriz P final para el grafo dirigido de la

figura 6.14.

1
2
3

0
0
2

3
0
0

0
1
0

P
Fig. 6.19.

Matriz P para el grafo dirigido de la figura 6.14.

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.

La cerradura transitiva puede obtenerse con un procedimiento similar a Floyd aplicando


la siguiente frm ula en el A:-simo paso en la m atriz booleana A.
M j ] ~ A

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 );

I Warshall convierte a A en la cerradura transitiva de C |


var
i, j, k: integer;
begin
for i

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.

Algoritm o de Warshall para cerradura transitiva.

Un ejemplo: localizacin del centro de un grafo dirigido


Supngase que se desea determ inar el vrtice ms central de un grafo dirigido. Este
problem a puede resolverse fcilmente con el algoritmo de Floyd. Primero, se hace

www.FreeLibros.me

ms preciso el trmino vrtice ms central. Sea v un vrtice de un grafo dirigido


G - ( V, A). La excentricidad de v- es

mx

longitud mnima de un camino de w a vi

w en V

El centro de G es un vrtice de mnima excentricidad. As, el centro de un grafo di


rigido es un vrtice ms cercano al vrtice ms distante.
Ejemplo 6.11.

Considrese el grafo dirigido ponderado de la figura 6.22.

Las excentricidades de los vrtices son


vrtice

excentricidad

a
b
c
d
e

co
6
8

5
1

Por tanto, el centro es el vrtice d.


Encontrar el centro de un grafo dirigido G es fcil. Supngase que C es la matriz
de costos fiara G.
1.
2.

Primero se aplica el procedimiento F loyd de la figura 6.16 a C para obtener la


matriz A de los caminos ms cortos entre todos los pares.
Se encuentra el costo mximo
en cada columna i; esto da la excentricidad del
www.FreeLibros.me

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

Matriz de costo CMCP.

Recorridos en grafos dirigidos

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.

Anlisis de la bsqueda en profundidad


Todas las llamadas a b p f en la bsqueda en profundidad de un grafo con a arcos y
n < a vrtices lleva un tiempo 0 (a ). Para ver por qu, obsrvese que en ningn vr
tice se llama a b p f ms de una vez, porque tan pronto como se llama a b p fv ) se hace
marca[v] igual a visitado en la lnea ( 1 ), y nunca se llama a b p f en un vrtice que an
tes tena su marca igual a visitado. Asi, el tiempo total consumido en las lineas (2)
y (3) recorriendo las listas de adyacencias es proporcional a la suma de las longitu
des de dichas listas, esto es, 0(a ). De esta forma, suponiendo que n < a, el tiempo
total consumido por la bsqueda en profundidad de un grafo completo es 0{a), lo
cual es, hasta un factor constante, el tiempo necesario simplemente para recorrer
cada arco.
procedure b p f ( v: vrtice );
var
w; vrtice:
begin
(1)
(2 )
(3)
(4)

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.

Ejemplo 6.13. Supngase que el procedimiento b p fv ) se aplica al grafo dirigido de


la figura 6.25 con v - A. El algoritmo marca A como visitado y selecciona el vrtice
www.FreeLibros.me
B en las lista de adyacencia del vrtice A. Puesto que B no se ha visitado, la bsaue-

218

GRAFOS DIRIGIDOS

ciona el primer vrtice en la lista de adyacencia del vrtice B. Dependiendo del or


den de los vrtices en la lista de adyacencia de B. la bsqueda seguir con C o D.
Suponiendo que C aparece antes que D, se invoca a bpfC ). El vrtice A est en
la lista de adyacencia de C. Sin embargo, en este m omento ya se ha visitado A asi
que la bsqueda queda en C. Como ya se han visitado todos los vrtices de la lista
de adyacencia en C, la bsqueda regresa a B. desde donde la bsqueda prosigue a
D. Los vrtices A y C en la lista de adyacencia de D ya fueron visitados, por lo que
la bsqueda regresa a B y despus a A.
En este punto, la llamada original a bpfl,A) ha terminado. Sin embargo, el grafo
dirigido no ha sido recorrido en su totalidad; los vrtices E. F y G estn sin visitar.
Para completar la bsqueda, se puede llamar a bpf{E),

Bosque abarcador en profundidad


Durante un recorrido en profundidad de un grafo dirigido, cuando se recorren cier
tos arcos, llevan a vrtices sin visitar. Los arcos que llevan a vrtices nuevos se co
nocen como arcos de rbol y forman un bosque abarcador en profundidad para el
grafo dirigido dado. Los arcos continuos de la figura 6.26 forman el bosque abar
cador en profundidad del grafo dirigido de la figura 6.25. Obsrvese que los arcos
de rbol deben form ar realmente un bosque, ya que un vrtice no puede estar sin
visitar cuando se recorren dos arcos diferentes que llevan a l.
Adems de los arcos de rbol, existen otros tres tipos de arcos definidos por una
bsqueda en profundidad de un grafo dirigido, que se conocen como arcos de re
troceso, arcos de avance y arcos cruzados. Un arco como C A se denomina arco de
retroceso, porque va de un vrtice a uno de sus antecesores en el bosque abarcador.
Obsrvese que un arco que va de un vrtice hacia s mismo, es un arco de retroceso.
Un arco no abarcador que va de un vrtice a un descendiente propio se llama
arco de avance. En la figura 6.25 no hay arcos de este tipo.
Los arcos como D C o G D, que van de un vrtice a otro que no es ante
cesor ni descendiente, se conocen como arcos cruzados. Obsrvese que todos los ar
cos cruzados de la figura 6.26 van de derecha a izquierda, en el supuesto de que se
agregan hijos al rbol en el orden en que fueron visitados, de izquierda a derecha,
y que se agregan rboles nuevos al bosque de izquierda a derecha. Este patrn no es
accidental. Si el arco G D hubiera sido D G. entonces no se hubiera visitado
G durante la bsqueda en D. y al encontrar el arco D G. el vrtice G se hara des
cendiente de D, y D
G se convertira en un arco de rbol.

www.FreeLibros.me

GRAFOS D IRIG ID OS ACICLICOS

Fig. 6.26.

219

Bosque abarcador en profundidad para la figura 6.25.

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

Grafos dirigidos aciclicos

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.

Tres grafos dirigidos.

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)

Los trm inos a + b y (a + b) c son subexpresiones comunes compartidas que se re


presentan con vrtices con ms de un arco entrante.
Los gda son tiles tam bin para la representacin de rdenes parciales. Un or
den parcial R en un conjunto S es una relacin binaria tal que
1.
2.

para toda a en S, a R a es falsa (R es irreflexivo), y


para toda a, b. c en S, si a R b y b R c, entonces a R c (R es transitivo).

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

GRAFOS D IRIG ID OS A CICUCOS

Fig. 6.28.

221

Gda para expresiones aritmticas.

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.

Gda para inclusiones propias.

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

a v. Y a q u e u est en el ciclo, d eb e se r u n d e sc en d ien te d e v en el b o sq u e ab arc a d o r en p ro fu n d id a d . As, u v n o p u e d e s e r u n a rc o cru za d o . P u e sto q u e el n m e


ro en p r o fu n d id a d d e u es m a y o r qu e el de v, u v no p u e d e se r un arc o de rb o l
ni u n a rc o d e avan c e. A s q u e u - * v deb e se r u n arco de retroceso , co m o se ilu stra
en la fig u ra 6.30.

F ig. 6.30.

T o d o ciclo c o n tie n e un a rc o d e re tro c e so .

C la s ific a c i n to p o l g ic a

U n p ro y e cto gran d e suele d iv id irse en un a coleccin d e ta re a s m s pequeas, algu


nas d e las cuales se h a n de rea liz ar en cierto s rd e n e s especficos, de m o d o qu e se
p u e d a c u lm in a r el pro y ec to to ta l. P o r e je m p lo , u n a c a rre ra u n iv e rsita ria puede co n
te n e r c u rsos q u e re q u ie ra n o tro s c o m o p re rreq u isito s. L os gda pu ed e n em plearse
p a ra m o d elar d e m a n e ra n a tu ra l e stas situ acio n es. P o r ejem plo, p o d ra tenerse u n
arco del c u rso C al curso D si C fu e ra u n p re rre q u isito de D.
E jem plo 6.16. La figura 6.31 m u e stra un gda c o n la e stru c tu ra d e p re rre q u isito s de
c in c o cu rsos. El c u rso C 3, p o r ejem plo, req u iere los cu rso s C1 y C 2 c o m o p re rre q u isi
tos.

Fig. 6.31.

G d a d e p re rre q u isito s.

www.FreeLibros.me

La clasificacin topolgica es un proceso de asignacin de un orden lineal a los


vrtices de un gda tal que si existe un arco del vrtice i al vrtice j, i aparece antes
que j en el ordenamiento lineal. Por ejemplo, C l, C 2, C3, C4, C5 es una clasifica
cin topolgica del gda de la figura 6.31. Al tomar los cursos en esta secuencia, se
puede satisfacer la estructura de prerrequisitos dada en la figura.
La clasificacin topolgica puede efectuarse con facilidad si se agrega una ins
truccin de impresin despus de la lnea (4) al procedimiento de bsqueda en pro
fundidad de la figura 6.24;
procedure clasificacin-topolgica(v. vrtice);
imprime los vrtices accesibles desde v en orden topolgico invenido!
var
w. vrtice;
begin

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\

Cuando clasificacin-topolgica termina de buscar en todos los vrtices adyacentes


a un vrtice dado x , imprime x . El efecto de llamar a clasificacin-topolgica(v) es
imprimir en orden topolgico inverso todos los vrtices de un gda accesibles desde
v por medio de un camino en el gda.
Esta tcnica funciona porque no existen arcos de retroceso en un gda. Consid
rese lo que sucede cuando la bsqueda en profundidad deja un vrtice x por ltima
vez. Los nicos arcos que emanan de v son arcos de rbol, de avance y cruzados.
Pero todos esos arcos estn dirigidos hacia vrtices que ya se han visitado comple
tamente y que, por tanto, preceden a x en el orden que se estn construyendo.

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.

Componentes fuertes del grafo de la figura 6.32.

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

Ahora se presenta un algoritmo para encontrar los componentes fuertemente co


nexos de un grafo dirigido G dado.
1.

2.
3.

4.

Efectese una bsqueda en profundidad de G y numrense los vrtices en el or


den de terminacin de ias llamadas recursivas; esto es, asgnese un nmero al
vrtice v despus de la lnea (4) de la figura 6.24.
Construyase un grafo dirigido nuevo Gr inviniendo las direcciones de lodos los
arcos de G.
Realcese una bsqueda en profundidad en Gn partiendo del vrtice con nume
racin ms alta de acuerdo con la numeracin asignada en el paso (1). Si la bs
queda en profundidad no llega a todos los vrtices, inciese la siguiente bsque
da a partir del vrtice restante con numeracin ms alta.
Cada rbol del bosque abarcador resultante es un componente fuertemente co
nexo de G.

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.

Despus del paso 1

www.FreeLibros.me

226

GRAFOS DIRIGIDOS

Fig. 6.36.

G,.

Fig. 6.37.

B osque abarcador en profundidad para Gr

Ahora, supngase que v y w estn en ei mismo rbol abarcador del bosque


abarcador en profundidad de Gr Se debe dem ostrar que v y w estn en el mismo com
ponente fuertemente conexo. Sea x la raz del rbol abarcador que contiene v y
w. Puesto que v es descendiente de x, existe un cam ino en (?, que va de x a v. As,
existe un camino en G de v a x.
En la construccin del bosque abarcador en profundidad de Gn el vrtice v que
d sin visitarse cuando se inici la bsqueda en x . De aqu que x tiene un nmero
mayor que v, por lo que en la bsqueda en profundidad de G, la llamada recursiva
en v term in antes que la llamada rccursiva en x. Pero en la bsqueda en profundi
dad de G, la bsqueda en v no pudo haberse iniciado antes que la de x , ya que el
cam ino en G de v a x im plicara que la bsqueda en x empezara y term inara antes
de term inar la bsqueda en v.
Se concluye que en la bsqueda de G, v se visita durante la bsqueda de x, por
lo que, v es descendiente de x en el prim er bosque abarcador en profundidad de
G. As, existe un cam ino de x a v en G. Por tanto, x y v estn en el mismo compo
nente fuertemente conexo. Un razonam iento idntico muestra que x y w estn en el
mismo componente fuertemente conexo y, por tanto, v y w tambin lo estn, como
muestran los cam inos que van de v a x a w, y de w a x a v .

Ejercicios
6.1

Represntese el grafo dirigido de la figura 6.38


a) por medio de una m atriz de adyacencia dando los costos de los arcos, y
b) por medio de una lista enlazada de adyacencia con indicacin de los cos
tos de los arcos.

www.FreeLibros.me

EJERCICIOS

227

6.2

Descrbase un modelo matemtico para el siguiente problema de horarios.


Dadas las tareas T,, T2, ..., T, que requieren tiempos f,, t2, .... para eje
cutarse, y un conjunto de restricciones, cada una de la forma T, debe ter
m inar antes del inicio de T, encuntrese el tiempo m nim o necesario para
ejecutar todas las tareas.

6.3

Realcense las operaciones PRIMERO, SIGUIENTE y VERTICE para gra


fos dirigidos representados por
a) matrices de adyacencia,
b) listas enlazadas de adyacencias, y
c) listas de adyacencias como la representada en la figura 6.5.

6.4

En el grafo dirigido de la figura 6.38,


a) emplese el algoritmo Dijkstra para encontrar los cam inos ms cortos
que van del vrtice a a los otros vrtices.
b) utilcese el algoritmo Floyd para encontrar las distancias ms cortas en
tre todos los pares de puntos. Construyase tambin la matriz P que per
mita recuperar los caminos ms cortos.

6.5

Escrbase un programa completo para el algoritmo de Dijkstra usando r


boles parcialmente ordenados como colas de prioridad y listas enlazadas
de adyacencias.

*6.6

Demustrese que el programa Dijkstra no funciona bien si los arcos tienen


costos negativo!

**6.7

Mustrese que el programa Floyd funciona si alguno de los arcos, pero nin
gn ciclo, tienen costo negativo.

6.8

Suponiendo que el orden de los vrtices es a. b


/ en la figura 6.38, cons
truyase un bosque abarcador en profundidad; indquese los arcos de r
bol, de retroceso, de avance y cruzados, y la numeracin en profundidad
de los vrtices.

www.FreeLibros.me

228

GRAFOS DIRIGIDOS

*6.9

Supngase que se tiene un bosque abarcador en profundidad, y se lista en


orden posterior cada uno de los rboles abarcadores (los rboles que estn
formados por aristas abarcadoras), de izquierda a derecha. Demustrese
que este orden es el mismo en el que term inaron las llamadas a bpf cuando
se construy el bosque abarcador.

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

Considrese un gda con a arcos y con dos vrtices distintos s y i. Constru


yase un algoritmo 0(a) para encontrar el conjunto maximal de caminos dis
juntos de s a r. Por maximal se entiende que ya no se pueden aadir cami
nos adicionales, pero eso no significa que sea el tam ao ms grande para
ese conjunto.

6.12

Construyase un algoritmo para convertir un rbol de expresiones con los


operadores + y * en un gda al com partir subexpresiones comunes. Cul es
la complejidad de tiempo de esc algoritmo?

6.13

Construyase un algoritmo para la evaluacin de expresiones aritmticas re


presentadas con un gda.

6.14

Escrbase un programa para encontrar el camino ms largo en un gda. Cul


es la complejidad de tiem po de este programa?

6.15

Encuntrense los componentes fuertes de la figura 6.38.

*6.16

Prubese que el grafo reducido de los componentes fuertes de la seccin 6.7


debe ser un gda.

6.17

Dibjese el prim er bosque abarcador, el grafo invertido y el segundo bos


que abarcador que se obtiene al aplicar el algoritmo de componentes fuer
tes al grafo dirigido de la figura 6.38.

6.18 Obtngase el algoritmo de componentes fuertes analizado en la seccin 6.7.


*6.19

Mustrese que el algoritmo de componentes fuertes requiere un tiempo 0{a)


en un grafo dirigido de a arcos y n vrtices, suponiendo que n < a.

*6.20

Escrbase un programa que tome como entrada un grafo dirigido y dos de


sus vrtices. El programa debe im prim ir todos los caminos simples que va
yan de un vrtice al otro. Cul es la complejidad de tiempo de este progra
ma?

*6.21

Una reduccin transitiva de un grafo dirigido G - (V, A) es cualquier grafo


G' con los mismos vrtices pero con la m enor cantidad de arcos posible, de
modo que el cierre transitivo G' es el mismo que el de G. Demustrese
que si G es un gda. la reduccin transitiva de G es nica.

www.FreeLibros.me

NOTAS BIBLIOGRAFICAS

229

*6.22

Escrbase un programa para obtener la reduccin transitiva de un grafo di


rigido. Cul es la complejidad de tiempo de este programa?

*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.

*6.24 Escrbase un programa para encontrar un grafo dirigido equivalente m ini


mal para un grafo dirigido dado. Cul es la complejidad de tiempo de ese
programa?
*6.25 Escrbase un programa para encontrar el camino simple ms largo de un
vrtice dado de un grafo dirigido. Cul es la complejidad de tiem po del
programa?

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

Un grafo no dirigido G =(V. A ) consta de un conjunto finito de vrtices V y de un


conjunto de aristas A . Se diferencia de un grafo dirigido en que cada ansia en A es
un par no ordenado de vrtices t- Si (v, w) es una ansta no dirigida, entonces
(v. w) - (w, v). De ahora en adelante se har referencia a los grafos no dirigidos tan
slo como grafos.
Los grafos se emplean en distintas disciplinas para modelar relaciones simtricas
entre objetos. Los objetos se representan por los vrtices del grafo, y dos objetos es
tn conectados por una arista si estn relacionados entre si. En este captulo se pre
sentan varias estructuras de datos que pueden usarse para representar grafos, y los
algoritmos para tres problemas comunes que se relacionan con grafos no dirigidos:
construccin de rboles abarcadores minimales, componentes biconexos y compa
raciones maximales.

7 .1

Definiciones

Buena parte de la terminologa para grafos dirigidos es aplicable tambin a los no


dirigidos. Por ejemplo, los vrtices v y son adyacentes si (v. w) es una arista [o, en
forma equivalente, si (w, v) lo es). Se dice que la arista (v, h-) es incidente sobre los
vrtices v y w.
Un cam ino es una secuencia de vrtices v v2, .... v tal que (v<t v,, , ) es una arista
para l < i < n . V n camino es sim ple si todos sus vrtices son distintos, con excep
cin de v, y v, que pueden ser el mismo. La longitud del camino es n - l, el nmero
de aristas a lo largo del camino. Se dice que el camino v,. v2, ..., v conecta v, y v.
Un grafo es conexo si todos sus pares de vrtices estn conectados.
Sea G - (V, .-1) un grafo con conjunto de vrtices V y conjunto de aristas A. Un
subgrafo de G es un grafo G '~ ( V\ A ) donde
1. K'es un subconjunto de V.
2. A ' consta de las aristas (v, v) en A tales que v y w estn en V .
Si A consta de todas las aristas (v. w) en A , tal que v y w estn en V , entonces G'
se conoce como un subgrafo inducido de G.
www.FreeLibros.me

Ejemplo 7.1. En la figura 7. l(a) se observa un grafo G - (V, A ) con V - \ a , b . c. d\


y A - |(a. b), (a, d), (b. c). (b. d ), (c, d )). y en la figura 7. l(b). uno de sus subgrafos
inducidos, definido por el conjunto de vrtices \a, b, el y todas las aristas de la figura
7. l(a) que no inciden sobre el vrtice d.

Fig. 7.1.

Grafo con uno

de

sus subgrafos.

Un com ponente conexo de un grafo G es un subgrafo conexo inducido maximal,


esto es, un subgrafo conexo inducido que por si mismo no es un subgrafo propio
de ningn otro subgrafo conexo de G.
La figura 7.1 es un grafo conexo que tiene slo un componente co
nexo, y que es l mismo. La figura 7.2 es un grafo con dos componentes conexos.
Ejemplo 7.2.

Fig. 7.2.

Grafo no conexo.

Un ciclo (simple) de un grafo es un camino (simple) de longitud mayor o igual


a tres, que conecta un vrtice consigo mismo. No se consideran ciclos los caminos
de la forma v (camino de longitud 0 ), v. v (camino de longitud l), o v, w, v (camino
de longitud 2). Un grafo es cclico si contiene por lo menos un ciclo. Un grafo co
nexo aciclico algunas veces se conoce como rbol libre. La figura 7.2 muestra un gra
fo que consta de dos componentes conexos, cada uno de los cuales es un rbol libre.
Un rbol libre puede convertirse en ordinario si se elige cualquier vrtice deseado
como raz y se orienta cada arista desde ella.
Los rboles libres tienen dos propiedades importantes que se usarn en la si
guiente seccin.
www.FreeLibros.me

Se puede probar (1) por induccin en n, o en forma equivalente, con un argumento


basado en el "contracjemplo ms pequeo". Supngase que G - ( V , A ) es un con
traejemplo de ( 1 ) con un mnimo de vrtices n , por ejemplo n no puede valer uno,
porque el nico rbol libre con un vrtice tiene cero aristas, y (1) se satisface. Por
tanto, n debe ser mayor que uno.
Ahora se pretende que en el rbol libre exista algn vrtice con exactamente una
arista incidente. En la demostracin, ningn vrtice puede tener cero aristas inci
dentes. o G no seria conexo. Supngase que todo vrtice tiene por lo menos dos aris
tas incidentes. Despus, prtase de algn vrtice v,, y sgase cualquier arista desde
v,. En cada paso, se abandona un vrtice por una arista diferente a la que se utiliz
para llegar, formando un camino v,, vJ( v}.......
Dado que slo se tiene un nmero finito de vrtices en V. no es posible que lo
dos los vrtices en el camino sean diferentes; en un momento dado, se encuentra
v, - v, para alguna < j. No se puede tener / - y - 1 , porque no hay ciclos de un vr
tice a si mismo, y tampoco i - j - 2 , ya que se llegara y se abandonara el vrtice
v ,., por la misma arista. As, i < y - 3, y se tiene un ciclo v
v - v con lo
que se contradice la hiptesis de que G no tiene vrtices con slo una arista inci
dente y, por tanto, se concluye que existe tal vrtice v con arista (v, w).
Ahora, considrese el grafo G ' formado al eliminar el vrtice v y la arista (v, w)
de G. G ' no puede contradecir (1), porque si lo hiciera podra ser un contracjemplo
ms pequeo que G. Por tanto, G ' tiene n - 1 vrtices y n - 2 aristas. Pero G tiene
un vrtice y una ansia ms que G \ es decir, tiene n - 1 anstas, probando que G sa
tisface realmente (1). Como no hay un contraejemplo ms pequeo para (1). se con
cluye que no existe ese contraejemplo, y ( 1 ) es cierto.
Ahora, es posible probar con facilidad la proposicin (2) de que la adicin de
una arista a un rbol libre forma un ciclo. De no ser as, el resultado de agregar la
arista a un rbol libre de n vrtices sera un grafo con n vrtices y n anstas. Este gra
fo an sera conexo, y se ha supuesto que agregando la arista quedara un grafo acclico. Con esto, se tendra un rbol libre cuyas cantidades de vrtices y de aristas no
satisfaran la condicin ( 1 ).

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.

Es notorio que la matriz de adyacencia para un grafo es simtrica. En la repre


sentacin con lista de adyacencia, si (/, yj es una arista, el vrtice j estar en la lista
del vrtice i y el vrtice / estar www.FreeLibros.me
en la lista del vrtice y.

a
a
b
c
d

0
1
0
1

0
1
0
1

1
1
1
0

l
1

(a) Matriz de adyacencia


h
O

a
h
0

(b)
Fig. 7.3.

7 .2

Lista de adyacencia
Representaciones.

Arboles abarcadores de costo minlmo

Supngase que G = {V, A ) es un grafo conexo en donde cada arista ( u . v) de A tiene


un costo asociado c (w. v). Un rbol ahorcador para G es un rbol libre que conecta
todos los vrtices de V; su costo es la suma de los costos de las aristas del rbol. En
esta seccin se muestra cmo obtener el rbol abarcador de costo mnimo para G.
Ejemplo 7.4. La figura 7.4 muestra un grafo ponderado y su rbol abarcador de
costo mnimo.
Una aplicacin tpica de los rboles abarcadores de costo mnimo tiene lugar en
el diseo de redes de comunicacin. Los vrtices del grafo representan ciudades, y
las aristas, las posibles lneas de comunicacin entre ellas. El costo asociado a una
arista representa el costo de seleccionar esa lnea para la red. Un rbol abarcador
de costo mnimo representa una red que comunica todas las ciudades a un costo mi
nimal.

www.FreeLibros.me

La propiedad AAM (Arbol Abarcador de costo Mnimo)


Hay distintas formas de construir un rbol abarcador de costo mnimo Muchos de
esos mtodos utilizan la siguiente propiedad de los rboles abarcadores de costo mni
mo, que se denomina propiedad A.4M. Sea G - (V. A ) un grafo conexo con una fun
cin de costo definida en las aristas. Sea U algn subconjunto propio del conjunto
de vrtices V. Si (u, v) es una arista de costo mnimo tal que u e V y v e V-U, exis
te un rbol abarcador de costo mnimo que incluye (, v ) entre sus aristas.
La demostracin de que todo rbol abarcador de costo mnimo satisface la pro
piedad AAM no es muy difcil. Supngase, por el contrario, que no existe el rbol
abarcador de costo mnimo para G que incluye (u. v). Sea T cualquier rbol
abarcador de costo mnimo para G. Agregar ( u , v) a T debe formar un ciclo, ya que
T es un rbol libre y, por tanto, satisface la propiedad (2) de los rboles libres. Este
ciclo incluye la arista (, v). As, debe haber otra arista ( v") en T tal que u e U y
v' e V -U , como se ilustra en la figura 7.5. Si no, no habra forma de que el ciclo fue
ra de u a v sin pasar por segunda vez por la arista (u, v).
Al eliminar la arista (//. v') se rompe el ciclo y se obtiene un rbol abarcador
T ' cuyo costo en realidad no es mayor que el costo de T. ya que. por suposicin,
c ( u , v) < c(u'. v-). As 7'contradice la suposicin de que no hay un rbol abarcador
de costo mnimo que incluya (m , v).

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

procedure P rim (G : grafo; var T: conjunto de aristas);


!Prim construye un rbol abarcador de costo mnimo T para Gi
var
U: conjunto de vrtices:
u, v: vrtice;
begin
T

:~

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.

Esbozo del algoritmo de Prim.

Una forma sencilla de encontrar la arista de menor costo entre V y V - U en


cada paso es por medio de dos arreglos; uno, M A S-C E R C A N O [ /], da el vrtice en
11 que est ms cercano a / en V - V. El otro. M E'XO R-C O STO [i], da el costo de
la arista (i. M A S-C E R C A N O [i\).

www.FreeLibros.me

En cada paso se revisa M E N O R -C O S T O para encontrar algn vrtice, como k,


en V - U que est ms cercano a U. Se imprime la arista (k, M A S-C E R C A N O [k ]).
Entonces se actualizan los arreglos M E N O R -C O S T O y M A S-C E R C A N O , teniendo
en cuenta el hecho de que k ha sido agregada a U. En la figura 7.8 se da una versin
en Pascal de este algoritmo. Se supone que C es un arreglo de n x n tal que C[i. j \
es el costo de la arista (/, j). Si la arista (/. j ) no existe, se supone que C [i.j] tiene un
valor grande apropiado.
Si encuentra otro vrtice k para el rbol abarcador, se hace que M E N O R -C O STO[k\ sea infinito , un valor muy grande, de modo que este vrtice ya no se consi
dera en los recorridos siguientes para incluirlo en U. El valor infinito es mayor que
el costo de cualquier arista o que el costo asociado a una arista no existente.
La complejidad de tiempo del algoritmo de Prim es 0 ( n 2), ya que se efectan
n - 1 iteraciones del ciclo de las lneas (4) a (16) y cada iteracin del ciclo lleva un
tiempo 0 (n ), debido a los ciclos ms internos de las lneas (7) a (10) y (13) a (16).
Conforme n crece, el rendimiento de este algoritmo puede dejar de ser satisfactorio.
Ahora se presenta otro algoritmo, debido a Kruskal, para encontrar rboles abarcadores de costo mnimo cuyo rendimiento puede ser como mximo CHaloga), don
de a es el nmero de aristas del grafo dado. Si a es mucho menor que n2, el algorit
mo de Kruskal es superior, pero si es cercano a n 2, se debe optar por el algoritmo
de Prim.
procedure Prim (C: array[l..n, l..n] of real );
1 Prim imprime las aristas de un rbol abarcador de costo mnimo
para un grafo con vrtices 11. 2
ni y matriz de costo C
definida en las aristas !
var
M E N O R -C O S T O : array(l..n) of real;
M A S-C E R C A N O : array[l..n] of integer;
/. j. k, min: integer.
/y ;s o n ndices. Durante una revisin del arreglo M E N O R -C O S
TO. k es el ndice del vrtice ms cercano encontrado hasta
ese punto, y m in = .V/E N O R -C O S T O \k] I

( 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)

m in := M EN O R-C O STO [f]\


k :-j

(1 0 )

end;
(11)

( 1 2)
( 1 3)
(14)
(15)
(16)

writeln{k. \lA S-C E R C A N O [k])\ ! imprime la arista


M E N O R -C O ST O [k\ > infinito: i se aade k a V
for j
2 to n do I ajusta los costos de U I
f (C[k, j] < M E N O R -C O STO [j]) and
( M E N O R -C O S T 0 \j] < infinito) then begin
M E N O R X ' O S T O [ j } C [ k . j\\
\A S-C E R C A N O \j]k

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

Tambin se requiere mantener un conjunto de componentes conexos C. Las ope


raciones que se le aplican son:
1. COMBINAR. B, O , para combinar ios componentes A y B en C y llamar al re
sultado A o B en forma arbitraria t2 . ENCUENTRA!v, Q , para devolver el nombre del componente de C, del cual el
vrtice res miembro. Esta operacin se usar para determinar si los dos vrtices
de una arista se encuentran en dos componentes distintos o en el mismo.
3. INICIAL!/!, v, C). para que A sea el nombre de un componente que pertenece
a C, y que inicialmentc contiene slo el vrtice v.
Estas son las operaciones del TDA COMBINA-ENCUENTRA llamado CON
JUNTO-CE, estudiado en la seccin 5.5. En la figura 7.10 se muestra un esbozo de
un programa llamado K ruskal para encontrar rboles abarcadores de costo mnimo
con estas operaciones.
Se pueden emplear las tcnicas desarrolladas en la seccin 5.5 para implantar las
operaciones utilizadas en este programa. El tiempo de ejecucin de este programa
depende de dos factores. Si hay a aristas, lleva un tiempo 0(a\oga) insertar las aris
tas en la cola de prioridad f f . En cada iteracin del ciclo while, la obtencin de la

(a)

Fig. 7.9.

Secuencia de aristas aadidas por el algoritmo de Kruskal.

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

En un gran nmero de problemas con grafos, es necesario visitar sistemticamente


los vrtices del grafo. Las bsquedas en profundidad y en amplitud, lemas de esta
seccin, son dos tcnicas importantes para hacerlo. Ambas tcnicas pueden usarse
para determinar de manera eficiente todos los vrtices que estn conectados a un vr
tice dado.
( V: CONJUNTO de vrtices;
A: CONJUNTO de aristas;
var T: CONJUNTO de aristas );

p ro ced u re K ruskai

var

compon', integer, i nmero actual de componentes I


aristas: COLA_DE_PRIORIDAD; el conjunto de aristas i
com ponentes: CONJUNTO_CE; I el conjunto V agrupado en

un conjunto de componentes COMBINA-ENCUENTRA


u, v: vrtice;
a: ansta;
c o m p sig u ie n te 4. integer; ! nombre para el nuevo componente I
co m p -u , co m p -v ,; I nombres de componentes |
begin

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;

en A d o I asigna valor inicial a la cola de prioridad de aristas I


INSERTA(a, aristas)-,
while co m p -n > 1 d o begin I considera la siguiente arista I
a
SUPRIME_MIN(am/os)
sea a - (u, v);
www.FreeLibros.me
fo r a

< > com p-v then begin


I a conecta dos componentes diferentes I
COMBINA(comp_u, comp-V, com ponentes );
com pon
c o m p -n -1;
INSERTAR, T)

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).

Ejemplo 7.6. Considrese el grafo conexo G de la figura 7 .ll(a). Un rbol abar


cador en profundidad T resultante de una bsqueda en profundidad de G se mues
tra en la figura 7.1 Ifb). Se supuso
que la bsqueda empez en el vrtice a, y se adop
www.FreeLibros.me
t la convencin de mostrar las aristas del rbol con lneas de trazo continuo v las

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.

Un grafo y su bsqueda en profundidad.

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.

procedure bea (v);


I bea visita todos los vrtices conectados a v usando bsqueda en
amplitud }
var
C: COLA de vrtice;
x , y. vrtice;
begin
marca[v]
visitado ;
PONE_EN_COLA(v, Q;
while not VACIA(C) do begin
.t > FRENTE(0;
QU1TA_DE_COLA (O;
for cada vrtice y adyacente a jc do
if marca[y ] - no-visitado then begin
marca[y]

visitado;

PONE_EN_COLA(>-, Q ;
INSERTAR, y), T)
end
end
end; I bea 1
Fig. 7.12.

Bsqueda en amplitud.

www.FreeLibros.me

La complejidad de tiempo de la bsqueda en amplitud es la misma que para la


bsqueda en profundidad. Cada vrtice visitado se coloca en la cola una vez. as que
el ciclo while se ejecuta una sola vez para cada vrtice. Cada arista (jc. y ) se examina
dos veces, desde x y desde y. As, si el grafo tiene n vrtices y a ansias, el tiempo
de ejecucin de bea es 0 (mx(n, a)) si se utiliza una representacin con lista de ad
yacencia para las aristas. Dado que es tpico que a > n, en general se har referen
cia al tiempo de ejecucin de la bsqueda en amplitud con 0{a), como ocurri para
la bsqueda en profundidad.
Las bsquedas en profundidad y en amplitud se pueden usar como marcos de tra
bajo, alrededor de los cuales se disean eficientes algoritmos para grafos. Por ejem
plo, se puede emplear cualquiera de los dos mtodos para encontrar los componen
tes conexos de un grafo, ya que aqullos son los rboles de los dos bosques abarcadores.
Se puede verificar la existencia de ciclos por medio de la bsqueda en amplitud
en un tiempo 0 (n ), donde n es el nmero de vrtices, independientemente del n
mero de aristas. Como se vio en la seccin 7.1, cualquier grafo con n vrtices y n o
ms aristas debe tener un ciclo. Sin embargo, un grafo puede tener n - l o menos
aristas y de todos modos tener un ciclo, si tiene dos o ms componentes conexos.
Una forma segura de encontrar los ciclos es construir un bosque abarcador en am
plitud. As, toda arista cruzada (v, w) debe completar un ciclo simple con las aristas
de rbol que conducen a v y w desde su antecesor comn ms cercano, como se mues
tra en la figura 7.14.

Fig. 7.14.

7 .4

Ciclo encontrado por la bsqueda en amplitud.

Puntos de articulacin y componentes biconexos

Un punto de articulacin de un grafo es un vrtice v tal que cuando se elimina junto


con todas las aristas incidentes sobre l, se divide un componente conexo en dos o
ms partes. Por ejemplo, los puntos
de articulacin de la figura 7.1 l(a) son a y c. Si
www.FreeLibros.me
plimina n pl orafn mip pc nn cnmnnnpnlp rnnpxn
divide pn dos trinmilnv

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.

Realizar una bsqueda en profundidad del grafo, calculando nmero-bp[v] para


lodo vrtice v, como se analiz en la seccin 6.5. En esencia, nm ero-bp ordena
los vrtices como en un recorrido en orden previo del rbol abarcador en pro
fundidad.

2.

Para cada vrtice v, obtener bajo[v], que es el nm ero-bp ms pequeo de v o


de cualquier otro vrtice w accesible desde v, siguiendo cero o ms aristas de r
bol hasta un descendiente x de v (x puede ser v) y despus seguir una ansia de
retroceso (x. w). Se calcula bajo[v] para todos los vrtices v, visitndolos en un
recorrido en orden posterior. Cuando se procesa v, se ha calculado bajo[y\ para
todo hijo y de v. Se toma bajo[v] como el mnimo de
a) nm ero-bp\v],
b) nm ero-bp[z] para cualquier vrtice z para el cual haya una arista de retro
ceso (v. z), y
c) bajo[y ] para cualquier hijo y de v.

3.

Ahora se encuentran los puntos de articulacin como sigue.


a) La raz es un punto de articulacin si, y slo si, tiene dos o ms hijos. Puesto
que no hay aristas cruzadas, la eliminacin de la raz debe desconectar los
subrboles cuyas races se encuentren en sus hijos, como a desconecta
d. e\
de \c.f.g\ en la figura 7.11(b).
b) Un vrtice v distinto de la raz es un punto de articulacin si, y slo si, hay
un hijo w de v tal que bajo[w] > nm ero-bp[v ]. En este caso, v desconecta w
y sus descendientes del resto del grafo. A la inversa, si bajo[w] < numero~bp[v], debe haber un camino para descender desde w en el rbol y regre
sar hasta un antecesor propio
de v (el vrtice cuyo nm ero-bp es bajo[w)) y,
www.FreeLibros.me
Dor tanto, la eliminacin de v no desconecta w ni sus descendientes de! resto

Ejemplo 7.8. n m ero -b p y bajo se calculan para el grafo de la figura: 7.br(a) e la


figura 7.15. Como ejemplo de la obtencin de baj, el recorrido en orden posterior
visita e primero. En e. hay aristas de regreso (*y a ) y (e, b). as que b a j o [ t iguala
a m in(nm ero-bp[e). nm ero.bp[a], nm ero-bp[b]) - I; Despus-w v is it a # y b a jc\d ] se hace igual al mnimo de nm ero-bp[d\. bajo\e) v n n u ro tfifi[a )/ El segundo
de stos surge porque e es un hijo de d. y el tercero, por laexistettcia de la^rista de
retroceso (d. a).
:- : n o i . r. vmvli /iup* sv a*

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

X ' nm ero-bp [g] = 7


bajo [#1 - 5

nm ero-bp (?) - 4
bajo (?) - I
Fig. 7.15.

Numeracin Oa/o y en profundidad.

Despus de obtener bajo, se considera cada vrtid;.Ya raz a es un punto de ar


ticulacin porque nene dos hijos. El yfUce c es un punto, de i ^ c j l a c j $ j i n e
ne un hijo/con bajo[f) > nm ero-bp(c\. Los otros vrtices o son^y^tos de arjifi.la-(
Cl n

. > .

-.i yfi-Z3 :-;i;-nB v b m q

h - m lix i

El tiempo que consume el algoritmo anterior en un grafb de a a'risftai-y ri '< a vr-'


tices es 0(a). Es recomendable comprobar que el tfeipb emplead'en cada U d
las tres fases puede atribuirse al vrtice visitado o a ua arista qi fiaria d e s vr
tice. y slo se le puede atribuir una cantidad constahte'dt tiempokclquieT arista
o vrtice en cualquier paso. As, el tiempo total es 0 ( n +<z), el cual es O i a ) en eli -1
puesto de que n < a.
-!>
' J
,C |

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

i : .T 'J 'io tjlii r**ji. i / I

En esta seccin se bosquejar un algoritmo para resolver prdbfefna d paremiem


to en grafos. Un ejemplo simple de problema de paremento octrn cando s'tlne un conjunto de profesores para distribuir en un conjuiVid de tirsos. Cada profe
sor es competente par impartir ciertos cursos, per n otros. Se desea'sigriaV un
curso al profesor adecuado, peto sin
asignar dos profesores ! miSHtd cUrsbParircierwww.FreeLibros.me
tac rii*frihrir'irtn>* de nrofesnres v firsm rs imnmbl riimirrt iirto'iT rif1y'nrn-

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.

El problema del parcamiento se puede formular en trminos generales como si


gue. Dado un grafo G - (V. A ), el subconjunto de las aristas de A en el que ningn
par de aristas es incidente sobre el mismo vrtice de V, se conoce como pareamiento. La tarea de la seleccin de subconjuntos mximos de tales aristas se denomina
problema de paream iento m axim al. y un ejemplo son las aristas ms gruesas de
la figura 7.16. Un paream iento com pleto es aquel en el que todo vrtice es un
punto final de alguna arista en ella. Claramente, todo pareamiento completo es
maximal.
Un modo directo de encontrar pareamientos maximales, es generar en forma sis
temtica todos los pareamientos y luego marcar uno que tenga el mayor nmero de
aristas. La dificultad de este mtodo radica en que tiene un tiempo de ejecucin que
es una funcin exponencial del nmero de aristas.
Existen algontmos ms eficientes para la obtencin de pareamientos maximales.
Esos algontmos usan de ordinario una tcnica conocida como caminos aumenta
dos. Sea C un pareamiento en un grafo G. Un vrtice v est pareado si es el punto fi
nal de una arista de C. Un camino que conecte dos vrtices no pareados, cuyas aris
tas alternas estn en C, se conoce como cam ino aum entado relativo a C. Obsrvese
que un camino aumentado debe tener longitud impar, y debe empezar y terminar
www.FreeLibros.me
con aristas que no estn en C. Obsrvese tambin que a partir de un camino aumen-

aquellas aristas que estn en A, y aadiendo despus a C las aristas de A que no es


taban inicialmente en C. Este pareamiento nuevo es C A. donde denota o ex
clusivo en conjuntos, esto es, el nuevo pareamiento que consta de aquellas aristas
que estn en C o en A, pero no en ambos.
La figura 7. l(a) muestra un grafo y un pareamiento C que consta de
las aristas gruesas (1,6), (3, 7) y (4, 8 ). El camino 2, 6 , 1, 8 , 4. 9 de la figura 7.17(b)
es un camino aumentado relativo a C. La figura 7.18 muestra el pareamiento (1,8),
(2. 6 ), (3, 7), (4, 9) obtenido al eliminar aquellas anstas de C que estn en el camino,
y al agregar despus a C las otras aristas del camino.
Ejemplo 7.9.

(a)

(b)

Fig. 7.17.

Pareamiento
8

Camino aumentado

Pareamiento y camino aumentado.

La observacin clave es que C es un pareamiento maximal si, y slo si, no existe


un camino aumentado relativo a C. Esta observacin es la base del algoritmo del pa
reamiento maximal.
Supngase que C y D son parearmentos con l C l < I Di. 0 Cl representa el n
mero de aristas en C.) Para ver que C D contiene un camino aumentado relativo
a C, considrese el grafo G - (V, C D ) . Ya que C y D son pareamientos, cada vr
tice de V es un punto final de hasta una arista de C y un punto final de hasta una
arista de D. As, cada componente conexo de G' forma un camino simple (quiz un
www.FreeLibros.me
ciclo) con aristas alternando entre C y D. Cada camino que no sea un ciclo puede

tenga ms aristas de D o de Q. Cada ciclo'nfeBejin nnjero igual de aristas de C y


D. Ya que I Cl < I >l C b tiene m^aristas deJJjue de C, y de aqu que tenga
por lo menos un camino "aumentado relativo .M -'
Ahora se puede plantear el procedimiento para encontrar un pareamiento maximal C para el grafo G - t K A ) .
,'7 N1.
2.
3.

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.
________

Slo falta mostrar cmo encontrar un camino aumentado relativo a un pareamiento


C, y se har para el caso ms supplp.en el,qu,<r es un grafo bipartido. Se construir
un grafo de cam inos aum entados para G en los niveles / - 0, 1,2, ... por medio de
un proceso similarada-bsquedas ampimidv'Eifcel niVC *t(hse inicia con algn
vrtice sin pareamiento. En un nivel impar i, se agregan vrtices nuevos adyacentes
a u n vrtice n-tm tfHelh
atravsde una arista no pareada-; y tambi-nisc'agrega
esa arista. En n nivel pr i'- se aaden vrtices huevos adyaceatetra'uifwftiicew
un nivel i - 1 gracias a una arista del pareamiento C, junto cori;8 sa ,aiflst8 ;n->."icri
r- Se contina construyendo' el 'grafo de caminos aumeritados nivel a -ivel hasta
q o e se agregue u n vrtice sin parafrriento en un nivel impri o hasta tpie no se'pue
dan agregar ms vrtteiS.'Srun vrriee in {iareamento v s agrega en-tm nivel im
par, el camino eiistehte entre v yiel vrtice inicial del nivel cero-ser un cammo amentad rehWivoaCVSi no^tflywww.FreeLibros.me
ms vrticespard agregar al1cmino umerttado del

' rrafh

o n rtm n W e C irro o m in v

p ra n P 7 fln d rw fi t t n n iip 'V n v rT irp

br camino aumentado ftV ft^ . S hay 'fl'chind ihntiJV^trrde tmprano se c o p a r


;
^ uq, yrjjee sin pa'u n o om iriirri o ic o o o b lo b ii J is d c lo d i e n i (

r c a m f5??lR;?
. n o

/ n no o b n u : 'j o iit o b s b ib n u j o iq no iQ bii-niidB l o d ir . ;r )

(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

o o ro o eito 'i >o s m o g aul

< .b fib ib n u to r q n o >obii >ij,rii-. iu fl!0)ij ' r / v


.(1-.

1=

i ) o b i g i iiD o u

o /o n o j o b n g

t-."

n u

.1 g ..yngt v tt of ,frig>o?;19.;bGrafo de caminos aumentados,-no() U*


av iA o D n n u o b i o Igj o e u m lJ o o ir u o b n nu on oitro >>

-- - 0

7 0 ,b i . ' j

obi;. jb W.'.m\ nfnjsnKjiwvj s.l <d*

^ 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

o q f n o i o i ' zp om q fn o' ) .Ir:4a; <'A o b


*l>> 0"*6 , 3

m i r i o b u n ilin >.?!:. -o j O fio rn a iq fn l

d .

fri'y-iolo'j s iiu rra zpininjjtrrc, u?. o b noiviuooip ob

o f oto no) oinonoqmoo o zobo immoono rnsq amstgcoq nu ozndn


r.f
7.1 Describase un algoritmo para insertar y eliminar aristas eiliun grafo no di
rigido representado por medio de una lista de adyacencia. Recurdese que
- 1 0 / i-

- 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

itacin con lista de adyacencia de uq grafo qodirii f l ^ ^ 't'V^ce0''^uM eliminar


1 Wittp! / J s t r l t e : ' S r 'igortrm'Q'
7a primera
ansta en un vrtice utilizando
esta
r
e
p
r
e
s
e
n
t
a
c
i

n
?

C
m o se
www.FreeLibros.me

.. k A uede hacan-nuc las dos,neIrlas a iifire n re se n ta m la -a rista (i. i\s e e n c u e n tr e n

7.3

Considrese el grafo de la figura 7.20. Encuntrese,


a)
b)
c)
d)

7.4

Un
Un
Un
Un

rbol
rbol
rbol
rbol

abarcador de
abarcador de
abarcador en
abarcador en

costo mnimo con el algoritmo de Prim.


costo mnimo con el algoritmo de Kruskal.
profundidad empezando en a y en d.
amplitud empezando en a y en d.

Sea T un rbol abarcador en profundidad, y B las aristas de retroceso de


un grafo conexo no dirigido G - (V, A).
*a) Demustrese que cuando cada arista de retroceso de B se agrega a T,
se obtiene un ciclo nico. Llmese tal ciclo un ciclo bsico.
**b) La com binacin lineal de ciclos C,. C2, ..., C es C , C jQ ... C.
Prubese que se obtiene un ciclo de la combinacin lineal de dos ci
clos no disjuntos distintos.
*c) Demustrese que todo ciclo en G puede expresarse como una combi
nacin lineal de ciclos bsicos.

*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

Implntense los algoritmos de Prim y de Kruskal. Comprense los tiempos


de ejecucin de sus programas en una coleccin de grafos aleatorios.

7.7

Escrbase un programa para encontrar todos los componentes conexos de


un grafo.

7.8

Escrbase un programa de orden 0{n) para determinar si un grafo de n vr


tices contiene algn ciclo.

7.9

Escrbase un programa para enumerar todos los ciclos simples de un grafo.


Cuntos ciclos de este tipo puede haber? Cul es la complejidad en tiem
po del programa?
www.FreeLibros.me

-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

Implntese el algoritmo para encontrar los puntos de articulacin, analizado


en la seccin 7.4.

*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

Mustrese que un grafo completo de n vrtices tiene n"'J rboles abarcadores.


7.14 Encuntrense todos los pareamicntos maximales para la figura 7.16.
7.15

Escrbase un programa para encontrar un pareamiento maximal para un


grafo bipartido.

7.16

Sea C un pareamiento y c el nmero de aristas en un pareamiento maximal.


a) Prubese que existe un camino aumentado relativo a C cuya longitud es
2(1 Cl /c - 1 CI) + 1 como mximo.
b) Prubese que si A es el camino aumentado ms corto relativo a C y si
A' es un camino aumentado relativo a C /4, entonces \ A'\ >
> \ A \ + \ A C\A'L

*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

Sean C y D los pareamientos de un grafo bipartido. Prubese que CZ> tie


ne al menos I Cl - I D i vrtices disjuntos en los caminos aumentados rela
tivos a C.

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

V I V I 4 1 n a r a n a r M m i f * n t r > m a x i m a l f n ora fr o/>nfrnli*< F n P a n o i t i m i .

I ? .

2 / 0 H A5i i MI 1JH 1H / A l t ) /

[2 5 2 1

.rrijBluaiiiti 9b toir.uf\ aol


>2X9 s in 3 no o ls ig no

sm

fiifiq ormi'-jlG >


otea ,oft\qm o') clrcig nu i.

i.r

; n = 'o **> om w ib 2 n > v r | a < i r a r i h n

jj
ig -'Jk

io& tren o nnu k.t o e c b o c fi*>


renirr/ gni oboJ Dnil :n i nup obyriib onirnci u.j .>.y

Iv flv lw l I

?3orJir. : " *>rreir / r r v ab o reu irn o i f-ou nu " ;

,tM.r w u stl I ^ ibq,23lBmixj3m ojf(3jmt)iuq oJ


v

,
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

-o; C i b jIJj 92jdL!7tl .obiliisqitf lBig nu ob aoinoiinaoiBq aol v ' nta?

8 i 1 l'E lm o d lo de clasificacin Interna

-1

81.V

n '-n w i *
b t - ovil

En este captulo, se presentarn los principales algoritmos de clasificacin interna.


Los algoritmos m s simples de ordinario requieren un tiem po 0 (n 2) para clasificar
n objetos y slo son tiles para listas pequeas. U no de los 8% yf!S^^4li1t!acin m s populares es la clasificacin rpida (quicksort), que lleva en promedio un
tiopOi>(lgrt)i'lia' clasifioacriv rpida ftntiond m u y Wn' para la m a y o r ^ r t t de
laS'aplicacioie 42ooTOufn^tishVirtiba*feo;t h 1 pebr-alsio1We'''h 'ttrvp'Oh1j.'tx fit8nrbtrostr>ckJS;!e&mo l'dsifieaoir p f fihdrfttloS ( ^ p i r ij,y ia'cstfiecin
por'intercalacialf/w t/^^tfiiiqoe'ildvan unrieip ^ k ^ y tn 'H 'p ^ r'c a & .ta riq u t
su comporianMeht )err-el ta s o 1prem edi f b <st thlDMCbttib l 'd t -Cldifieaoimrpida; 1 :0-clasificacin!pcBnmteMStat'h, sin ertlbargo,-03twa>biCTii ilccin para clasificacin externa. Se consideraflibiotro'hlgritmdsill&maas'^tasifiCHcinipbr.toberas lo jlasvflccrtipr1trrrtaftfe^Eos'.allirilhOs' pern' Sltd claeirespocialeS'8di'dbsr'Ce!mo' los i#tes eOgiat&l d>'O# W a^Nldiirriltadoi,,rpi'0
cuando son aplicables son muy rpidos, pues requieren slo un tlem p C ^ ^ P l
-pedr casoJ.isfnuB aonirne-) aol ,[8M? 1 lleH ibuhre ol aolBig 3b crmirn.>nf>q Li
.nBqEh'este oapuigiser.supciji'^t |epobjetciS)a>qlaisficari'qrt!registh qttritie-nenm nolejthfidanifxjsf.tlnaiieM campos./ifeuhad c^ave'ekedBiBntipoiparaiebml
-tts(dq6tlidala(hicib doloTderanieiuoitinteal'jfiD'BnteraRfireles; V arCfefelosrriQca
racteres son ejtemph^ com unes 'de stos tiposv aut*que posdq 'geh[ali oiptdeiuwli-

www.FreeLibros.me

ALGUNOS ESQUEM AS SIM PLES DE CLASIFICACION

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

Algunos esquemas simples de clasificacin

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

: '"n' 1 ,:*) !i 7 " l0?


o:u.usno u\r, .o/vi
?.*.*; v*/;;!

Fig. 8.11' 'Aigbtrio de'ctesifiebin dburtUj.

.nnin'.*! omfnogiB to / o<:cm<v.


)El pi|cediinieiuo,/n/e/iwia.se uiilEa en: varios aloritmoside clasificacin y se de
fine et la fguf& 8, 2u;: u jiscri v-us 511
.o b m o w r w j tib 01201 13 n.'i
s

www.FreeLibros.me

254

CLASIFICACION

procedure intercambia ( var x. y tipo_registro )

I intercambia cam bia los valores de x e y 1


var

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.

Para este ejemplo, se emplean las siguientes definiciones de tipos:


type

tipo.clave - array[1..10] of char;


tipo_registro - record
clave. tipo_clave; Inombre del volcn)
ao: integer
end;

El algoritmo de clasificacin de burbuja de la figura 8.1, aplicado a la lista de la fi


gura 8.3, clasifica la lista en orden alfabtico de nombres, si la relacin < en objetos
con este tipo de claves es el orden lexicogrfico habitual. En la figura 8.4, se mues
tran los cinco pasos dados por el algoritmo cuando n - 6. Las lneas indican el punto
sobre el cual se sabe que los nombres son los ms pequeos (en orden alfabtico) y
ocupan el lugar correcto. Sin embargo, despus de /5, cuando todos excepto el l
tim o registro se han colocado en su lugar, el ltim o tam bin debe estar en el lugar
correcto, y el algoritmo termina.
Al principio del prim er recorrido, el Santa Elena sobrepasa a Vesubio, pero no
a Agung. En el resto de este recorrido, Agung sube hasta la parte superior. En el se-

www.FreeLibros.me

ALGUNOS ESQUEMAS SIM PLES DE CLASIFICACION

255

gundo recorrido, Etna sube a la posicin 2. En el tercer recorrido, Krakatoa sobre


pasa a Pele, y la lista queda en orden lexicogrfico; sin embargo, de acuerdo con el
algoritmo de la figura 8.1, se hacen dos recorridos adicionales.
Adune
Agung
Pele
Etna
Etna
Pele
Krakatoa
Etna
Pele
Agung
Krakatoa
Krakatoa
Santa Elena Santa Elena
Vesubio
Vesubio
Santa Elena Vesubio
despus
de z-1

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

Recorridos de la clasificacin de burbuja.

F ig. 8 .4 .

Clasificacin por insercin


El segundo mtodo de clasificacin a considerar se denom ina clasificacin por in
sercin, porque en el i-simo recorrido se inserta el i-sim o elemento A[i) en el
lugar correcto, entre A[ 1], A[2],..., A [ i- 1], los cuales fueron ordenados previamente.
Despus de hacer esta insercin, se encuentran clasificados los registros colocados
en >4(1],..., A[i). Esto es, se ejecuta
for i >2 to n do

m over yi[<] hacia la posicin j < i tal que


y4[z'] < A[k] para j < k < i, y
A[i\ > A \ j - \ \ o y - 1
Para facilitar el proceso de m over A[i], es til introducir un elemento -4[0], cuya cla
ve tiene un valor m enor que el de cualquier clave existente en A[ 1],..., A[n]. Se pos
tular la existencia de una constante -oo de tipo tipo_clave que es m enor que la cla
ve de cualquier registro que pueda aparecer en la prctica. Si ninguna constante -oo
se puede utilizar con seguridad, se debe probar primero si j - 1 al decidir la inser
cin de 4[] antes de la posicin j, y si no, com parar A[) (que se encuentra ahora
en la posicin j ) con A [ j-1]. El programa completo se muestra en la figura 8.5.
(1)
(2)
(3)
(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.

Clasmcacin por insercin.

www.FreeLibros.me

256

c l a s if ic a c i n

Ejetnplec&au Eni& ifiguta 8.6:se raueitr farnt irnfciahdoiifiglira!8.-3\ y:el--jeult


tad'de>4or recorridas :trttcesmas d e tegiasifkaciii por ibserc ib ibara- / 2>r0
Despus de cada recorrido-; est-garantiaado^e los.elejBefitrpQr*iriba d e l lrrte
estarn ordenados entre s, aunque su orden no tenga relacin con los registros encontrad# bjo la lnea,-tos cuales S iftSertarn <4P'*'*s.
-co
-co
Pele
E tn a '
Etna.
Pel^
I&icata
Krakatoa
Agung 1
Agung '
'
Vesu^iq,
V e su ^ 9q.j b
Santa Elena . Santa g le n ^
inicial

-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

Clasificacin por seleccin


La idea en que se sustenta la clasificacin por s^jepin^ t^nj.bj^i
elemental.
el i-simo recorrido se selecciona el registro con la clave m s1pequea, entre
A\j]
A[n], y se intercambia con A[\. Como resultado, desgys de i pasadas, los i re
gistros menores ocuparn [ 1 1 , /'L en el orden clasifiq^ft. s r es.t clasifica
cin por seleccin puede desCriBirS por
for / :=1 to n - 1 do

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.

Complejidad de tiem po de los mtodos


Las clasificaciones de burbuja, por insercin y por seleccin llevan un titftpo CKn2),
y llevarn un tiempo f H ^en'buena parie-de-ls';sec8tiqiaS de entrada de n elemen-

www.FreeLibros.me

ALGUNOS ESQUEMAS SIMPLES DE CtASMnCAerbfc1

$5?

var
clave-m nor:\Y pitL c\\t\ fia 1clave m enor rtcntrda rtfdlrrtententr

recorridod trtiVS ^8e,#frfc.:J f $ \


ftttUceiYrierifl. Integer', 'l posicin d e dVjrnrtdf"

begih
for1'P M to n-4 do bgh

(I f

'elegir fe] -wienof'dntre /t[],VJ.J>lffl] e'ifrtdrhtrifbtrl con ^f/]


n d ic e -m e n a * -rA
c la v e -m e n o r : - A[i].clave,

(2)
(3)

i o r j : - i ,'*> : t i t o n d o

p ty

com para'fladitlave .coiiJa actual c la ie^m en e r


i t A ^ d a v f i r f flqve-fienortiixa begin
clave-menor :- [j).clave;

e l:

($

()
(7)

jtndipe^m enor j-t/i

(.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

n W " ' p.w j u y t

Vesubio ' 1 Sbnt'El'tf1


Santa Elena Vesubio
rrm rn

19JJ

RecorridOB d e lS'Clasifidaoin

tosi Considrese la clasificacin de btwboj d e la figura 8.1. Sin im portar qu tipoii


registro sea, intercam bia lleva un tiempo constante!. -AS, lasjneas (-3) v (4>de la fi
gura 8.1 consumen hasta c, unidades-de tiempo para alguna constante c ^ P o r tantoJ
para un valor fijo de ij e lc c lo d e b s iin e a s (2 )a { 4 ) lleva hasta c n - \ ) pasos, para
alguna constante c2\ la ltim a constante es algo m ayor que t , para-justificar los de
crementos y pruebas de j . En consecuencia, el programa completo requiere
V'
ty t -V2 *

'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

i pasos para alguna constante c. Esta suma es 0 (n J).


1-2
Sera aconsejable com probar que si en un inicio el arreglo est clasificado en or
den inverso, se ejecutar i - 1 veces el ciclo while de las lneas (4) a (6), as que la
( / - 1) - n(n - l)/2 veces. Por tanto, la clasificacin por ini-2
sercin requiere un tiem po ft( n 2) en el peor caso. Se puede dem ostrar que este lm ite m enor interno vale tambin para el caso promedio.
Por ltimo, considrese la clasificacin por seleccin de la figura 8.7. Se puede
com probar que el ciclo for interno de las lneas (4) a (7) lleva un tiempo 0(n - 0.
puesto que j va desde i + 1 hasta n. As, el tiempo total que requiere el algoritmo es
lnea (4) se ejecuta

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

( ') - n(n - l)/2

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

ALGUNOS ESQUEMAS SIMPLES DE CLASIFICACION

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).

Limitaciones de los algoritmos simples


Se debe tener presente que los algoritmos mencionados en esta seccin tienen un tiem
po de ejecucin 0 (n 2), tanto en el peor caso como en el promedio. As, para una n
grande, ninguno de esos algoritmos se compara de modo favorable con los algorit
mos O(n\ogn) que se analizarn en las siguientes secciones. El valor de n para el cual
esos algoritmos ms complejos se hacen mejores que los simples, depende de diver
sos factores, como la calidad del cdigo objeto generado por el compilador, la m
quina con que se ejecutan los programas y el tam ao de los registros que se deben
intercambiar. La experimentacin con un programa que registre tiempos de ejecu
cin (profiler) es una buena forma de determ inar el punto de ruptura. Una regla ra
zonable es que a menos que n sea aproxim adam ente 100, puede ser una prdida de
tiempo implantar un algoritmo ms complicado que los estudiados en esta seccin. La
clasificacin de Shell, una generalizacin de la clasificacin de burbuja, es un algo

www.FreeLibros.me

260

CLASIFICACION

ritm o de clasificacin 0 ( n 's) simple, muy sencillo de am pliar y razonablemente efi


ciente para valores m odestos de n. La clasificacin de Shell se presenta en el ejer
cicio 8.3.

8 .3

Clasificacin rpida (quicksort)

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

concluido concluido particin v = 6 concluido


5

/
nivel 5

/
5

concluido
Fig. 8.9.

/ \

concluido

Operacin de la clasificacin rpida.

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)

if de A[i\ a A \j] existen al menos dos claves distintas then begin

(2)
(3)

sea v la mayor de las dos claves distintas encontradas;


perm utar A[i],...^4[j] de m anera que para alguna k entre
/'+! y j, A[\,..., A[k - I] tengan claves menores que
v y los elementos A[k\,...yA\j) tengan claves > v
quicksort(i, k - 1);
quicksort(k, j)

(4)
(5)
end

Fig. 8.10.

Esbozo de la clasificacin rpida.

function encuentra^pivote ( i, j: integer ) ; integer;

I devuelve 0 si A [i\,...A \j\ tienen claves idnticas; de otra forma, devuel


ve el ndice de la mayor de las dos claves diferentes de ms a la izquierda l
var

primera-dave. tipo_clave; I valor de la primera clave encontrada,


es decir, A[i].clave |
le. integer; | va de izquierda a derecha buscando una clave diferente I
begin

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.

claves < pivote

i
Fig. 8.12.

I.

claves > pivote

Situacin durante el proceso de permutacin.

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

Probar. Si z > d (lo que en la prctica significa que z = d + 1), entonces se ha


dividido A[i\ , .... A[j\ en forma satisfactoria, lo cual basta.
Desviar. Si z < d { obsrvese que no se puede parar durante el rastreo con z - d,
porque uno u otro se mover ms all de una clave dada), se intercam bia A[z]
con A[d], Despus de hacerlo, A[z] tiene una clave m enor que el pivote y A[d]
tiene una clave por lo menos igual que el pivote, y se sabr que en la siguiente
fase de rastreo z se mover al menos una posicin a la derecha, en la A[d] an
terior y d se mover al menos una posicin a la izquierda.

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

Tiempo de ejecucin de la clasificacin rpida


Ahora se mostrar que el algoritmo lleva en prom edio un tiem po 0(n\ogn) para cla
sificar n elementos, y que en el peor caso lleva 0 ( n 2). El prim er paso en la demos
tracin de am bas proposiciones es probar qu particin lleva un tiem po proporcio
nal al nm ero de elementos que deber separar, es decir, un tiem po 0 ( j - i + 1).

(1)
(2)
(3)
(4)
(5)
(6)

procedure quicksort ( i, j: integer );


I clasifica los elementos A [i\,...A \ del arreglo externo A
var
pivote. tipo_clave; | el valor del pivote |
ndice-pivote, integer; I el ndice de un elemento de A donde clave es
el pivote}
kr. integer, | ndice al inicio del grupo de elementos > pivo te}
begin
ndice-pivote ;= encuentra-pivote(ij);
if ndice-pivote < > 0 then begin { no hacer nada si todas las claves
son iguales}
p ivo teA [indice-pivote].clave,
k
particinU, j, pivote)-,
quicksorl{i,k - 1);
quicksort(k,j)
end
end; quicksort}
Fig. 8.14.

El procedim iento quicksort.

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.

Peor secuencia posible de selecciones de pivotes.

www.FreeLibros.me

266

CLASIFICACION

La profundidad de r, es n - i + 1 para
n - 1. As, la suma de las profundidades es

2< / < n, y laprofundidad

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.

Anlisis del caso promedio de la clasificacin rpida


Como siempre, se interpreta caso promedio para un algoritmo de clasificacin
como el prom edio sobre todas las clasificaciones iniciales, dando igual probabilidad
a cualquier clasificacin posible. Por simplicidad, se supondr que no existen dos
elementos con claves iguales. En general, las igualdades entre elementos hacen la ta
rea de clasificacin ms fcil, nunca m s difcil.
Una segunda suposicin que hace ms fcil el anlisis del algoritmo de clasifica
cin rpida es que, cuando se llama a quicksort(i, j), todas las clasificaciones para
A[i] , ..., A\j) son igualmente probables. La justificacin es que antes de la llamada,
no haba pivotes con los cuales A[i] , ..., A\j] se pudieran com parar para distinguirlos
entre s; es decir, para que todos fueran menores que el pivote v, o para que todos
fueran mayores. Una revisin cuidadosa del programa desarrollado muestra la pro
babilidad de que cada elemento pivote concluya cerca del extremo derecho del subarreglo de elementos mayores o iguales que l, pero para subarreglos grandes, el he
cho de que el elemento m nim o (el pivote previo) pueda aparecer cerca del extremo
derecho no marca una diferencia considerable t.
Ahora, sea T(n) el tiempo prom edio consumido por la clasificacin rpida para
ordenar n elementos. Es evidente que 7~( I) es alguna constante c,, ya que en un ele
mento esta clasificacin no hace llamadas recursivas a s mismas. Cuando n > 1,
como se supone que todos los elementos tienen claves distintas, se sabe que la cla
sificacin rpida tom ar un pivote y dividir el subarreglo, consumiendo un tiempo
c:n para hacerlo, para alguna constante c2, y despus llamar a la clasificacin en los
dos subarreglos. Sera bueno poder pedir que el pivote tuviera la misma probabili
dad de ser el primero, segundo, ..., n-simo elemento en el orden clasificado, para
el subarreglo que se est ordenando. Sin embargo, para garantizar que la clasifica
cin rpida encuentre por lo menos una clave m enor que cada pivote y al menos
una igual o m ayor que el pivote (de modo que cada fragmento sea m enor que el to
tal y, por tanto, no sean posibles los ciclos infinitos), siempre se escoge el mayor de
los dos primeros elementos encontrados. Resulta que esta seleccin no afecta a la distri
bucin de tam aos de los subarreglos, pero tiende a hacer los grupos izquierdos
(aquellos que son menores que el pivote) ms grandes que los grupos derechos.
t Si hay una razn para creer que los ordenam ientos no aleatorios de elem entos pueden hacer que quick
sort se ejecute ms lentam ente de lo esperado, el programa quicksort debera permutar aleatoriam ente los
elem entos del arreglo antes de la clasificacin.

www.FreeLibros.me

CLASIFICACION RAPIDA (Q U IC K S O R T )

267

Se har el desarrollo de una frmula para la probabilidad de que el grupo iz


quierdo tenga i de los n elementos, en el supuesto de que todos los elementos son
distintos. Para que el grupo izquierdo tenga i elementos, el pivote debe ser el (/ + l )simo elemento entre los ti. El pivote, por el mtodo de seleccin, poda haber es
tado en la primera posicin, con alguno de los i menores como segundo, o bien pudo
haber sido el segundo, con uno de los i menores como primero. La probabilidad de
que cualquier elemento en particular, tal como el (i + l)-simo, aparezca primero en
una secuencia aleatoria, es 1In. Dado que apareci primero, la probabilidad de que
el segundo elemento sea uno de los i elementos ms pequeos, de los n - I elemen
tos restantes es i/[n - 1). As, la probabilidad de que el pivote aparezca en la prime
ra posicin y sea el nm ero / + 1 de los n en el orden apropiado, es i/n(n - 1). En
forma semejante, la probabilidad de que el pivote aparezca en la segunda posicin
y sea el nmero i + 1 de los n en el orden clasificado es i/n(n - 1), as que la proba
bilidad de que el grupo izquierdo sea de tam ao i es 2i/n(n - 1), para ! < / < .
Ahora, se puede escribir una ecuacin de recurrencia para Tin).
f( n ) s

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

2 / ( 0 = " i fin -i)


i-i

(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

A continuacin, se aplica (8.3) a (8.4), con _/(/) - TU). Esta transformacin da


Tin) <

O n~ I
7*() + c2n
n ~ l ,=i

(8.5)

Obsrvese que (8.4) es la ecuacin de recurrencia que se obtendra si todos los


tam aos entre 1 y n - 1 para el grupo izquierdo fueran igualmente probables. Asi,
tom ar como pivote la m ayor de dos claves en realidad no afecta a la distribucin de
tamaos. Se estudiarn recurrencias de esta forma con mayor detalle en el captu
lo 9. Aqu se resolver la recurrencia (8.5) proponiendo una solucin y demostrando
que funciona. La solucin propuesta es que T(n) < cnlog/i para alguna constante c
y toda n > 2.
Para demostrar que esta suposicin es correcta, se efecta una induccin sobre n.
Para n - 2, slo se observa que para alguna constante c, 7(2) < 2clog2 - 2c. Para
comprobar la induccin, se supone que T(i) ^ c/log; para i < n, y se sustituye esta
frmula por T(i) en el lado derecho de (8.5) para dem ostrar que la cantidad resul
tante no es mayor que c/ilogn. As, (8.5) se convierte en
Ir "~ l

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

' lo8 '

+ 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.

Mejoras a la clasificacin rpida


Quicksort es muy rpido, su tiempo prom edio de ejecucin es menor que el de todos
los algoritmos de clasificacin O(nlogn) conocidos en la actualidad (en un factor
constante, por supuesto). Es factible m ejorar an ms el factor constante al tom ar
pivotes que dividan cada subarreglo en partes similares. Por ejemplo, al dividir siem
pre los subarreglos en partes iguales, cada elemento ser de profundidad exactamen
te logn. en el rbol de particiones semejante al de la figura 8.9. En comparacin, la
profundidad prom edio de un elem ento para quicksort. como se constituy en la fi
gura 8.14, es de cerca de 1.41ogn. Asi, cabe esperar un incremento en la velocidad
de quicksort seleccionando los pivotes con cuidado.
Por ejemplo, se pueden escoger tres elementos de un subarreglo al azar y tom ar
el elemento medio como pivote. Se pueden tom ar k elementos al azar para cualquier
k. clasificarlos por una llamada recursiva a la clasificacin rpida o por uno de los
algoritmos ms simples de la seccin 8.2, y elegir el elem ento medio, es decir, el ele
mento [(* + 1)/2]-simo como pivote t- Es un ejercicio interesante determ inar el me
jor valor de k como una funcin del nm ero de elem entos del subarreglo a clasificar.
Si k es muy pequea, se malgasta el tiempo, porque, en prom edio, el pivote divi
dir los elementos de forma desigual. Si k es muy grande, llevar demasiado tiempo
encontrar el elemento medio de los k elementos.
Otra mejora de la clasificacin rpida est relacionada con lo que sucede cuando
se toman subarreglos pequeos. Recurdese de la seccin 8.2 que los mtodos sim
ples 0 (n 2) son mejores que los mtodos O(nlogu) para n pequeas. La pequeez de
n depende de muchos factores, como el tiem po em pleado en una llamada recursiva,
la cual es una propiedad de la arquitectura de la m quina y de la estrategia utiliza
da por el compilador para realizar las llamadas a procedimientos en el lenguaje en
que se escribi el mtodo de clasificacin. Knuth [1973] sugiere 9 como el tam ao
del subarreglo en el que quicksort debe llam ar a un algoritmo de clasificacin ms
simple.
Existe otra forma de acelerar quicksort. que en realidad es una forma de can
jear espacio por tiempo; la misma idea es vlida para cualquier otro algoritmo de
clasificacin. Si se tiene espacio disponible, se crea un arreglo de apuntadores a los
registros del arreglo A. Se efectan las comparaciones entre las claves de los regis
tros apuntados, pero sin m over los registros; en vez de eso, se mueven los apunta
dores a los registros de la misma forma que la clasificacin rpida mueve los regis
tros. Al final, los apuntadores, ledos de izquierda a derecha, apuntan a los registros
t D ado que slo se desea la mediana y no la lista com pleta clasificada de k elem entos, puede ser mejor
usar uno de los algoritmos de la seccin 8.7. que encuentran la m ediana con rapidez

www.FreeLibros.me

270

CLASIFICACION

en el orden deseado, y ser relativamente fcil reordenar los registros de A en el or


den correcto.
De esta forma, slo se hacen n intercam bios de registros, en lugar de Onlogn),
lo cual significa una diferencia sustancial si los registros son grandes. Por el lado ne
gativo, se requiere espacio adicional para el arreglo de apuntadores, y el acceso a las
claves para efectuar las comparaciones es ms lento que antes, ya que se debe seguir
prim ero el apuntador, y luego ir al registro, para conseguir el campo de la clave.

8 .4

Clasificacin por montculos iheapsort)

En esta seccin se desarrolla un algoritmo de clasificacin llamado clasificacin por


montculos (heapsort) cuyo peor caso y el caso prom edio son 0(nogn). Este algoritmo
puede expresarse en forma abstracta por medio de las cuatro operaciones de con
juntos INSERTA, SUPRIM E, VACIA y MIN, presentadas en los captulos 4 y 5. Su
pngase que L es la lista de elementos que se va a clasificar y 5 es un conjunto de
elementos de tipo tipo_registro que se usar para guardar los elementos conforme
se clasifican. El operador MIN se aplica al campo de la clave de los registros; esto
es, MIN(S) devuelve el registro en 5 cuya clave tiene el valor ms pequeo. La fi
gura 8.16 presenta el algoritmo de clasificacin abstracto que se transform ar en una
clasificacin por montculos.
(1)
(2)
(3)
(4)
(5)
(6)

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.

Algoritmo abstracto de clasificacin.

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

CLASIFICACION POR M ONTICULOS ( H E A P S O R D

271

operaciones INSERTA y SU PR IM E-M IN en un tiem po 0(logn) por operacin.


Mientras que el rbol parcialmente ordenado no puede m anejar la operacin gene
ral SUPRIME en un tiem po 0(logn) (slo encontrar un elemento arbitrario lleva un
tiempo lineal en el peor caso), debe hacerse notar que en la figura 8.16, los nicos
elementos que se eliminan son los encontrados como minimales. As, las lneas (4)
y (6) de la figura 8.16 pueden combinarse en una funcin SUPRIM E_M IN que de
vuelve el elemento y. Con esto se puede obtener el algoritmo de la figura 8.16 con la
estructura de datos rbol parcialmente ordenado de la seccin 4.11.
Es necesaria una modificacin ms al algoritmo de la figura 8.16 para evitar im
primir los elementos conforme se eliminan. El conjunto S siempre estar almacena
do como un montculo en la parte superior del arreglo A. como -4(1], ..., A[i] si S
tiene ; elementos. Por la propiedad de rbol parcialmente ordenado, el elem ento ms
pequeo estar siempre en -4[ 1]. Los elementos que se van elim inando de S pueden
almacenarse en A[i + 1],..., A[n], clasificados en orden inverso, es decir, con A[ + 1] >
> A[i + 2] > ... > A[n] f. Como A[ 1] debe ser el menor de A[ 1],..., A[i], puede efec
tuarse la operacin SUPRIM E_M IN simplemente intercam biando A[ 1] con A[i\. Ya
que el nuevo A[i) (el anterior .4(1]) no es m enor que A[i + 1] (o el anterior se habra
eliminado de 5 antes que el ltimo), se tienen A[i] , ..., A[n] clasificados en orden de
creciente. Se puede considerar que S se encuentra ocupando /4[1], ..., A[i - 1].
Dado que el .4(1] nuevo (-4[/] anterior) viola la propiedad de rbol parcialmente
ordenado, debe descender en el rbol como en el procedimiento SUPRIM E_M IN
de la figura 4.23. Aqu se utiliza el procedimiento empuja, que se muestra en la fi
gura 8.17, que opera sobre el arreglo A definido en forma externa. Mediante una se
cuencia de intercambios, empuja lleva el elemento A[primero] hasta su lugar adecua
do entre sus descendientes en el rbol. Para restaurar la propiedad de rbol parcial
mente ordenado en el montculo, empuja se llama con primero = 1.
Las lneas (4) a (6) de la figura 8.16 funcionan de la siguiente manera. La selec
cin del mnimo en la lnea (4) es fcil: siempre se encuentra en A[ 1] gracias a la pro
piedad de rbol parcialmente ordenado. En vez de imprim ir en la lnea (5), se in
tercambia .4(1] con A[i\, el ltimo elemento del montculo actual. Esto simplifica la
eliminacin del elem ento mnimo en el rbol parcialmente ordenado; slo se dism i
nuye /', el cursor que indica el fin del montculo actual. Entonces, se invoca empuja
( 1 , 0 para restituir la propiedad de rbol parcialmente ordenado al montculo,
^[i]
m
La prueba de ausencia de elementos de 5 realizada en la lnea (3) de la figu
ra 8.16, se hace probando el valor de i, el cursor que marca el fin del m ontculo ac
tual. Slo resta ahora considerar cmo trabajan las lneas (1) y (2). Se puede supo
ner que L est presente originalmente en -4(1], ..., A[n\, en algn orden dado. Para
establecer inicialmente la propiedad de rbol ordenado, se llama empuja (/, n) para
toda j - n2, n /2 - 1, ..., 1. Obsrvese que despus de las llamadas a empuja (/, n), no
se viola la propiedad de rbol parcialm ente ordenado en A \j] , ..., A[n], porque al em
pujar en el rbol un registro no se introducen nuevas violaciones, pues slo se interf Al final, se podra invertir el arreglo A. pero si se desea que -I term ine clasificado de menor a mayor,
sim plem ente se aplica un operador SU PRIM E_M A X en lugar de SU PR IM E_M IN , y se ordena A parcial
mente, de m odo que un padre no tenga claves m enores (en vez de mayores) que sus hijos.

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.

Anlisis de la clasificacin por montculos


Examnese ahora el procedim iento empuja para saber el tiem po que requiere. Una
inspeccin de la figura 8.17 confirma que el cuerpo del ciclo while lleva un tiempo
constante. Adems, despus de cada iteracin, r tiene por lo menos el doble del va
lor que tena. As, puesto que r empieza igual a primero, despus de i iteraciones se
tiene, r > primero*2'. Es seguro que r > ltimo/2 si primero*2' > ltimo/2, esto es si
/ > log {ltimo!primero) - 1

(8.8)

procedure empuja {primero, ltimo: integer);

|supone que A[primero], ..., A[ltimo] obedece la propiedad de rbol


parcialm ente ordenado, excepto, quiz, para el hijo de A\primer\. El
procedimiento empuja A[primero] hasta que se restituye la propiedad
de rbol parcialmente ordenado I
var

r integer; I indica la posicin actual de Afprimero] i


begin

primero',! asignacin de valores iniciales I

while r < - ltimo div 2 do


if ltimo - 2 *r then begin i r tiene un hijo en 2*r |
if A[r].clave > A[2+r].clave then

intercambia {A[r\, A[2*r])\


r
ltimo I fuerza la term inacin del ciclo while 1
end
else : r tiene dos hijos, los elem entos ubicados en 2r y 2*r+l j
if A[r].clave > A[2*r).cla\e and
A[2*r].clave < - y4[2*r+l].c/av* then begin

I intercam bia r con su hijo izquierdo I


intercambia(A[r], A[2*r])\
r
2*r
end
else if A[r].clave > A[2*r+ 1].clave and
^[2*r+l].c/av> < A[2r].clave then begin

i intercam bia r con su hijo derecho I


intercambict{A[r], /4[2*r+l]);
r
2* r+1
end
else | r no viola la propiedad de rbol parcialmente

ordenado I
r : ltimo I para forzar la term inacin del ciclo while
end; I empuja I

Fig. 8.17.

El procedim iento empuja.

www.FreeLibros.me

CLASIFICACION PO R M ON TICULOS (H EAPSO RT)

273

Aqu, el nm ero de iteraciones del ciclo while en empuja es log(ltimo/primero) a lo


sumo.
Dado que primero > 1 y ltimo < n e n cada llamada que el algoritmo de la fi
gura 8.18 hace a empuja, (8.8) dice que cada llam ada a empuja, en la lnea (2) o (5)
de la figura 8.18, lleva un tiem po 0(logn). Es evidente que el ciclo de las lneas (1)
y (2) se ejecuta n/2 veces, as que el tiem po dedicado es )(nlogn) t- Tam bin el ci
clo de las lneas (3) a (5) se ejecuta n - 1 veces. As un tiem po total 0(n) se consume
en todas las repeticiones de intercambia en la lnea (4), y O(nlogn) durante las repe
ticiones de la lnea (5). As, el tiem po total gastado en el ciclo de las lneas (3) a (5)
es <9(nlogn), y todo heapsort lleva un tiempo 0(n\ogn).
procedure heapsort;

clasifica el arreglo /[l],...,/l(n] en orden decreciente I


var
i: integer; I cursor hacia A |
begin

(1)

(2)
(3)
(4)
(5)

I establece inicialmente la propiedad de rbol


parcialm ente ordenado I
for i n
div 2 downto 1 do
empuja(i,n)\
for i:- n downto 2 do begin
intercambia{A[l], a(/]);
I elim ina el m nim o del frente del m ontculo )
em puja{l, i-1)
restablece la propiedad de rbol parcialm ente o rd e n ad o !
end
end; | heapsort j

Fig. 8.18.

El procedim iento heapsort.

A pesar de su tiem po 0(nlogn) en el peor caso, heapsort llevar en prom edio ms


tiempo que quicksort, en un pequeo factor constante. La clasificacin por m ont
culos tiene inters intelectual porque es el prim er algoritmo O(nlogn) en el peor caso
que se ha estudiado. Es de utilidad prctica cuando no se desea clasificar los n ele
mentos, sino slo las k menores de entre ellos,
con k mucho m enor que n.
Como se mencion antes, las lneas (1) a (2) en realidad slo requieren un tiem po
0(n). Si se realizan slo k iteraciones de las lneas (3) a (5), el tiem po empleado en

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

Clasificacin por urnas

Iblnsort)

Se plantea la cuestin de si son necesarios Q(nlog/i) pasos para clasificar n elemen


tos. En la siguiente seccin se m ostrar que se es el caso de los algoritmos de cla
sificacin que no suponen algo acerca del tipo de datos de las claves, excepto que
pueden ordenarse m ediante alguna funcin que indica si el valor de alguna clave es
m enor que otro. En muchas ocasiones es posible clasificar en tiempos menores a
Ofnlog/i), siempre que se conozca algo especial acerca de las claves que se estn clasi
ficando.
Ejemplo 8.5. Supngase que tipo.clave es entero, y que se sabe que los valores de
as claves se encuentran en el intervalo de 1 a n, sin duplicados, donde n es el n
m ero de elementos. Entonces, si A y B son del tipo array [l..n] of tipo_registro, y
los n elementos a clasificar estn almacenados inicialmente en A, es posible colocar
los en orden en el arreglo B, por medio de
for /
1 to n do
B[A[i). clave]

(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])-,

El programa (8.9) dado en el ejemplo 8.5 es un caso simple de una clasificacin


por urnas (binsort), un proceso de clasificacin donde se crea una urna para con
tener todos los registros con cierta clave. Se examina cada registro r a clasificar y se

www.FreeLibros.me

CLASIFICACION PO R URNAS (BINSO RT)

275

coloca en la urna de acuerdo con el valor de la clave de r. En el programa (8.9), las


urnas son los elementos del arreglo f[l],
B[ri\, y B[i\ es la urna para la clave
cuyo valor es i. Se pueden usar elementos del arreglo como urnas en este caso sim
ple, porque se sabe que nunca habr ms de un elem ento en una urna. Ms an, no
es necesario ensam blar las um as en una lista clasificada, porque B sirve com o tal
lista.
En el caso general, sin embargo, a veces puede ser necesario alm acenar ms de
un registro en una urna y enlazarlas (o concatenarlas) en el orden apropiado. En
otras palabras, supngase que, com o siempre, -4(1]
A[n] es un arreglo del tipo
tipo_registro, y que las claves de los registros son del tipo tipo_clave. Slo a efectos
de esta seccin, se supondr que tipo_clave es un tipo enumerado, tal como \..m o
char. Sea tipo-lista un tipo que representa listas de elementos de tipo tipo_registro;
tipo_lista puede ser cualquiera de los tipos para listas mencionados en el captulo 2,
pero una lista enlazada es m s efectiva, ya que se generarn listas de tam ao impredecible en cada urna; con todo, las longitudes totales de las listas estarn fijadas en
m, y, por tanto, un arreglo de n celdas puede proporcionar las listas para las um as
segn sea necesario.
Por ltimo, sea B un arreglo del tipo array[tipo_clave] of tip o Jista . Entonces,
B es un arreglo de urnas, que son listas (o, si se usa la representacin enlazada de
listas, encabezado de listas). B est indizada p o r tipo_clave, as que existe una
urna para cada posible valor de clave. D e esta form a se puede efectuar la primera
generalizacin de (8.9): las um as tienen capacidad arbitraria.
Ahora, es necesario considerar cmo se concatenarn las um as. De m anera abs
tracta, partiendo de las listas a ,, a 2, ..., a y b u b2, ..., bp debe formarse la concate
nacin, que ser a u a2, ..., a, b, b u b2, ..., br La realizacin de esta operacin CONCATENA(L,, L 2), que reemplaza la lista L x por la concatenacin L, L 2, puede efectuar
se en cualquiera de las representaciones de listas estudiadas en el captulo 2.
Sin embargo, por eficiencia, es til tener un apuntador al ltim o elemento en
cada lista (o al encabezado si la lista se encuentra vaca), adem s de uno de encabe
zamiento. Esta modificacin facilita la bsqueda del ltimo elemento en la lista L, sin

Fig. 8.19.

Concatenacin de listas enlazadas.

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.

Program a abstracto de clasificacin por urnas.

Anlisis de la clasificacin por urnas


Se pretende que si hay n elem entos a clasificar y m valores distintos de claves (y, por
tanto, m urnas distintas), el programa de la figura 8.20 lleva un tiempo 0(n + m),
si la estructura de datos empleada para las urnas es la adecuada. En particular, si m <
< n, la clasificacin por urnas lleva un tiempo 0(n). La estructura de datos en cues
tin es una lista enlazada. Los apuntadores a los finales de las listas, como se indica
en la figura 8.19. son tiles, pero no indispensables.
El ciclo de las lneas (1) a (2) de la figura 8.20, que coloca los registros en las ur
nas, lleva un tiem po 0{n), debido a que la operacin INSERTA de la lnea (2) re
quiere un tiempo constante, pues la insercin siempre se hace al principio de la lista. Para

www.FreeLibros.me

CLASIFICACION POR URNAS (B IN S O R T )

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).

Clasificacin de grandes conjuntos de claves


Si m. el nmero de claves, no es m ayor que n, el nm ero de elementos, el tiempo
de ejecucin CKn + m) del procedimiento de la figura 8.20 es en realidad CK::). Pero
qu sucedera si m = n2? Evidentemente, la figura 8.20 necesitar CKn + n2). lo cual
es CKn2). Ser posible aprovechar el hecho de que el conjunto de claves est limi
tado para optim ar el algoritmo? La respuesta sorprendente es que aun si el conjunto
nk. para cualquier k fija, existe una generalizacin de
de claves posibles es 1 ,2
la tcnica de clasificacin por urnas, que requiere un tiempo de slo CKn).
Ejemplo 8.6. Considrese el problema especfico de clasificacin de n enteros en el
intervalo de 0 a n2 - 1. Se clasificarn los n enteros en dos fases; la primera parece
que no es de mucha ayuda, pero es esencial. Se emplean n urnas, una para cada en
tero entre 0 y n - 1. Se coloca cada entero i de la lista a clasificar dentro de la urna
numerada i mod n. Sin embargo, a diferencia de la figura 8.20, es im portante agre
gar cada entero al final de la lista de la urna, no al principio. Si se quiere que la agre
gacin sea eficiente, hace falta la representacin de listas enlazadas para cada urna
con apuntadores a los finales de las listas.
Por ejemplo, supngase que n = 10. y que la lista a clasificar est constituida por
los cuadrados perfectos desde 0: hasta 9: en el orden aleatorio 36. 9, 0. 25, 1, 49,
64, 16, 81, 4. En este caso, donde n = 10, la urna para el entero i slo es el dgito
ms a la derecha de i escrito en decimal. La figura 8.21 (a) m uestra la colocacin de
esta lista en las urnas. Obsrvese que los enteros aparecen en las urnas en el mismo
orden en el cual aparecen en la lista original; por ejemplo, la urna 6 contiene 36. 16,
y no 16, 36, debido a que 36 precede a 16 en la lista original.
Ahora, se concatenan en orden las urnas, produciendo la lista
0, 1, 81, 64, 4. 25, 36, 16, 9. 49

(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

En la lista creada por la concatenacin de las urnas, los enteros se redistribuyen


en urnas, pero con una estrategia de seleccin diferente. Ahora se coloca el entero i
dentro de la urna [i/n\, esto es, el mximo entero m enor o igual que i/n. De nuevo,
los enteros se agregan al final de las listas de las urnas. Al concatenar en orden las
urnas, se observa que la lista est clasificada.
En el presente ejemplo, la figura 8.21 (b) muestra la lista (8.10) distribuida en
las urnas con / contenido en la urna 1//10J.
Para ver por qu este algoritmo funciona, hay que observar que cuando varios
enteros se colocan en una urna, como sucedi con 0, 1, 4 y 9, que se colocaron en
la urna 0, deben estar en orden creciente, ya que la lista (8.10) resultante del primer
recorrido los orden de acuerdo con el dgito ms a la derecha. As, en cualquier
urna los dgitos de ms a la derecha deben form ar una secuencia creciente. Por su
puesto, cualquier entero colocado en la urna i debe preceder a un entero colocado
en una urna mayor que i, y al concatenar en orden las urnas se produce la lista orde
nada.
Urna
0
1
2
3
4
5
6
7
8
9

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)

Clasificacin por urnas en d o s recorridos.

En form a ms general, pueden considerarse los enteros entre 0 y n2 - 1 como n


meros de dos dgitos con base n y usar el mismo argumento para comprobar que la
estrategia de clasificacin funciona. Sean los enteros i = an + b y j = en + d, donde
a, b, c y d se encuentran en el intervalo 0 a n - 1; esto es, son dgitos de base n.
Supngase que i < j , entonces a > c no es posible, y debe suponerse que a < c. Si
a < c, i aparece en una urna m enor que j despus del segundo recorrido, por lo que
/ preceder a j en el orden final. Si a = c, b debe ser menor que d. Despus del pri
mer recorrido, i precede a j, ya que i fue colocado en la um a b. y j, en la d. As, aun
que i y j se colocan en la misma um a a (la m itad que c), i se inserta antes que j en
la uma.

www.FreeLibros.me

CLASIFICACION PO R URNAS (B IN S O R T )

Clasificacin general por residuos

279

Iradix sort)

Supngase que tipo_clave es una secuencia de campos, como en


type
tipo_clave - record
da: 1..31;
m e s : (ene dic);
ario: 1900.. 1999;
end;

(8.11)

0 un arreglo de elementos del mismo tipo, como en


type
tipo-clave - array[ 1..10) of char;

(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.

Esto es, para alguna j entre 0 y k - 1, a, = b


a, - b t , y aJt[ < bJt
Se pueden considerar las claves del tipo antes definido como si los valores de las
claves fueran enteros expresados en alguna notacin de residuos extraa. Por ejem
plo, (8.12), donde cada cam po es un carcter, puede considerarse como la expresin
de enteros en base 128 o de tantos caracteres com o haya en el conjunto de caracte
res de la m quina empleada. La definicin de tipo (8.11) puede considerarse como
si el lugar de ms a la derecha estuviera en base 100 (correspondiente a los valores
entre 1900 y 1999), el siguiente lugar en base 12, y el tercero en base 31. Desde este
punto de vista, la clasificacin por urnas generalizada se conoce como clasificacin
por residuos (radix sorting). En ltimo caso, se puede emplear para clasificar enteros
hasta cualquier lmite fijo, tom ndolos como arreglos de dgitos de base 2 u otra.
La idea clave de la clasificacin por residuos es ordenar por urnas todos los re
gistros, primero en f h el dgito menos significativo, despus concatenar las urnas,
t O bsrvese que una secuencia que va desde I hasta 0 ( o m s generalmente, desde x hasta y, donde
y < x ) se considera una secuencia vacia.

www.FreeLibros.me

280

CLASIFICACION

primero el m enor valor, clasificar de nuevo en f k. x, y as sucesivamente. Com o en


el ejemplo 8.6, al insertar en las urnas hay que asegurarse de que cada registro se agre
ga al final de la lista, no al principio. El algoritmo de clasificacin por residuos se
esboza en la figura 8.22; la razn de su funcionam iento se ilustr en el ejemplo 8.6.
En general, despus de la clasificacin por urnas en f h f k_ ..., f , los registros apa
recern en orden lexicogrfico si las claves constan slo de los campos f , , f k.

Anlisis de la clasificacin por residuos


Prim ero se debe emplear la estructura de datos adecuada para hacer una clasifica
cin eficiente. Obsrvese que se supone que la lista a clasificar ya est en forma de
lista enlazada, no de arreglo. En la prctica, slo es necesario agregar un cam po adi
cional, el campo de enlace, al tipo tipo_registro, para poder enlazar A[i\ a A [i + 1J
para / - 1 ,2
n - 1 y as hacer una lista enlazada del arreglo A en un tiempo
0(n). Obsrvese tam bin que si se presentan en esta forma los elementos a clasifi
car, nunca se copia un registro. Slo se cam bian registros de una lista a otra.
procedure radixsoft,

I clasifica la lista A de n registros con claves que consisten en campos


/,
de tipos , , tk, respectivam ente. El procedimiento usa los
arreglos B, de tipo array [/,], of tipo_lista para 1 < i < k, donde
tipo_lista es una lista enlazada de registros. I
(1)

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

m over r desde A hasta el final de la urna B,[v], donde v es


el valor del cam po/,' de la clave de r
for cada valor v de tipo l h desde el m enor hasta el mayor do
concatena B,[v] en el extremo de A

(6)
(7)
end

end; | radixsort |
Fig. 8.22.

Clasificacin por residuos.

Como antes, para hacer la concatenacin con rapidez, se necesitan apuntadores


al final de cada lista. Despus, el ciclo de las lneas (2) y (3) de la figura 8.22 lleva
un tiem po 0(s,), donde j, es el nm ero de diferentes valores del tipo tr El ciclo de
las lneas (4) y (5) lleva un tiem po 0(n), y el de las lneas (6) y (7), CH,s,). As, el
k
tiem po total requerido por la clasificacin por residuos es
0(Si + n), lo cual es
*
*
0 (k n +
i), u 0 (n + s), si se tom a k com o una constante.

www.FreeLibros.me

COTA INFER IO R PARA LA CLASIFICACION PO R COM PARACIONES

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

Cota inferior para la clasificacin por comparaciones

Existe un teorema heurstico que dice que la clasificacin de n elementos requie


re un tiem po nlogn. Se estudi en la seccin anterior que esta proposicin no siem
pre es cierta; si el tipo de la clave es tal que la clasificacin por urnas o la clasifica
cin por residuos puedan usarse con ventaja, el tiem po 0 (n ) es suficiente. Sin em
bargo, estos algoritmos de clasificacin se basan en claves de tipos especiales: un
tipo con un conjunto lim itado de valores. Todos los dems algoritmos de clasifica
cin estudiados cuentan slo con el hecho de que se puede probar si una clave es
m enor que otra.
Se debe tener en cuenta que en todos los algoritmos de clasificacin anteriores
a la seccin 8.5, la determ inacin del orden apropiado de los elementos se hace al
comparar dos claves, de m odo que el flujo de control del algoritmo siga uno de los
dos caminos. En contraste, un algoritmo como el del ejemplo 8.5 hace que uno de
n diferentes eventos suceda slo en un paso, al alm acenar un registro con una clave
entera en una de las n urnas, dependiendo del valor de ese entero. Todos los pro
gramas de la seccin 8.5 usan una posibilidad de los lenguajes de programacin y
de las m quinas que es mucho ms poderosa que una simple comparacin de valo
res; es la posibilidad de encontrar en un paso una localidad de un arreglo, dado el
ndice de esa localidad. Pero este poderoso tipo de operacin no es factible si tipo_clave fuera, por ejemplo, real. No es posible, en Pascal ni en muchos otros len
guajes, declarar un arreglo indizado por nm eros reales, y si lo fuera, no se podran
concatenar, en una cantidad de tiem po razonable, todas las urnas correspondientes
a los nmeros reales representables en la m quina.
t Pero en este caso, si los enteros de iogn bits pueden ocupar una palabra, ser m ejor tratar las claves
com o si estuvieran com puestas de un soio cam po, de tipo l..ir, usando una clasificacin por urnas ordina
ria.

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

COTA INFERIOR PARA LA CLASIFICACION POR COMPARACIONES

Fig. 8.23.

283

Arbol de decisin para la clasificacin por insercin con n = 3.

(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.

Tamao de los rboles de decisin


La figura 8.23 tiene seis niveles, que corresponden a las seis posibles disposiciones
de la lista inicial a, b, c. En general, si se clasifica una lista de n elementos, existen
n! - n(n - 1) (n - 2)...(2) (1) resultados posibles, los cuales se encuentran en el orden

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.

Anlisis del caso promedio


Puede haber algn algoritmo que slo use comparaciones para clasificar, y requiera
un tiem po 2 (nlogn) en el peor caso, como todos los algoritmos de este tipo, pero
que el tiem po prom edio requerido sea 0 (n ) o algo m enor que 0(nlogn)? La res
puesta es no, y slo se m encionar cmo probar la aseveracin, dejando los detalles
al lector.
Lo que se desea probar es que en cualquier rbol binario con k hojas, la profun
didad prom edio de una hoja es por lo menos logA:. Supngase que no fuera as, y el
rbol T fuera el contraejem plo con menos nodos. T no puede ser un solo nodo, por
que la aseveracin dice que los rboles de una hoja tienen profundidad promedio

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.

La figura 8.24{a) no puede ser el contraejemplo ms pequeo, porque el rbol


cuya raiz es n tiene tantas hojas como T, pero una profundidad prom edio ms pe
quea. Si la figura 8.24(b) fuera T, los rboles cuyas races son n, y n2, al ser ms
pequeos que T, no violaran la suposicin. Esto es, la profundidad prom edio de las
hojas de 7j es al menos log(Ar,), y la profundidad prom edio de 7\ es por lo menos
log(k 2). Entonces, la profundidad prom edio de T es
log(*,) +
*, + *2

k, + k->

log(*2) +

Como k t + k2 - k, la profundidad prom edio se expresa como


-J-(*,Iog(2*,) + U o g (2 * 2))
k

(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

El problema del clculo de estadsticas de orden consiste en encontrar la clave del


fc-simo registro en el orden clasificado de los registros, dada una lista de n registros
y un entero k. En general, este problema se plantea como encontrar el A:-simo en-

www.FreeLibros.me

286

CLASIFICACION

tre . Ocurren casos especiales cuando k = 1 (encontrar el mnimo), k = n (encon


trar el mximo), y el caso en que n es impar y k = {n + l)/2, que es encontrar la m e
diana.
Ciertos casos del problema son muy fciles de resolver en tiempo lineal. Por ejem
plo, encontrar el m nim o de n elementos en un tiempo 0 ( n ) no requiere nada es
pecial. Como se mencion en relacin con la clasificacin por montculos, si
k < n/\ogn, es posible encontrar el k-sim o de n construyendo un montculo, que
lleva un tiempo 0(n), y despus seleccionar los k elementos ms pequeos en un
tiempo 0 (n + Arlogn) = 0(n). Sistemticamente, se puede encontrar el k- simo de n
en un tiempo 0(n ) cuando k > n - n/\ogn.

Una variante de la clasificacin rpida


Tal vez la forma ms rpida para encontrar el /c-simo entre n, en promedio, es usar
un procedimiento recursivo similar a la clasificacin rpida, que se puede llamar se
lecciona (i. j, k), y que encuentra el fc-simo elem ento entre A[i], ..., A\J] dentro de
un arreglo ms grande A[i), ..., A[n]. Los pasos bsicos de selecciona son:
1.
2.

3.

Tom ar un elemento pivote, como v.


Usar el procedimiento particin de la figura 8.13 para dividir A[i\, ..., A[j] en
dos grupos: A[i\ , ..., A[m - 1] con claves menores que v, y A [m \ , ..., A[j] con cla
ves v o mayores.
Si k < m - r, el -simo entre A[i\, ..., A{j] est en el prim er grupo, se llama
a selecciona (i, m - 1, k)\ si k > m - i, se llama a selecciona ( m ,j , k - m + i).

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).

Mtodo lineal en el peor caso para encontrar estadsticas de orden


Para garantizar que una funcin como selecciona tenga en el peor caso, en vez de
en el caso promedio, complejidad 0(n), es suficiente dem ostrar que en un tiempo
lineal se puede encontrar algn pivote que con certeza est a una fraccin positiva
de la distancia desde cualquier extremo. Por ejemplo, la solucin a (8.14) muestra
que si el pivote-de n elementos nunca es m enor que el elemento (n/10)-simo, ni m a
yor que el elemento (9n/10)-simo, de forma que la llamada recursiva a selecciona
se da como mximo en nueve dcim as del arreglo, esta variante de selecciona ser
0(n) en el peor caso.
La clave para encontrar un buen pivote est contenida en los dos pasos siguientes.
1.

2.

Dividir los n elementos en grupos de cinco, dejando a un lado entre 0 y 4 ele


mentos que no puedan colocarse en un grupo. Clasificar cada grupo de cinco
con cualquier algoritmo y tom ar el elemento central de cada grupo, hasta un to
tal de [rt/5] elementos.
Usar selecciona para encontrar la m ediana de esos [n/5J elementos, o si ln/5] es
par, un elemento en la posicin ms cercana al centro. T anto si ln/5] es par como
si es impar, el elemento deseado estar en la posicin l( + 5)/10J.

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

function selecciona ( i, j, k: integer ) : tipo_clave;


I devuelve la clave del A:-simo elem ento de acuerdo con el orden
de clasificacin entre A[i\,...i\j\ i
var
m : integer; | utilizado como ndice i
begin
if j - i < 7 4 then begin | muy pocos para usar selecciona recursivamente
clasifica
A\j] m ediante algn algoritmo simple;
return (A[i+k-\].clav)
end
else begin I aplica selecciona recursivam ente |
for m : 0 to (j- i- 4) div 5 do
I tom a los elementos m edios de los grupos de cinco
en A[i], /4[/+l],...
encuentra el tercer elem ento entre A[i+5+m] y
/l[/+5*m+4] y lo intercam bia con A[i+m]\
pivote seleccionad, /+(//4) div 5, (/t4) div 10);
! encuentra la m ediana de los elementos medios. Obsrvese
que j - i - 4 aqu es n-5 de la descripcin informal
anterior |
m : particin(i, j, pivote)-,
if k < m - i then
return (seleccionad, m - 1, A:))
else
retuTn{selecciona(m, j, k -(m -i)))
end
end; I selecciona}

Fig. 8.25.

Algoritmo lineal en el peor caso para encontrar el #c-simo elemento.

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 )

c2n + T\n/5) + T(3n/4) si n > 75

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).

Caso en el que existen algunas igualdades entre claves


Recurdese que en la figura 8.25 se supuso que no haba dos claves iguales. La ra
zn de esta suposicin es que en otro caso no puede mostrarse que la lnea (7) di
vide A en bloques de tamao 3/i/4 como mximo. La modificacin requerida para
manipular igualdades entre claves es agregar, despus del paso (7), otro paso tipo par
ticin, que agrupe todos los registros con claves iguales al pivote. Por ejemplo, exis
ten p > 1 de estas claves. Si m - i < k
- i + p , entonces la recursin no es ne
cesaria; simplemente se devuelve A[m). clave. De otra forma, la linea (8) no cam
bia, pero la lnea (10) llama a seleccona(m + p, j, k - ( m - i ) - p ) .

Ejercicios
8.1

Dados los ocho enteros 1, 7, 3, 2, 0, 5, 0, 8. Clasifquense por medio de


a) clasificacin de burbuja, b) clasificacin por insercin, y c) clasifica
cin por seleccin.
8.2 Dados los diecisis enteros 22, 36, 6, 79, 26, 45, 75, 13, 31, 62, 27, 76, 33,
16, 62, 47. Clasifquense usando a) clasificacin rpida, b) clasificacin
por insercin, c) clasificacin por montculos y d) clasificacin por urnas,
tratndolos como pares de dgitos en el intervalo 0 - 9 .
8.3 El procedimiento Shellsort (clasificacin de Shell) de la figura 8.26, algunas
veces llamado clasificacin de incremento decreciente, clasifica un arreglo
A [\..n\ de enteros, al clasificar ni2 pares (j4[i'J, A\n2 + /]) para 1 < i < n/2
en el prim er recorrido, n/4 cudruplos ((/J, A[n!4 + /], A[n!2 + /'],

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

i.j, incr. integer,


begin

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

0 { fuerza la term inacin del ciclo}

end;

incr

incr div 2

end
end; | Shelisort}

Fig. 8.26.

Clasificacin de Shell (S h e l i s o r t ).

a) Clasifquense las secuencias de enteros de los ejercicios 8.1 y 8.2 usan


do Shelisort.
*b) Mustrese que si A[i] y A[n/2k + i] quedan clasificados en el recorrido
k (es decir, fueron intercam biados), entonces esos dos elementos per
manecen clasificados en el recorrido k + 1.
c) Las distancias entre elementos comparados e intercam biados en un re
corrido, dism inuyen como nJl, nJ4, .... 2, 1 en la figura 8.26. De
m ustrese que Shelisort trabajar con cualquier secuencia de distan
cias siempre que la ltima distancia sea 1.
**d) Mustrese que Shelisort trabaja en un tiem po 0 ( '*).
8.4

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

Un algoritmo de clasificacin es estable si conserva el orden original de los


registros cuyas claves son iguales. Cules de los algoritmos de clasificacin
de este captulo son estables?

www.FreeLibros.me

EJERCICIOS

291

*8.6 Supngase que se emplea una variante de la clasificacin rpida, donde


siempre se elige como pivote el primer elemento del subarreglo que se est
clasificando.
a) Qu modificaciones deben hacerse al algoritmo de la figura 8.11 para
evitar ciclos infinitos cuando haya una secuencia de elementos iguales?
b) Demustrese que el algoritmo modificado tiene un tiempo de ejecucin
de 0(nlogn) en el caso promedio.
8.7

Mustrese que cualquier algoritmo de clasificacin que mueva los elemen


tos slo una posicin a la vez, debe tener una complejidad de tiempo de
ft(n 2) al menos.

8.8

En la clasificacin por montculos, el procedimiento enipuja de la figura


8.17 establece la propiedad de rbol parcialmente ordenado en tiempo 0(n).
En vez de empezar en las hojas empujando elementos hasta form ar un mon
tculo, se podra empezar en la raz y em pujar elementos hacia arriba. Cul
es la complejidad de tiempo de este mtodo?

*8.9

Supngase que se tiene un conjunto de palabras, por ejemplo, cadenas de


letras a a z, cuya longitud total es n. Mustrese cmo clasificar esas pala
bras en un tiem po 0(n). Obsrvese que si la longitud mxima de las pala
bras es constante, funcionar la clasificacin por urnas. Sin embargo, debe
considerarse el caso en que algunas palabras sean muy largas.

*8.10

Mustrese que el tiem po de ejecucin de la clasificacin por insercin es


Q(n2) en el caso promedio.

**8.11

Considrese el siguiente algoritmo clasif-aleatoria para clasificar un arre


glo A[\..n] de enteros: si los elementos -4[1], ^[2], .... A[n] estn en el or
den adecuado, se para; en otro caso, selecciona un nmero aleatorio i entre
1 y n, intercambia /![1] y [], y se repite. Cul es el tiempo de ejecucin
esperado para clasif-aleatorial

*8.12

Previamente se mostr que la clasificacin por comparaciones requiere


Q(n\ogn) comparaciones en el peor caso. Demustrese que esta cota infe
rior persiste tam bin en el caso promedio.

*8.13

Prubese que el procedimiento selecciona, descrito de manera informal al


principio de la seccin 8.7, tiene un tiem po de ejecucin 0 (n) en el caso
promedio.

8.14 Obtngase CONCATENA para la estructura de datos de la figura 8.19.


8.15

Escrbase un programa para encontrar los k elementos ms pequeos de un


arreglo de longitud n. Cul es la complejidad de tiempo del programa?
Para qu valor de k es ventajoso clasificar el arreglo?

8.16

Escrbase un programa para encontrar los elementos mayor y m enor de un


arreglo. Puede hacerse esto con menos de 2n - 3 comparaciones9

www.FreeLibros.me

292

CLASIFICACION

8.17

Escrbase un programa para encontrar el elem ento ms frecuente de una lis


ta de elementos. Cul es la complejidad de tiempo del programa?

*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

Supngase que se tienen k conjuntos, S, S2


S k, y cada uno con n n
meros reales. Escrbase un programa para listar todas las sumas de la for
ma , + s2 + + sk, donde s, est en S de acuerdo con algn orden de
clasificacin. Cul es la complejidad de tiem po del programa?

8.20

Supngase que existe un arreglo clasificado de cadenas j h s;


sn. Es
crbase un programa para determ inar si una cadena x dada es miembro de
esta secuencia. Cul es la complejidad de tiempo del programa como una
funcin de n y la longitud de x?

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

Qu es un buen algoritmo? No es fcil responder a esta pregunta. Muchos criterios


para un buen algoritmo incluyen cuestiones muy subjetivas como simplicidad, cla
ridad y adecuacin a los datos manejados. U na meta ms objetiva, lo cual no signi
fica que sea ms im portante, es la eficiencia en tiempo de ejecucin. En la seccin 1.5
se abordaron las tcnicas bsicas para establecer el tiem po de ejecucin de progra
mas simples. Sin embargo, en casos ms complejos se requieren tcnicas nuevas,
como cuando los programas son recursivos. Este corto captulo presenta algunas
tcnicas generales para resolver ecuaciones de recurrencia que se presentan en el an
lisis de los tiempos de ejecucin de algoritmos recursivos.

9 .1

Eficiencia de los algoritmos

U na forma de determ inar la eficiencia del tiempo de ejecucin de un algoritmo es


programarlo y medir el tiempo que lleva la versin en particular, en un com putador
especfico, para un conjunto seleccionado de entradas. Aunque es popular y til,
este enfoque tiene algunos problemas inherentes. Los tiempos de ejecucin depen
den no slo del algoritmo base, sino tam bin del conjunto de instrucciones del com
putador, de la calidad del compilador y de la destreza del program ador. El progra
ma tambin puede adaptarse para trabajar correctam ente sobre el conjunto particu
lar de entradas de prueba. Estas dependencias pueden ser muy notorias con un com
putador, un compilador, un program ador o un conjunto de entradas de prueba dis
tinto. Para superar esos inconvenientes, los expertos en computacin han adoptado
la complejidad de tiempo asinttica como una medida fundamental del rendim ien
to de un algoritmo. El trm ino eficiencia se referir a esta medida y, en especial, a
la complejidad de tiempo en el peor caso (en contraposicin al promedio).
Recurdense del captulo l las definiciones de Cfifin)) y fifin )). La eficiencia o
complejidad en el peor caso de un algoritmo es Cfifin)), o fin ) para abreviar, si
0(fln)) es la funcin de n que da el mximo, en todas las entradas de longitud n,
del nmero de pasos dados por el algoritmo en esas entradas. En otras palabras, exis
te alguna constante c tal que para una n suficientemente grande, cfin) es una cota
superior del nm ero de pasos dados por el algoritmo con cualquier entrada de lon
gitud n.
En la aseveracin de que la eficiencia de un algoritmo dado es fin), existe la
implicacin de que la eficiencia tam bin es (/(n)), de forma que fin ) es la funcin

www.FreeLibros.me

294

TECNICAS DE ANALISIS DE ALGORITM OS

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

Anlisis de programas recursivos

En el captulo 1 se m ostr cmo analizar el tiem po de ejecucin de un programa que


no se llama a s m ismo en form a recursiva. El anlisis de un programa recursivo es
bastante distinto, y suele im plicar la solucin de una ecuacin de diferencias. Las
tcnicas para la solucin de ecuaciones de diferencias algunas veces son sutiles, y tie
nen una considerable semejanza con los m todos de solucin de ecuaciones diferen
ciales, alguna de cuya term inologa se utiliza.
Considrese el program a de clasificacin presentado en la figura 9.1. Ah, el pro
cedim iento mergesort (clasificacin por intercalacin) tom a una lista de longitud n
como entrada, y devuelve una lista ordenada como salida. El procedimiento combina{Lu L 2) tom a como entrada las listas clasificadas L, y L 2, y recorre cada una, ele
m ento por elemento, desde el inicio. En cada paso, el m ayor de los dos elementos

www.FreeLibros.me

ANALISIS DE PROGRAMAS RECURSIVOS

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.

Procedimiento recursivo mergesort.

Sea T(n) el tiempo de ejecucin en el peor caso del procedimiento mergesort de


la figura 9.1. Se escribe una ecuacin de recurrencia (o diferencias) que acote T(n)
por arriba, como sigue

(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

TECNICAS DE ANALISIS DE ALGORITMOS

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

Resolucin de ecuaciones de recurrencia

Existen tres enfoques distintos para resolver una ecuacin de recurrencia.


Suponer una solucin J{n) y usar la recurrencia para mostrar que l\n ) < fl,n).
Algunas veces slo se supone la forma de J{n), dejando algunos parmetros
sin especificar (por ejemplo, supngase fin ) - an2 para alguna a) y deduciendo
valores adecuados para los parm etros al intentar dem ostrar que T(n) <J{n)
para toda n.
2. U tilizar la recurrencia misma para sustituir m < n por cualquier T(m ) en la de
recha, hasta que todos los trminos T(m ) para m > 1 se hayan reemplazado por
frmulas que impliquen slo 7(1). Como 7(1) siempre es constante, se tiene una
frmula para T(n) en funcin de n y de algunas constantes. A esta frmula se
ha denom inado forma cerrada para T(n).
3. Emplear la solucin general para ciertas ecuaciones de recurrencia de tipos co
munes de esta seccin o de otra (vanse las notas bibliogrficas).
1.

En esta seccin se examinan los dos primeros mtodos.

Suposicin de una solucin


Ejemplo 9.1. Considrese el mtodo (1) aplicado a la ecuacin (9.1). Supngase que
para alguna a, T\ri) - an\ogn. Al sustituir n = 1, se observa que esta suposicin no
funcionar, porque an\ogn tiene valor 0, independiente del valor de a. As, se inten
ta a continuacin T(n) = atogn + b. Ahora, n = 1 requiere que b > c,.
Para la induccin, se supone que
T{k) ^ ak\ogk + b

(9.2)

para toda k < n y se intenta establecer que


T(n) < arogn + b
Para iniciar la demostracin, se supone que n > 2. De (9.1),
T(n) < 2T{n/2) + c2n
De (9.2), con k - n!2, se obtiene
T(n) < 2[a-^log-j + b) + c2n

www.FreeLibros.me

(9.3)

RESOLUCION DE ECUACIONES DE RECURRENCIA

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)

En otras palabras, J \n ) es 0{n\ogri).


Son tiles dos observaciones acerca del ejem plo 9.1. Si se supone que T(ri) es
(XAri)), y si el intento de probar que I\n ) < cj[ri) por induccin falla, se sigue
que T(n) no sea 0(J(,n)). De hecho, puede funcionar una hiptesis inductiva de la
forma T(n) < cf[n) - 1.
En segundo lugar, an no se ha determ inado la tasa exacta de crecim iento asinttica para j[ n ), aunque se ha dem ostrado que no es peor que D(nlogn). Si se con
jetura una solucin m s lenta, com o J[n) - an, o /{ n ) - anloglogn, no se puede de
m ostrar la validez de T(n) < fl,n). La cuestin slo se puede establecer concluyen
temente exam inando mergesort y dem ostrando que necesita realmente un tiempo
D(/ilogn); de hecho, requiere un tiem po proporcional a n\ogn en todas las entradas,
no slo en las peores entradas posibles. Se deja esta observacin como ejercicio.
El ejemplo 9.1 expone una tcnica general para dem ostrar que alguna funcin es
una cota superior en el tiem po de ejecucin de un algoritmo. Supngase la ecuacin
de recurrencia
7X1)- c
T(n) < g(T(n!2), n), para n > I
Obsrvese que (9.5) generaliza (9.1), donde g(x, y) es 2 x + c-y. Tam bin obsrvese
que podran imaginarse ecuaciones m s generales que (9.5). Por ejemplo, la frmula
g puede comprender todos los T{n - 1), T(n - 2), ..., T( 1), y no slo T(n/2). Tam
bin, es posible tener valores para T( 1), 7X2),..., T(k), y la recurrencia slo sera apli
cable para n > k. A m anera de ejercicio, sera interesante considerar cmo resolver
estas recurrencias ms generales por el m todo (1), suponiendo una solucin y veri
ficndola.
Considrese ahora (9.5), en vez de sus generalizaciones. Supngase una funcin
j ( a x, .... a, h), donde a ..., a son parmetros, e intntese dem ostrar por induccin
en n que T(n) < fl.a u ..., a, n). Por ejemplo, la suposicin del ejemplo 9.1 fue fi,au
a2, n) - a tnlogn + a2, pero se utilizaron a y b por a, y a2. Para corroborar que para
algunos valores de a , , .... a se tiene T{n)
..., a, n) para toda n > 1, se debe
cumplir
/ ( f l i ............ Oj, 1) 2 c

/ ( 0 | ............. a j< n) ^ g ( f( a u . . . .ajt n/2), n )

www.FreeLibros.me

(9.6)

298

TECNICAS DE ANALISIS DE ALGORITM OS

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)

Al sustituir el lado derecho de (9.8) por T(n/2) en (9.1), se obtiene


T(n) < 2(27(n/4) + c2n/2) + c2n = 4T(n/4) + 2c2n

(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)

Ahora es necesario percibir un patrn. Por induccin en i se obtiene la relacin


T(n) 2T(n/2') + ic2n

(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)

SOLUCION GENERAL PARA UNA CLASE G R A N D E DE RECURRENCIAS

299

Entonces, como 2* = n, se sabe que k = logn. Com o 7X1) < c,, (9.12) es
7X/0 ^ cn + c2n\ogn

(9.13)

La ecuacin (9.13) es en realidad la m ejor cota que se pudo colocar en T(n), y de


muestra que T\ri) es 0(nlogn).

9 .4

Solucin general para una clase grande de recurrencias

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

TECNICAS DE ANALISIS DE ALGORITM OS

- a2[aTi-^)+d{-?-)]+ad(^-)+d(n) = a J7(-^)+crV (-^)W (---)+d(rt)


b
o
b
b
cr
b

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.

Soluciones homogneas y particulares


Es interesante ver los diferentes papeles que desempean los dos trm inos de (9.16).
El primero, ak o nic*>a, se conoce como solucin homognea, en analoga con la ter
minologa de las ecuaciones diferenciales. La solucin homognea es la solucin
exacta cuando d(n), conocida como funcin motriz, es 0 para toda n. En otras pa
labras, la solucin homognea representa el costo de resolver todos los subproble
mas, aunque puedan combinarse sin costo.
Por otra parte, el segundo trm ino de (9.16) comprende el costo de creacin de
los subproblemas y la combinacin de sus resultados. Este trm ino se denomina so
lucin particular, que est afectada tanto por la funcin motriz como por el nmero
y tam ao de los subproblemas. Como regla general, si la solucin homognea es ma
yor que la funcin motriz, la solucin particular tendr la misma tasa de crecimien
to que la solucin homognea. Si la funcin m otriz crece ms rpido que la solucin
homognea en ms que ne para alguna e > 0, la solucin particular tendr la mis
ma tasa de crecim iento que la funcin motriz. Si la funcin motriz tiene la misma
tasa de crecimiento que la solucin homognea, o crece ms rpido que log*n como
mucho para alguna k, entonces la solucin particular crecer logn veces la funcin
motriz.
Es im portante reconocer que cuando se buscan mejoras en un algoritmo es ne
cesario saber si la solucin homognea es mayor que la funcin motriz. Por ejem
plo, si la solucin homognea es mayor, prcticamente no tendr efecto encontrar
una forma ms rpida de com binar los subproblemas en la eficiencia de todo el al

www.FreeLibros.me

SOLUCION GENERAL PARA UNA CLASE GRA N D E DE RECURRENCIAS

30!

goritmo. Lo mejor, en este caso, es encontrar una forma de dividir el problema en


menos o menores subproblemas. Eso afectar a la solucin homognea y reducir el
tiempo total de ejecucin.
Si la funcin m otriz excede a la solucin homognea, entonces es necesario tra
tar de reducir la funcin motriz. Por ejemplo, en el caso de mergesort, donde
a - b - 2, y d(n) - en, la solucin particular es O(nlogn). Sin embargo, reducir d(n)
a una funcin ligeramente sublineal, por ejemplo, n09, har que la solucin particu
lar sea tambin menos que lineal y que se reduzca el tiempo de ejecucin total a
0(n), que es la solucin homognea t-

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

2 a > { d m k~i = d(b )k


j-0

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

TECNICAS DE ANALISIS DE ALGORITM OS

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.

Si a < d(b), (9.17) es 0(d{b)k) o, en form a equivalente, 0(fllo**'li,). En este caso,


la solucin particular excede a la homognea, y se puede dirigir la atencin tam
bin hacia la funcin m otriz d(n), adem s de a a y b, para obtener mejoras. Ob
srvese el importante caso especial en que d(ri) - na. Entonces, d(b) - If, y log(6a) - a. As, la solucin particular es 0(n a) o bien 0(d(n)).

3.

Si a = d(b), se reconsideran los clculos implicados en (9.17), pues la frmula


para la suma de una serie geomtrica no es ahora apropiada. En este caso,

*-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.

Considrense las siguientes recurrencias, con T\ 1 ) 1.

1.

1\ri) - 47T(n/2) + n

2.

T(n) - 47X/2) + n 2

3.

T\n) - 4T\n/2) + n 3

En cada caso, a - 4, - 2, y la solucin homognea es n2. En la ecuacin (1), con


d(n) - n, se tiene d(b) - 2. Como a - 4 > d(b), la solucin particular tam bin es n2,
y T(n) es 0 (n 2) en (1).
En la ecuacin (3), d(n) d(b) - 8, y a < d(b).As, lasolucin particular es
0(nkVMO) _ 0 (n 3), y T(n) de la ecuacin (3) es 0 (n 3).Sepuede deducir que la solu
cin particular es del m ismo orden que d(n) - n3, aplicando las observaciones an
teriores acerca de los d(n) de la forma na y analizando el caso a < d(b) de (9.17).
" n la ecuacin (2), se tiene d(b) - 4 - a, con lo que se aplica (9.18). Como d(n) es
de la forma n, la solucin particular y, por tanto, T(n), es 0 (n 2logn).

www.FreeLibros.me

SOLUCION GENERAL PARA UNA CLASE GRAN DE DE RECURRENCIAS

303

Otras funciones motrices


Existen otras funciones motrices no multiplicativas, por medio de las cuales se ob
tienen soluciones para (9.16) e incluso para (9.17). Se considerarn dos ejemplos. El
primero generaliza cualquier funcin que sea el producto de una funcin multipli
cativa y una constante mayor o igual que uno. La segunda es tpica de un caso don
de es preciso examinar (9.16) con detalle y obtener una cota superior ajustada a la
solucin particular.
Ejemplo 9.4.

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

*-!

X 2'2*-' log(2M = 2k X (k -j)


l-o
J-o
= 2k-'k[k+ 1)
Como k = logn, la solucin particular es (?(nlog2n), y esta solucin, al ser mayor que
la homognea, tambin es el valor que se obtiene de T(n).

www.FreeLibros.me

304

TECNICAS D E ANALISIS D E ALGORITM OS

E jercicios
9.1

Escrbanse algunas de las ecuaciones de recurrencia para las complejidades


de tiem po y espacio correspondientes al siguiente algoritmo, suponiendo
que n es una potencia de 2.
function camino (s, t, n: integer): boolean;
begin
if n = 1 then
if arista (s, t) then
return (true)
else
return (false);

{ si se llega aqu es que n > 1}


for i: - 1 to n do
if camino (5 , i, n div 2) and camino (i, l, n div 2) then
return (true);
return (false)
end; I cam ino i
La funcin arista(i, j ) devuelve verdadero si los vrtices i y j de un grafo
de n vrtices estn conectados por una arista o si i
de lo contrario, arista
(i, j) devuelve falso. Qu hace el programa?
9.2

Resulvanse las siguientes recurrencias, donde 7X1) = 1 y T(n) para n > 2


satisface:
a) T(n) = 3T(n/2) + n
b) T(n) - 3T(n/2) + n2
c) T(n) = ST(n/2) + n3

9.3

Resulvanse las siguientes recurrencias, donde 7X1) - 1 y T(n) para n > 2


satisface:
a) T(n) - 47'(n/3) + n
b) T(n) - 47Xn/3) + n2
c) T(n) - 9T(n/3) + n2

9.4

Obtngase las cotas o mayscula y omega mayscula en los T(n) definidos


por las siguientes recurrencias. Supngase que T( 1) = 1
a) T(n) = T(n/2) + 1
b) T(n) = 2T(n/2) + logn
c) T(n) - 2T\n/2) + n
d) T(n) = 2T(n/2) + n2

www.FreeLibros.me

EJERCICIOS

*9.5

305

Resulvanse las siguientes recurrencias suponiendo una solucin y compro


bando la respuesta
a) 7 ^ 1 ) - 2

T{n) - 2 T(n - 1) + 1 para n > 2


b ) 7X1) -

T(n) - 2 T {n -\) + n para n > 2


9.6

Verifiqense las respuestas del ejercico 9.5 resolviendo las recurrencias por
sustitucin repetida.

9.7

Generalcese el ejercicio 9.6 resolviendo todas las recurrencias de la forma


7X1)- 1

T(n) - aT(n - 1) + d(n) para n > 1


en funcin de a y d(n).
*9.8 Supngase en el ejercicio 9.7 que d(n) = c" para alguna constante c > 1.
Qu dependencia tiene la solucin de T(n) de la relacin entre a y c? Qu
es T(n)?
**9.9

Resulvase para T(n):


7XD- 1

T(n) - VT(V) + n para n > 2


9.10

Encuntrense expresiones en su forma cerrada para las siguientes sumas.


a)

'

b)

i- 0

c)

2 '

d)

.- 0

*9.11

/*

t- o

i-O

Mustrese que el nmero de rdenes distintos en que se puede multiplicar


una secuencia de n matrices, est dado por la recurrencia
7X D - l(i_)
T(n) - T(i)T(n - i)
/
I
Mustrese que T(n +
de Cataln.

1)

- !
n +1

( ^n

). Los T(n) se conocen como nmeros

**9.12 Mustrese que el nmero de comparaciones requeridas para clasificar n ele


mentos con clasificacin por intercalacin (mergeson) est dado por
7XU-0

T (n )~ T([n!2\)+ T(\n!2}) + n - 1

www.FreeLibros.me

306

TECNICAS DE ANALISIS DE ALGORITM OS

donde |xj denota la parte entera d e x , y [>], el entero m s pequeo > x.


Mustrese que la solucin a esta recurrencia es
T{n) - nflogl 9.13

+ I

Mustrese que el nm ero de funciones booleanas de n variables est dado


por la recurrencia
7X1)-4

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

T(n) - (T{n - l))2 + 1


Mustrese que T(n) - |/c2"J para alguna constante k. Cul es el valor de k l

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

A travs de los aos, los cientficos de la computacin han identificado diversas tc


nicas generales que a menudo producen algoritmos eficientes para la resolucin de
muchas clases de problemas. Este capitulo presenta algunas de las tcnicas ms im
portantes como dividir para vencer, programacin dinm ica, tcnicas vidas, el m
todo de retroceso y bsqueda local. En el intento de disear un algoritmo para re
solver un problema dado, a m enudo es til plantear cuestiones como qu clase de
solucin se puede obtener de la programacin dinm ica, del enfoque vido, de la tc
nica dividir para vencer o de otra tcnica estndar?.
Sin embargo, debe subrayarse que hay algunos problemas, como los NP comple
tos, para los cuales ni stas ni otras tcnicas conocidas producirn soluciones efi
cientes. Cuando se encuentra algn problema de este tipo, suele ser til determinar
si las entradas al problema tienen caractersticas especiales que se puedan explotar
en la bsqueda de una solucin, o si puede usarse alguna solucin aproxim ada sen
cilla, en vez de la solucin exacta, difcil de calcular.

1 0 .1

Algoritmos dividir para vencer

Tal vez la tcnica ms im portante y aplicada para el diseo de algoritmos eficientes


sea la estrategia llamada dividir para vencer, que consiste en la descomposicin de
un problema de tam ao n en problemas ms pequeos, de modo que a partir de la
solucin de dichos problemas sea posible construir con facilidad una solucin al pro
blema completo. Ya se han visto varias aplicaciones de esta tcnica, como la clasi
ficacin por intercalacin o los rboles binarios de bsqueda.
Para ilustrar el mtodo, considrese el conocido acertijo de las torres de Ha
noi. Consta de tres postes A, B y C. Inicialmente, el poste A tiene cierta cantidad
de discos de distintos tamaos, con el ms grande en la parte inferiof y otros suce
sivamente ms pequeos encima, como se muestra en la figura O.I. El objeto del
acertijo es pasar un disco a la vez de un poste a otro, sin colocar nunca un disco gran
de sobre otro ms pequeo, hasta que todos los discos estn en el poste B.
Pronto se descubre que el acertijo puede resolverse con el sencillo algoritmo si
guiente. Se imaginan los postes dispuestos en un tringulo. Con un nmero de movi
mientos impar, se mueve el disco ms pequeo hacia un poste en el sentido de las
manecillas del reloj. Con un nmero de m ovimientos pares, se hace el nico movi
miento vlido que no implique al disco ms pequeo.

www.FreeLibros.me

308

TECNICAS DE DISE O DE ALGORITM OS

F ig . 1 0 .1 .

Posicin inicial en el acertijo de las torres de Hanoi.

El algoritmo anterior es conciso y correcto, pero es difcil entender por qu fun


ciona y de descubrir intuitivam ente. En cam bio, considrese el siguiente enfoque de
dividir para vencer. El problema de pasar los n discos ms pequeos de A a B puede
considerarse compuesto de dos problem as de tam ao n - 1. Prim ero se mueven los
n - 1 discos ms pequeos del poste A al C, dejando el n-simo disco ms pequeo
en el poste A. Se mueve ese disco de A a B. Despus se pasan los n - 1 discos ms
pequeos de C a B. El m ovim iento de los n - I discos ms pequeos se efectuar
por m edio de la aplicacin recursiva del mtodo. Como los n discos implicados en
los m ovim ientos son m s pequeos que los dems discos, no es necesario preocu
parse de los que se encuentran debajo de ellos en los postes A. B o C. Aunque el mo
vim iento real de los discos individuales no es obvio y la simulacin a mano es dif
cil debido al apilam iento de llam adas recursivas, el algoritmo es conceptualmente
fcil de entender, de probar que es correcto y, tal vez, de considerarlo como primera
opcin. Es probable que la facilidad de descubrir los algoritmos de divisin haga
que esta tcnica sea tan im portante, aunque en muchos casos los algoritmos son tam
bin ms eficientes que otros m s convencionales t-

Problema de la m ultiplicacin de enteros grandes


Considrese el problema de la m ultiplicacin de dos enteros X e Y de n bits. Re
curdese que el algoritmo para la m ultiplicacin de enteros de n bits (o n dgitos),
que se suele ensear en la escuela prim aria, implica el clculo de n productos par
ciales de tam ao n, de aqu que sea un algoritmo 0 (n 2), si se toman las multiplica
ciones y las adiciones de un slo b it o dgito como un paso. Un enfoque de clasifi
cacin del resultado por divisin en la m ultiplicacin de enteros dividira X e Y en
dos enteros de n/2 bits cada uno, como se muestra en la figura 10.2. (Por simplici
dad, se supone que n es una potencia de 2.)

+ 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

ALGORITM OS DIVIDIR PARA VENCER

Fig. 1 0 .2 .

X =

X = A 2 nl2 +B

Y :=

Y = C2nl1 + D

309

Divisin de un entero de n bits en segmentos de n/2 bits.

El producto de X e Y puede escribirse como


XY = AC2" + (AD+BC) 2n/2 + BD

(10.1)

Si se evala X Y de esta forma directa, es necesario realizar cuatro multiplicaciones


de enteros de n/2 bits (AC, AD, BC, BD), tres sumas de enteros con un mximo de
2n bits (correspondientes a los tres signos + de (10.1)), y dos desplazamientos (mul
tiplicaciones por 2" y por 2B/2). Como esas sumas y desplazamientos requieren 0(n)
pasos, se puede escribir la siguiente recurrencia para T(n), el nm ero total de ope
raciones de bits necesarias para m ultiplicar enteros de n bits de acuerdo con V10.1).
7X1) = 1
T(n) = 4T(n/2) + en

(10.2)

Por un razonamiento similar al del ejemplo 9.4, se toma la constante c de (10.2)


como I, de modo que la funcin motriz d(n) es tan slo n, y se deduce que la solu
cin homognea y la particular son 0 (n 2).
En caso de que la frmula (10.1) se utilice para multiplicar enteros, la eficiencia
asinttica no es mayor que para el mtodo de la escuela primaria. Pero recurdese
que para ecuaciones como (10.2) se consigue una mejora asinttica si se reduce el
nmero de subproblemas. Puede ser sorprendente que se haga eso, pero considrese
la siguiente frmula para m ultiplicar X por Y.
XY = AC2n + [( A - B H D - C ) + AC + BD) 2W'2 + BD

(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

TECNICAS DE DISEO DE ALGORITM OS

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)

function mult ( X. Y, n: integer ): integer;


! X e Y son enteros con signo < 2".
n es una potencia de 2. La funcin devuelve X Y
var
s: integer; i contiene el signo de X Y }
m i, m2, m3: integer; | contiene los tres productos !
.4. B. C, Z>- integer. | contiene las mitades izquierda y derecha de X e Y I
begin
s
sign(3f) * sign(y);
X - absW ;
Y
abs(y); f hace positivos a X e Y I
if n - 1 then
if (A" - 1) and ( 7 - 1 ) then
return (s)
else
return (0)
else begin
A : n/2 bits izquierdos de X\
B : n/2 bits derechos de X;
C : n/2 bits izquierdos de Y\
D > n/2 bits
derechos de Y;
m i := mult{A. C. n/2);
m2 := mull(A - B. D - C, n/2);
m3 := mult(B, D. n/2);
return (s * ( m i*2" + (m i + m2 + m 3) * 2n': + m3))
end
end; { mult j
Fig. 10.3.

Algoritmo dividir para vencer de la multiplicacin


de enteros.

Obsrvese que el algoritmo de la figura 10.3 es asintticam ente ms rpido que


el mtodo estudiado en la escuela prim aria, al requerir CKn[ >9) pasos en vez de 0 (n 2).
Puede plantearse la pregunta de por qu no se imparte en la escuela primaria si
es mejor. Existen dos respuestas: primero, aunque es fcil de im plantar en un compu
tador, la descripcin del algoritmo es lo bastante compleja que si se intenta ense
arlo en la escuela prim aria, los estudiantes no aprendern a multiplicar. Ms an,
se han ignorado las constantes de proporcionalidad. M ientras que el procedimiento
mult de la figura 10.3 es asintticam ente superior al m todo usual, las constantes
son tales que para problemas pequeos (de hecho hasta de 500 bits) el mtodo de
la escuela prim aria es mejor, y en raras ocasiones se pide a estudiantes de ese nivel
que m ultipliquen nm eros de esa magnitud.

www.FreeLibros.me

ALGORITM OS DIVIDIR PARA VENCER

311

Programacin de torneos de tenis


La tcnica de dividir para vencer tiene varias aplicaciones, no slo en el diseo de
algoritmos, sino tambin en el diseo de circuitos, construccin de demostraciones
matemticas y en otros campos del quehacer humano. Se brinda un ejemplo para
ilustrar esto. Considrese el diseo del programa de un torneo de tenis para n -2*
jugadores. Cada jugador debe enfrentarse a lodos los dems, y debe tener un en
cuentro diario durante n - 1 dias, que es el nmero m nim o de dias necesarios para
completar el torneo.
El programa del torneo es una tabla de n filas por n - 1 columnas cuya posicin
en fila ; y colum na j es el jugador con quien debe contender i el y-simo da.
El enfoque dividir para vencer construye un programa para la mitad de los ju
gadores. que est diseado por una aplicacin recursiva del algoritmo buscando un
programa para una m itad de esos jugadores, y asi sucesivamente. Cuando se llega
hasta dos jugadores, se tiene el caso base y simplemente se emparejan.
Supngase que hay ocho jugadores. El programa para los jugadores 1 a 4 ocupa
la esquina superior izquierda (4 filas por 3 columnas) del programa que se est cons
truyendo. La esquina inferior izquierda (4 filas por 3 columnas) debe enfrentar a los
jugadores con numeracin ms alta (5 a 8). Este subprograma se obtiene agregando
4 a cada entrada de la esquina superior izquierda.
Ahora se ha simplificado el problema, y lo nico que falta es enfrentar a los ju
gadores de baja numeracin con los de alta numeracin. Esto es fcil si los jugado
res 1 a 4 contienden con los 5 a 8, respectivamente, en el da 4, y se permutan c
clicamente 5 a 8 en los das siguientes. El proceso se ilustra en la figura 10.4. El lec
tor debe ser capaz de generalizar las ideas de esta figura para obtener un programa
de 2* jugadores para cualquier k.

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

TECNICAS DE DISEO DE ALGORITM OS

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

Torneo para ocho jugadores.

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

A m enudo sucede que no hay m anera de dividir un problema en un pequeo n


mero de subproblemas cuya solucin pueda combinarse para resolver el problema
original. En tales casos, se puede intentar dividir el problema en tantos subproble
mas como sea necesario, dividir cada subproblema en subproblemas ms pequeos,
y as sucesivamente. Si eso es todo lo que se hace, quiz se produzca un algoritmo
de tiempo exponencial.
No obstante, con frecuencia, slo hay un nm ero polinomial de subproblemas,
de aqu que se deba resolver algn subproblema muchas veces. Si, en cambio, se con
serva la solucin a cada subproblema resuelto, y tan slo se toma la respuesta cuan
do se requiere, se obtiene un algoritmo de tiempo polinomial.
Desde el punto de vista de la realizacin, algunas veces es ms fcil crear una ta
bla de las soluciones de todos los subproblemas que se tengan que resolver. Se re
llena la tabla sin tener en cuenta si se necesita realmente un subproblema particular
en la solucin total. La formacin de la tabla de subproblemas para alcanzar una so
lucin a un problema dado se denomina programacin dinmica, nombre proceden
te de la teora de control.
La forma de un algoritmo de programacin dinm ica puede variar, pero hay un
esquema comn: una tabla a rellenar y un orden en el cual se hacen las entradas. Se
ilustrarn las tcnicas mediante dos ejemplos, el clculo de apuestas en un encuen
tro como la Serie Mundial de Bisbol y el problema de la triangulacin.

Apuestas en la Serie Mundial de Bisbol


Supngase que dos equipos, A y B, tienen un enfrentam iento para ver quin es el
prim ero en ganar n partidos para una n en particular. La Serie Mundial es uno de

www.FreeLibros.me

PROGRAM ACION DINAMICA

313

tales enfrentamientos, con n - 4. Se supone que A y B son igualmente competentes,


de modo que cada uno tiene un 50% de oportunidades de ganar cualquier partido.
Sea P[i,j) la probabilidad de que A gane el encuentro, considerando que A necesita
i partidos para ganar, y B necesita j. Por ejemplo, si los Dodgers han ganado dos par
tidos y los Yankees uno, entonces / - 2,7 - 3, y se observa que P{2, 3) es 11/16.
Para calcular P(i,j), se emplea una ecuacin de recurrencia en dos variables. Pri
mero, si / - 0 y j > 0, el equipo A ya ha ganado el encuentro, por lo que P{0, j) - 1.
Igualmente, P(i, 0) - 0 para / > 0. Si i y j son mayores que cero, deber jugarse al
menos otro partido ms y los dos equipos ganan lam itad de las veces. As, P(i, j)
debe ser el promedio de P(i - l , j ) y P(i, j - 1), siendo laprim era de ellas la proba
bilidad de que A gane el encuentro si gana el siguiente partido, y la segunda, la pro
babilidad de que A gane el encuentro aun cuando pierda el siguiente partido. En resu
men:

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)

Si se utiliza (10.4) recursivamente como una funcin, se demuestra que P(i,j) re


quiere un tiempo no mayor que 0(2 '* '). Sea T(n) el tiempo mximo requerido por
una llamada a P(i, j), donde / + j - n. Entonces, de (10.4),
r (l) = c
T(n) - 2T(n - l) + d
para algunas constantes c y d. Es til verificar por los medios analizados en el cap
tulo anterior, que T(n) < 2 " ' 'c + (2 n~1 - 1) d, lo cual es 0(2") u 0(2'*').
As, se ha obtenido una cota superior exponencial para el tiempo requerido por
el clculo recursivo de P[i, j). Sin embargo, para tener la conviccin de que la fr
mula recursiva para P(i, j) es una mala forma de calcularla, se toma una cota infe
rior omega mayscula. Se deja como ejercicio dem ostrar que al llam ar a P[i, j), el n
mero total de llamadas a P que se hace es ( ' el nmero de formas de escoger i
objetos a partir de i + j. Si i - j, ese nmero es Q ^ y V ), donde n - i +j. As, T(n)
es Q (2 y v n ) y, de hecho, se demuestra que tambin es 0 ( 2"/V). Mientras 2yY cre
ce asintticamente ms lento que 2", la diferencia no es muy grande, y T(n) crece
demasiado rpido como para que el clculo recursivo de P(i, j) sea prctico.
El problema con el clculo recursivo es que se calcula la misma P(i, j) muchas
veces. Por ejemplo, si se desea obtener P(2, 3), se calcula, por (10.4), P[ 1, 3) y P{2, 2).
P[ 1, 3) y P(2, 2) requieren el clculo de P(l, 2), por lo que se calcula ese valor dos
veces.
Una forma mejor de calcular P(i, j) es llenar la tabla sugerida en la figura 10.5.
La fila inferior est llena de ceros y la columna ms a la derecha est llena de unos,
debido a las dos primeras filas de (10.4). Por la ltim a fila de (10.4), cada una de
las otras entradas es el promedio de la entrada de abajo y de la entrada de la dere
cha. As, una forma apropiada de llenar la tabla es proceder en diagonales a partir

www.FreeLibros.me

314

TECNICAS DE DISECO DE ALGORITMOS

la esquina inferior derecha, y procediendo hacia arriba y hacia la izquierda en dia


gonales que representan las posiciones con valor constante de i + j, como se sugiere
en la figura 10.6. Este programa se presenta en la figura 10.7, suponiendo que opera
en un arreglo bidimensional P de tam ao apropiado.

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

PROGRAM ACION DINAM ICA

(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)

return (P[i, j])


end; | apuestas!
Fig. 10.7.

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

TECNICAS DE DISEO DE ALGORITM OS

Antes de proseguir con la solucin de la programacin dinm ica al problema de


la triangulacin, se dejarn establecidas dos observaciones acerca de las triangula
ciones que ayudarn a disear el algoritmo. Se supone que hay un polgono con n
vrtices v0, v,
v_,, en el sentido de las manecillas del reloj.
Hecho 1. En cualquier triangulacin de un polgono con ms de tres vrtices, cada
par de vrtices adyacentes es tocado al menos por una cuerda. Para ver esto, supn
gase que ni v, ni v,. fueron tocados por una cuerda. Entonces la regin que la aris
ta (vr v , , ,) lim ita debe incluir las anstas (v,_ v,), (v,. v, 2) y al menos una arista
adicional. Esta regin no sera un tringulo.
Hecho 2. Si (v,, v;) es una cuerda de una triangulacin, debe haber algn vk tal que
(v,, v*) y (v* v,) sean aristas del polgono o cuerdas. De otra forma, (v,, v,) puede li
m itar una regin que no sea un tringulo.
Para iniciar la bsqueda de una triangulacin minimal, se escogen dos vrtices
adyacentes, como v0 y v,. Por los dos hechos, se sabe que en cualquier triangulacin
y, por tanto, en la triangulacin mnima, debe haber un vrtice vk tal que (v,, v*) y
( v*. vo) sean cuerdas o aristas en la triangulacin. As pues, se debe considerar la bon
dad de la triangulacin que se obtendr despus de seleccionar cada valor posible
de k. Si el polgono tiene n vrtices, se puede hacer un total de (n - 2) selecciones.
Cada seleccin de k da lugar como mximo a dos subproblemas, que son polgo
nos formados por una cuerda y las aristas del polgono original que van de un ex
trem o a otro de la cuerda. Por ejemplo, la figura 10.9 m uestra los dos subproblemas
que resultan al seleccionar el vrtice v3.
A continuacin, se deben encontrar triangulaciones m nim as para los polgonos
de la figura I0.9(a) y (b). Lo prim ero que hay que hacer es considerar otra vez todas
t En lo sucesivo, se considerar que lodos los subndices estn calculados m dulo n. Asi. en la figura
10.8, v, y v(>1 pueden ser vt y Vp, respectivam ente, puesto que n - 7.

www.FreeLibros.me

PROGRAM ACION DINAMICA

Fig. 10.9.

317

Los dos subproblemas despus de seleccionar v3.

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

TECNICAS DE DISEO DE ALGORITM OS

Fig. 10.10.

Divisin de S en subproblemas.

gn vrtice k entre l y j - 2 y se resuelven los subproblemas


La figura
10.10 ilustra esta divisin en subproblemas.
Si se emplea el algoritmo recursivo implcito en las reglas anteriores para resol
ver subproblemas de tam ao 4 o mayores se podr m ostrar que cada llamada en un
subproblema de tam ao s provoca un total de 3S~4 llamadas recursivas, si se resuel
ven directam ente los subproblemas de tam ao 3 o menores y slo se cuentan las
llamadas en subproblemas de tam ao 4 o mayores. As, el nm ero de subproblemas
a resolver es exponencial en s. Dado que el problema inicial es de tamao n , donde
r es el nm ero de vrtices del polgono dado, el nmero total de pasos realizados
por este procedimiento recursivo es exponencial en n.
Es evidente que todava hay algo errneo en este anlisis, porque se sabe que sin
contar el problema original, slo hay n ( n - 4) subproblemas diferentes que necesi
tan solucin, y se representan por S d o n d e 0 < i < n y 4 < s < n. Es obvio que
no todos los subproblemas resueltos por el procedimiento recursivo son diferentes.
Por ejemplo, si en la figura 10.8 se escoge la cuerda(v0) v3), y despus, en el subpro
blema de la figura I0.9(b), v4, hay que resolver el subproblema Su . Pero tambin se
tendra que resolver este problema si se tom ara primero la cuerda (v0, v4), o la cuer
da (v,, v4), y entonces, al resolver el subproblema 545, se tom ara el vrtice v0 para
completar un tringulo con v, y v4.
Esto sugiere una forma eficiente de resolver el problema de la triangulacin. Se
prepara una tabla que contenga el costo C, de la triangulacin Sis para toda i y s.
Dado que la solucin a cualquier problema dado slo depende de la solucin a pro
blemas de tam ao m enor, el orden lgico en el cual se debe llenar la tabla es de acuer
do con el tam ao. Esto es, para tam aos s = 4, 5, ..., n - 1 se introduce el costo m
nimo para los subproblemas S ir para todos los vrtices i. Es conveniente incluir tam
bin los problemas de tam ao 0 < s < 4 , pero recurdese que
tiene costo 0 si
5 <4.
De las reglas anteriores (1) a (3) para encontrar subproblemas, la frmula para
calcular Cu para s > 4 es:
C - mn \C lMl + Ckj_k + D[v vhl) + D(virln v,.,_,)|
is*aj-2 L

www.FreeLibros.me

(10.5)

PROGRAM ACION DINAMICA

319

donde D{vr vq) es la longitud de la cuerda entre los vrtices vp y


si y vq no son
puntos adyacentes en el polgono; D{vp, vq) es 0 si vp y v, son adyacentes.
Ejemplo 10.2. La figura 10.11 contiene la tabla de costos de S para 0 < i < 6 y
4 <5 < 6, basada en el polgono y las distancias de la figura 10.8. Los costos de las
filas con s < 3 son todos cero. Se ha llenado la posicin C07, en la columna 0 y la
fila para s - 7. Este valor, como todos los de la misma fila, representa la triangula
cin del polgono completo. Para ver esto, obsrvese que se puede, si se desea, con
siderar la arista (v0, v6) como una cuerda de un polgono m ayor y el polgono de la
figura 10.8 como un subproblema de este polgono, el cual tiene una serie de vrti
ces adicionales que se extienden en el sentido de las manecillas del reloj desde v6 has
ta v0. Obsrvese que toda la fila para s - 7 tiene el mismo valor que C07, para con
servar la exactitud de clculo.
Como ejemplo, se proporciona la demostracin de cmo se introdujo el valor
38.09 de la columna para i = 6 y la fila para s - 5. De acuerdo con (10.5), el valor
de esta posicin, C6}, es el m nim o de tres sumas correspondientes a k - 1, 2 3.
Esas sumas son:
C62 + CM + D(v6,v 0) + D(v0, v3)
C#3 + C ,3 + D(v6,V,) + Z)(v|, v3)
CM + C22 +
7

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.

Las distancias requeridas se calculan a partir de las coordenadas de los vrtices;


D { v 2,

v3) - D(vt , v0) - 0

(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

TECNICAS DE DISEO DE ALGORITM OS

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.

Patrn de seguimiento de la tabla para calcular un elemento.

Para encontrar soluciones a partir de la tabla


Aunque la figura 10.11 ofrece el costo de la triangulacin m nim a, no proporciona
de inm ediato la triangulacin misma. Para cada posicin se necesita el valor de k
que produjo el m nim o en (10.5). Luego se puede deducir que la solucin consta de
las cuerdas (v vk) y (vi+*, v/+J_|) (a menos que una de ellas no sea cuerda, porque
k = 1 o k - s - 2), ms las cuerdas que estn implicadas por las soluciones a Sw+1 y
Al calcular un elemento de la tabla, es til incluir el valor de k que brinde la
mejor solucin.
Ejemplo 10.3. En la figura 10.11, el valor C07, que representa la solucin al proble
ma completo de la figura 10.8, procede de los trm inos de k - 5 en (10.5). Esto es,
t Recurdese que la tabla de la figura 10.11 tiene filas d e ceros por debajo de las que se muestran,
t t Por a la derecha se quiere decir que la tabla s e lee en form a circular. As, si uno se encuentra en
la columna de ms a la derecha, la colum na a la derecha es la que est m s a la izquierda.

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

Considrese el problema de dar un cambio. Supnganse monedas de 25 t (un cuar


to) 101 (un dcimo), 5 t (un vigsimo) y l t (un centavo), y que se desea dar un cam
bio de 63 . Sin pensar, se convierte esta cantidad a dos cuartos, un dcim o y tres
centavos. No slo se determ in rpidam ente una lista de monedas con el valor
correcto, sino que se produjo la lista ms corta de monedas con ese valor.
El algoritmo empleado probablemente fue seleccionar la moneda m ayor cuyo va
lor no exceda de 63 t (un cuarto), agregarla a la lista y sustraer su valor de 63, que
dando 38 . De nuevo, se seleccion la moneda m s grande cuyo valor no fuera m a
yor de 38 t (otro cuarto) y se aadi a la lista, y as sucesivamente.
Este mtodo de dar cam bio es un algoritmo vido. En cualquier etapa indi
vidual, un algoritmo vido selecciona la opcin que sea localmente optimal
en algn sentido particular. Obsrvese que el algoritmo vido para dar cambio
produce una solucin optim al general debido a las propiedades de las monedas. Si
las monedas tuvieran valores l , 5 t y 11 t y se deseara dar un cambio de 15 , el

www.FreeLibros.me

322

TECNICAS DE DISEO DE ALGORITM OS

algoritmo vido seleccionara prim ero la m oneda de 11 t y despus cuatro de


1 para un total de cinco monedas. Sin embargo, tres monedas de 5 ( bastan.
Ya se han visto varios algoritmos vidos, como el algoritmo del camino ms
corto de Dijkstra y el algoritmo de rboles abarcadores de costo m nim o de Kruskal. El algoritmo de Dijkstra es vido en el sentido de que siempre escoge el
vrtice ms cercano al origen de entre aquellos cuyo cam ino ms corto todava se
desconoce. El algoritmo de Kruskai tam bin es vido: de las aristas restan
tes, elige la ms corta de entre aquellas que no crean un ciclo.
Es necesario subrayar el hecho de que no todos los enfoques vidos llegan
a dar m ejor resultado. Com o sucede en la vida real, una estrategia vida pue
de dar un buen resultado durante un tiem po, pero el resultado general puede ser po
bre. Como ejemplo, se considera lo que sucede al perm itir aristas ponderadas nega
tivas en los algoritmos de Dijkstra y de Kruskai. Resulta que el algoritmo de rboles
abarcadores de Kruskai no se ve afectado y continuar produciendo el rbol de cos
to mnimo, pero el algoritmo de Dijkstra en algunos casos no produce los caminos
ms cortos.
Ejemplo 10.4. En la figura 10.14 se presenta un grafo con una arista entre y e
cuyo costo es negativo. Al aplicar el algoritmo de Dijkstra con origen s, primero se
descubrir, correctamente, que el camino m nim o hacia a tiene longitud 1. Ahora,
considerando slo las aristas de s o a a b o c, se espera que b tenga el camino ms
corto desde s, es decir, s a &, de longitud 3. As, se descubre que c tiene un ca
m ino ms corto desde 5 de longitud 1.

Fig. 10.14.

Grafo con una arista ponderada negativa.

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-

Algoritm os vidos como procedimientos heursticos


Para algunos problemas, no existen algoritm os vidos conocidos que produz
can soluciones optimales; con todo, existen algunos que pueden llegar a producir so
luciones buenas con una alta probabilidad. A menudo, una solucin semioptimal
t D e hecho, se debe tener cuidado con el significado de cam ino m s corto cuando existen aristas
negativas. Si se perm iten ciclo s con co sto negativo, en to n ces se pueden recorrer repetidam ente ese ciclo
para alcanzar distancias negativas arbitrariamente grandes, por lo que se desea ceirse a cam inos aclclicos.

www.FreeLibros.me

ALGORITM OS AVIDOS

323

con un costo de un pequeo porcentaje sobre la optmal es muy satisfactoria. En


esos casos, un algoritmo vido con frecuencia brinda la forma ms rpida para
llegar a una solucin buena. De hecho, si el problema es tal que la nica forma
de alcanzar una solucin optmal es m ediante el uso de una tcnica de bsqueda ex
haustiva. un algoritmo vido u otro procedimiento heurstico para llegar a una
buena solucin, pero no necesariamente optimal, puede ser la nica opcin real.
Ejemplo 10.5. Se presenta un conocido problema donde los nicos algoritmos co
nocidos que producen soluciones oprmales son del tipo intentar todas las posibi
lidades y pueden tener tiempos de ejecucin con entradas de tam ao exponencial.
El problema, llamado problema del agente viajero, o PAV, es encontrar, en un
grafo no dirigido con pesos en las aristas, un recorrido (un ciclo simple que incluya
todos los vrtices) donde la suma de todos los pesos de las aristas sea un mnimo.
Un recorrido se suele denominar ciclo de Hamilton (o ciclo hamiltoniano).
La figura 10.15(a) m uestra un ejemplo del problem a del agente viajero,
un grafo con seis vrtices (a veces llamados ciudades). Se dan las coordenadas de
cada vrtice, y se toma el peso de cada arista como su longitud. Obsrvese que. por
convencin con el PAV, se supone que todas las aristas existen, esto es, el grafo es
completo. En ejemplos ms generales, donde los pesos de las aristas no estn basa
dos en la distancia euclidiana, se puede encontrar un peso infinito sobre aristas que
en realidad no estn presentes.
Las figuras 10.15(b) a (e) muestran cuatro recorridos de las seis ciudades de
la figura 10.15(a). El lector puede preguntarse cul de los cuatro es el optimal. si lo
es alguno. Las longitudes de los cuatro recorridos son 50.00, 49.73, 48.39 y 49.78,
respectivamente; (d) es el ms corto de todos los recorridos posibles.
El PAV tiene varias aplicaciones prcticas. Como su nombre indica, puede usar
se para planear la ruta de una persona que debe visitar varios sitios y red (15,7)
e (15,4)

0 ,7 )

b (4, 3)
( 0 . 0)

(a)

Fig. 10.15.

/ (18,0)
seis ciudades1

Ejemplo del problema del agente viajero.

www.FreeLibros.me

324

TECNICAS DE DISEO DE ALGORITM OS

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.

no haga que un vrtice tenga grado 3 o m ayor, y


no forme un ciclo, a menos que el nm ero de aristas seleccionadas sea igual al
nm ero de vrtices del problema.

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

Mtodo de retroceso Ibacktracking)

Algunas veces surge el problema de encontrar una solucin optim al a un subproble


ma, pero sucede que no existe una teora que pueda aplicarse para ayudar a encon
trar lo ptim o, si no es recurriendo a una bsqueda exhaustiva. Esta seccin se de

www.FreeLibros.me

M ETODO DE RETROCESO

325

dica a una tcnica de bsqueda exhaustiva sistemtica conocida como mtodo de re


troceso (backlracking) y una tcnica llamada poda alfa-beta, que suele reducir m u
cho la bsqueda.
Considrese un juego como el gjedrez, damas o tres en raya (gato), donde hay
dos jugadores. Los jugadores alternan las jugadas, y el estado del juego puede repre
sentarse por una posicin del tablero. Se hace la suposicin de que hay un nmero
finito de posiciones del tablero y que el juego tiene algn tipo de regla para asegurar
la terminacin. Con cada uno de esos juegos se asocia un rbol llamado rbol de jue
go. Cada nodo del rbol representa una posicin en el tablero, y se asocia la raz con
la posicin de partida. Si la posicin del tablero x se asocia con el nodo n, los hijos
de n correspondern al conjunto de movimientos posibles desde la posicin jc del ta
blero, y cada hijo se asociar con la posicin resultante. Por ejemplo, la figura 10.16
muestra parte del rbol del juego de tres en raya.
Las hojas del rbol corresponden a las posiciones del tablero donde ya no exis
ten movimientos posibles, porque uno de los jugadores ha ganado o porque todos
los cuadros estn ocupados y se produjo un empate. Se asocia un valor con cada
nodo del rbol, y primero se asignan valores a las hojas. Si el juego es tres en raya,
una hoja tendr un valor -1 , 0 1, dependiendo de si la posicin del tablero corres
ponde a una derrota, empate o victoria para el jugador 1 (jugando con f).

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

Parte del rbol del juego de tres en raya.

www.FreeLibros.me

X
0

326

TECNICAS DE DISEO DE ALGORITM OS

Los valores se propagan hacia arriba en el rbol de acuerdo con la siguiente re


gla: si un nodo corresponde a una posicin del tablero donde hay m ovimiento del
jugador 1, el valor ser el mximo de los valores de los hijos de ese nodo. Esto es.
se supone que el jugador 1 har el m ovim iento ms favorable para l, o sea, el que
produce el resultado con mayor valor. Si el nodo corresponde al movimiento del ju
gador 2, entonces el valor ser el m nim o de los valores de los hijos. Es decir, se pre
sume que el jugador 2 har su m ovimiento ms favorable, consiguiendo, de ser po
sible, una derrota para el jugador 1, o bien un empate como siguiente preferencia.
Ejemplo 10.6. Los valores de los tableros se encuentran en la figura 10.16. La hojas
que significan triunfos para O tienen el valor -1 , los empates toman el 0, y los triun
fos de X tienen +1. En seguida se procede hacia arriba en el rbol. En el nivel 8. don
de slo queda un cuadro vaco, y es un m ovimiento de X, los valores de los tableros
no resueltos son el mximo del hijo en el nivel 9.
En el nivel 7, correspondiente a un m ovimiento de O, hay dos opciones y se toma
como valor para un nodo interno el m nim o de los valores de sus hijos. El tablero
de la extrema izquierda, m ostrado en el nivel 7, es una hoja y tiene un valor 1, por
que corresponde a un triunfo de X. El segundo tablero del mismo nivel tiene un va
lor mn (0, - 1 ) - -1 , mientras que el tercero tiene valor mn (0, 1) - 0. El nico ta
blero m ostrado en el nivel 6, que corresponde a un m ovimiento de X, tiene un valor
mx (1, -1 , 0) - 1, lo que significa que existe una seleccin que X puede hacer para
ganar; en tal caso, el triunfo es inmediato.
Ntese que si la raz tiene valor 1, el jugador 1 tiene una estrategia ganadora;
cualquiera que sea su tum o, tiene la garanta de seleccionar un m ovimiento que le
d una posicin del tablero con valor 1. Cuando el tum o corresponde al jugador 2,
no tiene ms opcin que seleccionar un m ovimiento que deje una posicin del ta
blero con valor 1, lo cual significa una derrota para l. El hecho de que se suponga
que el juego term ina, garantiza que el primer jugador podr ganar. Si la raz tiene
valor 0, como sucede en el juego tres en raya, ningn jugador tiene una estrategia
ganadora, pero por lo menos puede garantizarse un empate si juega lo mejor posi
ble. Si la raz tiene valor -1 , entonces el jugador 2 tiene una estrategia ganadora.

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-

Realizacin de la bsqueda con retroceso


Supngase que se proporcionan las reglas de un juego t t . esto es, sus movimientos
vlidos y reglas de term inacin. Se desea construir su rbol de juego y evaluar la
raz, en la m anera ms obvia, y despus visitar los nodos en orden final. El recorri
do en orden final asegura que se visita un nodo interior n despus de sus hijos, y
entonces es posible evaluar n, tom ando el m nim o o el mximo de los valores de sus
hijos, lo que sea ms apropiado.
El espacio de alm acenam iento del rbol puede ser demasiado grande, pero con
cuidado nunca se necesitar alm acenar ms de un camino, desde la raz hasta un
nodo, en cualquier momento. En la figura 10.17 se presenta el esbozo de un progra
ma recursivo que representa el cam ino en el rbol por m edio de la secuencia de las
llamadas a procedimientos activos en cualquier instante. Ese programa supone lo si
guiente:
1.
2.
3.

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.

Existe un tipo tipo_tablero declarado de alguna forma adecuada para la repre


sentacin de posiciones en el tablero.

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.

TECNICAS DE DISEO DE ALGORITM OS

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)

function busca ( B : tipo_tablero; modo: tipo_m odo ) : real;


I evala la utilidad del tablero B, en el supuesto
de que es el m ovim iento del jugador 1 si modo - MAX, y es
el m ovim iento del jugador 2 si modo - MIN. Devuelve la utilidad |
var
C: tipo_tablero; I un hijo del tablero B I
valor, real; I valor m nim o o mximo temporal I
begin
if B es una hoja then
return (utilidad{B))
else begin
i asigna el valor inicial m nim o o mximo de los hijos |
if modo - MAX then
valor := -oo
else
valor ;= oo;
for cada hijo C del tablero B do
if modo - MAX then
valor mx(va/or, busca(C. MIN))
else
valor m n(valor. busca(C, MAX));
return (valor)
end
end; I busca }

Fig. 10.17.

Program a de bsqueda recursiva con el m todo de retroceso.

Otra implantacin a considerar es por medio de un programa no recursivo que con


tenga una pila de tableros correspondientes a la secuencia de llamadas activas de bus
ca. Las tcnicas estudiadas en la seccin 2.6 pueden usarse para construir dicho pro
grama.

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

de exceder de 15. As, cualquiera que sea el valor c2 no afecta al valor de n ni de


cualquier padre de n.
As, en la situacin de la figura 10.18, es posible ignorar la consideracin de los
hijos de c2 que an no se han examinado. Las reglas generales para pasar por alto o
podar nodos implican la nocin de valores tentativos y nales para los nodos. El
valor fin a l es el que se ha denom inado hasta ahora simplemente valor. U n valor

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

TECNICAS DE DISEO DE ALGORITM OS

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.

Continuando con el ejemplo, A tiene asignado un valor tentativo de 2 y la bs


queda prosigue hasta K. J tiene asignado un valor tentativo de 8. L no determina el
valor del nodo mx J. 1 recibe un valor tentativo de 8. La bsqueda sigue hacia aba
jo hasta N. y a M se le asigna un valor tentativo de 5. El nodo O debe ser explorado,
ya que 5, el valor tentativo de A/, es m enor que el valor tentativo de I. Se revisan
los valores tentativos de / y A y la bsqueda contina hasta R. Finalmente, se ex
ploran R y 5, y P recibir un valor tentativo de 4. No es necesario buscar en T ni
ms abajo, ya que eso slo dism inuira el valor de P. que ya es demasiado pequeo
para afectar al valor de A.

Bsqueda de ramificacin y acotamiento


Los juegos no son la nica clase de problemas que pueden resolverse explorando
exhaustivam ente un rbol completo de posibilidades. Hay muchos problemas que
exigen encontrar una configuracin m nim a o mxima de alguna clase que son sus
ceptibles de resolucin por medio de la bsqueda de retroceso de un rbol de todas
las posibilidades. Los nodos del rbol pueden considerarse como conjuntos de con
figuraciones y los hijos de un nodo n representan cada uno un subconjunto de las
configuraciones que n representa. Finalmente, cada hoja representa configuraciones
sencillas o soluciones al problema, y se puede evaluar cada una de las configuracio
nes con el fin de saber si es la mejor solucin encontrada hasta ese momento.
Si se es hbil en el diseo de la bsqueda, los hijos de un nodo representarn m u
chas m enos configuraciones que el nodo mismo, asi que no es necesario profundizar
mucho para alcanzar las hojas. A fin de evitar que esta nocin de bsqueda parezca
muy vaga, he aqu un ejemplo concreto.

www.FreeLibros.me

M ETODO DE RETROCESO

331

Ejemplo 10.8. Recurdese de la seccin anterior el problema del agente viajero, en


el que se dio un algoritmo vido para encontrar un buen recorrido, aunque
no necesariamente el ptim o. Ahora se analiza cmo encontrar el recorrido ptimo
por medio de la consideracin sistem tica de todos los recorridos. Una forma es te
ner en cuenta todas las permutaciones de los nodos y evaluar los recorridos que vi
sitan los nodos en ese orden, recordando el m ejor encontrado hasta el m omento. El
tiempo para esta aproximacin es 0 ( n !) en un grafo con n nodos, ya que se deben
considerar (n1)! permutaciones distintas f, y cada perm utacin tom a un tiempo
CKn).

Se presentar un enfoque un poco distinto que no es m ejor que el anterior en el


peor caso, pero en el promedio, cuando se acopla con una tcnica llam ada ramifi
cacin y acotamiento que se estudiar a continuacin produce la respuesta mu
cho ms rpido que el mtodo de intentar con todas las permutaciones. Se em
pieza construyendo un rbol, con una raz que representa todos los recorridos. Los
recorridos son lo que se denom in configuraciones en el material preliminar. Cada
nodo tiene dos hijos, y los recorridos que representa un nodo estn divididos por
esos dos hijos en dos grupos: los que tienen una arista particular y los que no. Por
ejemplo, la figura 10.20 muestra porciones del rbol para el caso del PAV de la fi
gura 10.15(a)
En la figura 10.20 se han considerado las aristas en orden lexicogrfico (a, b),
(a, c)
(a. A (b, c), ..., ( b .A (c A y as sucesivamente. Claro est que se puede
tom ar cualquier otro orden. Obsrvese que no todos los nodos del rbol tienen dos
hijos. Se pueden elim inar algunos hijos, porque las aristas seleccionadas no forman
parte de un recorrido. As, no hay nodo para los recorridos que contienen (a, b),
(a, c) y (a, /), porque a tendra grado 3 y el resultado no sera un recorrido. De for
ma semejante, al ir descendiendo en el rbol, se elim inan algunos nodos, porque al
guna ciudad puede tener grado m enor que 2. P o r ejemplo, no habr nodos para re
corridos sin (a, b), (a, c), (a. d) o (a, e).

Procedimientos heursticos necesarios para ramificacin y acotamiento


Al utilizar ideas similares a las de la poda alfa-beta, se elim inan m uchos m s nodos
del rbol de bsqueda que los m ostrados en el ejem plo 10.8. Supngase, para ser es
pecficos, que el problema es m inim izar alguna funcin, como el costo de un recorri
do en el PAV. Supngase, tam bin, que se tiene un mtodo para obtener una cota
inferior en el costo de cualquier solucin entre las del conjunto de soluciones repre
sentado por algn nodo n. Si la m ejor solucin encontrada hasta ahora cuesta me
nos que la cota inferior para el nodo n, no es necesario explorar ninguno de los no
dos por debajo de n.
Ejemplo 10.9. Se revisar una forma de alcanzar una cota inferior en ciertos con
juntos de soluciones para el PAV, los representados por nodos en un rbol de solut O bsrvese que no es necesario considerar todas las n! perm utaciones, ya que el punto de partida de
un recorrido no importa. Por tanto, se consideran slo aquellas perm utaciones que em piecen con 1.

www.FreeLibros.me

332

TECNICAS DE DISEO DE ALGORITM OS

Fig. 10.20.

Principio de un rbol solucin para un caso del PAV.

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

por un conjunto de aristas que deben estar en el recorrido y un conjunto de aristas


que tal vez no estn. Esas restricciones alteran las opciones para escoger las dos aris
tas de m enor costo en cada nodo. Es evidente que una arista restringida a perma
necer en cualquier recorrido debe incluirse entre las dos aristas seleccionadas, sin im
portar si son del m enor o segundo m enor costo o no t . Asimismo, una arista res
tringida a estar fuera no puede seleccionarse, aunque su costo sea menor.
As, si existe la restriccin de incluir la arista (a, e) y excluir (, c), las dos aristas
para el nodo a son (a, d) y (a, e), con un costo total de 9. Para b, se seleccionan (a, b)
y (b, e), igual que antes, con un costo total de 6. Para c, no es posible elegir (b, c), y
se eligen (a, c) y (c, d), con un costo total de 10. Para d, se seleccionan (a, d) y (c, d),
como antes, m ientras que para e, se deben escoger (a, e) y (b, e). La cota inferior
para esas restricciones es (9+6+9+7+10)/2 - 20.5.
.Ahora se construye el rbol de bsqueda a partir de lo sugerido en el ejem
plo 10.8. Se consideran las aristas en orden lexicogrfico, como en ese ejemplo. Por
cada ramificacin, al considerar los dos hijos de un nodo, se intenta inferir decisio
nes adicionales sobre las aristas que deben incluirse o excluirse de los recorridos re
presentados por esos nodos. Las reglas utilizadas para esas inferencias son:
1.
2.

Si la exclusin de una arista (x , y) hiciera imposible para x o y tener dos aristas


adyacentes en el recorrido, entonces debe incluirse (x, y).
Si incluir (x, y) hace que x o y tengan ms de dos aristas adyacentes en el re
corrido, o que se complete un ciclo que no sea recorrido con las aristas ya in
cluidas, entonces debe excluirse (x. y).

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

TECNICAS DE DISEO DE ALGORITM OS

Al ramificar, despus de hacer todas las inferencias posibles, se calculan las co


tas inferiores de ambos hijos. Si la cota inferior de un hijo es tan grande o mayor
que el recorrido de costo m enor encontrado hasta ese momento, se poda ese hijo
y no se construyen ni consideran sus descendientes. Curiosamente, hay situaciones
donde la cota inferior de un nodo n es m enor que la m ejor solucin existente en
contrada, y an as ambos hijos de n se pueden podar, porque sus cotas inferiores
exceden del costo de la m ejor solucin encontrada hasta el momento.
Si no es posible podar nign hijo, como regla heurstica se considerar primero
el hijo con la cota inferior m s pequea, con la esperanza de alcanzar m s rpido
una solucin ms econmica que la m ejor encontrada hasta el m om ento t. Despus
de considerar un hijo, se debe evaluar otra vez si puede podarse su hermano, ya que
pudo haberse encontrado una m ejor solucin nueva. Para el caso de la figura 10.21,
se obtiene rbol de la figura 10.22. Para interpretar los nodos de ese rbol, es til
entender que las letras maysculas son los nom bres de los nodos del rbol de bs
queda; los nm eros son las cotas inferiores, y se listan las restricciones aplicadas al
nodo, pero no sus antecesores, escribiendo x y si la arista (x, y) debe incluirse, y xy,
si (x, y) debe excluirse. Obsrvese tam bin que las restricciones introducidas en un
nodo se aplican a todos sus descendientes. As, para obtener todas las restricciones
aplicables en un nodo debe seguirse el cam ino desde ese nodo hasta la raz.
Por ltimo, se hace hincapi en que, como para la bsqueda de retroceso gene
ral, se construye el rbol nodo por nodo, reteniendo slo un camino, com o en el al
goritmo recursivo de la figura 10.17, o su contraparte no recursiva. Quiz se prefie
ra la versin no recursiva, para m antener dentro de una pila la lista de restricciones.
Ejemplo 10.10. La figura 10.22 muestra el rbol de bsqueda para el caso del PAV
de la figura 10.22. Con el fin de ver cmo se construye, se parte de la raz A de la
figura 10.22. La prim era arista en orden lexicogrfico e s ja , b), as que se consideran
los hijos B y C, correspondientes a las restricciones ab y ab, respectivamente. D e mo
m ento no hay una m ejor solucin hasta aqu, por lo que se considerarn B y C t tForzar la inclusin de (a, b) no sube la cota inferior, pero excluir tal arista produce
la cota 18.5, ya que las dos aristas vlidas m s econmicas para los nodos a y b to
talizan 6 y 7, respectivamente, comparadas con 5 y 6 sin restricciones. Siguiendo el
procedimiento heurstico, se considerarn prim ero los descendientes del nodo B.
La siguiente arista en orden lexicogrfico es (a, c). Se introducen los hijos D y E
correspondientes a los recorridos en que (a, c) est incluida y excluida, respectiva
mente. En el nodo D, se infiere que ni (a, d) ni (a, e) pueden estar en un recorrido;
de otra forma, a puede tener demasiadas aristas incidentes. De acuerdo con el pro
cedim iento heurstico, se analiza E antes que D, para ramificar sobre la arista (a, d).
Los hijos F y G se introducen con cotas inferiores 18 y 23, respectivamente. Para
cada uno de esos hijos se conocen unas 3 aristas incidentes sobre a, por lo que se
puede deducir algo acerca de la arista restante (a, e).
t U na alternativa es usar un procedim iento heurstico para obtener una buena solucin con las res
tricciones requeridas para cada hijo. Por ejem plo, se deber poder m odificar el algoritm o vido del PAV
para respetar las restricciones.
t t Se puede em pezar con alguna solucin encontrada heursticam ente, co m o la vida, aunque eso no
afecte a nuestro ejem plo. La solucin vida para la figura 10.21 tiene un costo de 21.

www.FreeLibros.me

ALGORITMOS DE BUSQUEDA LOCAL

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

Algoritm os de bsqueda local

Algunas veces, la siguiente estrategia producir una solucin optim al para un


problema.
1. Empezar con una solucin aleatoria.
2. Aplicar a la solucin actual una transform acin de un conjunto dado de trans
formaciones para m ejorar la solucin; la m ejora es la nueva solucin actual.
3. Repetir hasta que ninguna transform acin del conjunto pueda m ejorar la solu
cin actual.
La solucin resultante puede ser optim al o no. En principio, si el conjunto de
transformaciones dado incluye todas las que tom an una solucin y la reemplazan
por otra, entonces no se parar hasta alcanzar la solucin optimal. Pero, en ese caso,
el tiem po para aplicar (2) es el m ismo que el necesario para exam inar todas las so
luciones, y todo el enfoque no tiene mucho sentido.

www.FreeLibros.me

336

TECNICAS DE DISEO DE ALGORITMOS

Fig. 10.22.

Arbol de bsqueda para la solucin del PAV.

El mtodo tiene sentido cuando se puede restringir el conjunto de transforma


ciones a un conjunto pequeo, de modo que en poco tiempo se puedan considerar
todas las transform aciones posibles; tal vez deben permitirse las CKn2) u 0 (n 3) trans
formaciones cuando el problema es de tam ao n. Si el conjunto de transform a
ciones es pequeo, es natural considerar las soluciones, que pueden ser transforma
das entre s en un paso como cercanas. Las transformaciones se llaman transfor
maciones locales, y el mtodo se conoce como bsqueda local.
Ejemplo 10.11. Un problema que se puede resolver con exactitud mediante bs
queda local es el de los rboles abarcadores minimales. Las transformaciones loca
les son aquellas en las que se toma alguna arista que no se encuentra en el rbol
abarcador actual, se agrega al rbol, que debe producir un ciclo nico, y despus eli
m inar exactamente una arista del ciclo (probablemente la de costo mayor) para for
m ar un rbol nuevo.
Por ejemplo, considrese el grafo de la figura 10.21. Se empieza con el rbol mos
trado en la figura 10.23(a). Una transform acin que se puede realizar es agregar la
arista (d, e) y quitar otra del ciclo formado, el cual es (e, a, c, d, e). Si se elimina la
arista (a, e), se reduce el costo del rbol de 20 a 19. Esa transformacin puede ha
cerse dejando el rbol de la figura 10.23(b), al cual se intenta aplicar de nuevo una
transform acin de mejora, como insertar la arista (a, d) y eliminar la (c, d) del ciclo

www.FreeLibros.me

ALGORITM OS DE BUSQUEDA LOCAL

337

formado. El resultado se m uestra en la figura 10.23(c). Despus es posible introdu


cir (a, b) y elim inar (6, c), como en la figura 10.23(d), y ms tarde introducir (b, e)
en favor de (d, e). El rbol resultante de la figura I0.23(e) es minimal. Se puede com
probar si cada arista ausente en ese rbol tiene costo mayor que cualquier otra aris
ta dentro del ciclo que forma. As, ninguna transform acin es aplicable a la figura
10.23(c).
El tiempo requerido por el algoritmo del ejemplo 10.11 en un grafo de n nodos
y a aristas depende del nm ero de veces que se necesite m ejorar la solucin. La
sola prueba de que ninguna transform acin es aplicable puede llevar un tiempo
0(na), ya que deben probarse a aristas, y cada una puede form ar un ciclo de longi
tud cercana a n. As, el algoritmo no es tan bueno como los algoritmos de Prim o
de Kruskal, pero sirve como ejemplo de que puede obtenerse una solucin optimal
por bsquedas locales.

Algoritmos de aproximacin por bsqueda local


Los algoritmos de bsqueda local han tenido gran efectividad como mtodos heu
rsticos para la solucin de problemas cuyas soluciones exactas requieren tiem po ex
ponencial. Un mtodo comn de bsqueda es empezar con un nm ero de solucio
nes aleatorias y aplicar las transformaciones locales a cada una. hasta alcanzar una
solucin /ocalmente optimal, que ninguna transformacin pueda mejorar. Con fre
cuencia se alcanzarn diferentes soluciones localmente optimales, a partir de la ma
yor parte o de todas las soluciones iniciales aleatorias, como se sugiere en la figura

Fig. 10.23.

Bsqueda local para un rbol abarcador minimal.

www.FreeLibros.me

338

TECNICAS DE DISEO DE ALGORITM OS

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.

Problema del agente viajero


El PAV es uno de los problem as en que las tcnicas de bsqueda local han sido muy
satisfactorias. La transform acin ms sim ple que se ha usado se conoce como op
cin doble. Consiste en tom ar dos aristas cualesquiera, tales como (A, B) y (C, D)
de la figura 10.25, quitndolas y reconectando sus extremos para form ar un recorri
do nuevo. En esta figura, el recorrido nuevo va desde B hasta C en el sentido de las
manecillas del reloj, despus sigue por la arista (C, A), desde A hasta D en sentido
contrario al de las manecillas del reloj y finalm ente por la arista (D , B). Si la suma
de las longitudes de (A, Q y (B, D) es m enor que la suma de las longitudes de (A, B)
y (C, D ), se tendr un recorrido m ejorado t- Obsrvese que no se pueden conectar
Soluciones iniciales

Costo
Localmente optimal
optimal
Fig. 10.24.

Globalm ente optim al


optim al

B squeda local en el espacio de soluciones.

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

ALGORITM OS DE BUSQUEDA LOCAL

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.

Optimacin de un caso del PAV con opcin doble.

www.FreeLibros.me

340

TECNICAS DE DISEO DE ALGORITM OS

Se puede generalizar la opcin doble a opcin k para alguna k constante, donde


se eliminan hasta k aristas y se reconectan los segmentos restantes en cualquier or
den hasta producir un recorrido. Obsrvese que no se requiere que las aristas supri
midas no sean adyacentes en general, si bien para el caso de la opcin doble no te
na sentido considerar la supresin de dos aristas adyacentes. Obsrvese tambin
que para A: > 2, existe ms de una forma de conectar los segmentos. Por ejemplo,
la figura 10.27 muestra el proceso general de opcin triple utilizando cualquiera de
los ocho conjuntos de aristas siguientes.
1.

2.
3.

(A, F), (D, E), (B, O


(A ,F )A C ,E )A D ,B )
(A, ), (F, D), (B. O

4. (A, E), (F, C), (B, D)


5.

( 4 ,D ) A C ,E )A B ,F )

6.

(A, D)AC, F)AB, E)

7.

(A, C), (>, E), (B, F)

8.

(A, Q A D , F)AB, E)

(como fue el recorrido)


(una opcin doble)
(otra opcin doble)
(una opcin triple real)
(otra opcin triple real)
(otra opcin triple real)
(una opcin doble)
(una opcin triple)

E
Fig. 10.27.

Segm entos de un recorrido d esp u s de la supresin de tres aristas.

Es fcil verificar que, para una k fija, el nmero de diferentes transformaciones


con opcin k que se necesita considerar, si existen n vrtices, es 0 (n k). Por ejemplo,
el nm ero exacto es n (n -3) /2 para k = 2. Sin embargo, el tiempo requerido para ob
tener un recorrido localmente optimal puede ser mucho mayor que esto, ya que se
pudieron haber realizado muchas transformaciones locales antes de alcanzar un re
corrido localmente ptimo, y cada transform acin de mejora introduce aristas nue
vas que pueden participar en transformaciones posteriores que mejoran an ms el
recorrido fijado. Lin y Kemighan [1973] han encontrado que la opcin de profun
didad variable es un mtodo muy poderoso en la prctica, y tiene una buena opor
tunidad de obtener el recorrido ptim o en problemas de ciudades entre 40 y 100.

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

ALGO RITM OS DE BUSQUEDA LOCAL

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

w(pk, p). Igualmente, sea R j ) X

k-j* I

w (Pk> P)- Se obtienen me-

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

TECNICAS DE DISEO DE ALGORITM OS

(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

Cuntos movim ientos realizan los algoritmos para desplazar n discos en


el problema de las torres de Hanoi?

*10.2

Prubese que el algoritmo recursivo (dividir para vencer) de las torres de


Hanoi y el algoritmo simple no recursivo descrito al principio de la seccin
10.1 efectan los mismos pasos.

10.3

Mustrense las acciones del algoritmo de la multiplicacin de enteros de di


vidir para vencer de la figura 10.3 al m ultiplicar 1011 por 1101.

*10.4

Generalcese la programacin del torneo de tenis de la seccin 10.1 para tor


neos en los que el nm ero de jugadores no sea una potencia de dos. Suge-

www.FreeLibros.me

EJERCICIOS

343

renda. Si el nm ero de jugadores n es impar, un jugador debe quedar sin


jugar algn da, y el torneo necesitar n das para term inar, en vez de n - 1.
No obstante, si hay dos grupos con un nm ero im par de jugadores, los que
obtienen el da sin jugar de cada grupo pueden jugar entre s.
10.5

El nm ero de combinaciones de m objetos de n, denotado por (^ ), para


> l y O < m < n , se puede definir recursivamente por
(^ ) - l s i m - O o m - n
( n ) - ( n ~ ' ) + ( " l ) si 0 < m < n
m ' Km - \ '
a)
b)

Proporcinese una funcin recursiva para calcular (^ ).


Cul es el tiempo de ejecucin en el peor caso, como una funcin de
ni

c)

Obtngase un algoritmo de programacin dinm ica para calcular ( n ).


Sugerenda: El algoritmo construye una tabla conocida como tringulo
de Pascal.
d) Cul es el tiempo de ejecucin de la respuesta a c) como una funcin
de n i

10.6

Otra forma de calcular el nmero de combinaciones de m objetos de n es


m ediante (n ) (n - 1) (n - 2 ) ... (n - m + 1)/(1) ( 2 ) ... (m).
a)

Cul es el tiempo de ejecucin en el peor caso de este algoritmo como


una funcin de n i
*b) Es posible calcular la funcin de las apuestas de la Serie Mundial
de Bisbol f \ i , j ) de la seccin 10.2 de una forma similar? Con qu
rapidez puede realizarse este clculo?
10.7 a)

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

Prubese que de la ecuacin (10.4) resultan exactamente ( l * ^ ) llamadas a


P.

10.10

Encuntrese una triangulacin m inim al para un octgono regular, supo


niendo que las distancias son euclidianas.

10.11

El problema de divisin en prrafos, en una forma muy simple, puede for


mularse como sigue: se da una secuencia de palabras p u p 1
pk de lon
gitudes /,, l2, ..., /*, que se desea agrupar en lneas de longitud L. Las pala
bras estn separadas por espacios cuya am plitud ideal es b, pero los espa-

www.FreeLibros.me

344

TECNICAS DE DISEO DE ALGORITMOS

cios pueden reducirse o ampliarse si es necesario (pero sin solapamiento de


palabras), de tal forma que una lnea p,. px ... p, tenga exactamente lon
gitud L. Sin embargo, la multa por reduccin o ampliacin es la magnitud
de la cantidad total que los espacios se comprimen o amplan. Esto es, el
costo de fijar la lnea p, pltX ... p, es j - i) \b '-b \, donde b'. el ancho real
de los espacios, es (L - /, - / , . ,
l) / (j - i). No obstante, si j - k (la l
tim a lnea), el costo es cero, a menos que b ' < b, ya que no es necesario am
pliar la ltim a lnea. Plantese un algoritmo de programacin dinmica
para encontrar la separacin de m enor costo de p x, p2,
p* en lneas de
longitud L. Sugerencia: Para i - k, k - 1,.... 1, calclese el m enor costo de
fijar p,. p ,
ph
10.12

Supngase que se dan n elementos jr,t x 2, ... , x Hrelacionados por un orden


lineal x x < x 2 < ...< .x, y que se desea disponer los m elementos dentro de
un rbol binario de bsqueda. Supngase que p, es la probabilidad que se
requiere de que una solicitud para encontrar un elemento se refiera a x,. En
tonces, para cualquier rbol binario de bsqueda, el costo promedio de una
bsqueda es

p,(d, + 1), donde d es la profundidad del nodo que con-

tiene a x r Dados los p, y en el supuesto de que los x, nunca cambian, es


posible encontrar un rbol binario de bsqueda que reduzca el costo. Dse
un algoritmo de programacin dinm ica para hacerlo. Cul es el tiempo
de ejecucin de ese algoritmo? Sugerencia: Calclese para todas las i y j
el costo de bsqueda optim al entre todos los rboles que contienen slo
x, x u
x UJ. |, esto es, los j elementos comenzando desde x,.
**10.13 Para qu valores de monedas produce una solucin optimal el algoritmo
vido que calcula cambios de la seccin 10.3?
10.14

10.15

a) Escrbase el algoritmo de triangulacin recursivo analizado en la sec


cin 10.2.
b) Mustrese que el algoritmo recursivo produce exactamente 31-4 llama
das a problemas no triviales cuando se inicia en un problema de tamao
s > 4.
Descrbase un algoritmo vido para
a) el problema de la colocacin unidimensional de paquetes, y
b) el problema de la separacin en prrafos (Ejercicio 10.11). Proporci
nese un ejemplo donde el algoritmo no produzca una respuesta optimal, o
demustrese que tal ejemplo no existe.

10.16

Plantese una versin no recursiva del algoritmo del rbol de bsqueda de


la figura 10.17.

10.17

Considrese un rbol de juego en el cual hay seis fichas y los jugadores 1 y


2 se turnan de una a tres fichas. El jugador que tome la ltim a ficha pierde
el juego.

www.FreeLibros.me

NOTAS BIBLIOGRAFICAS

a)
b)

c)

345

Dibjese el rbol de juego completo.


Si el rbol de juego completo se explorara m ediante la tcnica de poda
alfa-beta y se analizaran prim ero los nodos que representan las confi
guraciones con el m enor nm ero d e fichas, qu nodos se podaran?
Quin resulta vencedor si am bos jugadores hacen sus mejores jugadas?

*10.18

Desarrllese un algoritmo de ramificacin y acotam iento para el PAV, ba


sado en la idea de comenzar un recorrido en el vrtice 1 y de que en cada
nivel la ram ificacin se basa en el nodo que sigue en el recorrido (en vez
de en la eleccin de una arista en particular, como en la Fig. 10.22). Qu
estimacin es correcta para la cota inferior de las configuraciones, que son
listas de vrtices 1, v,, v2, ... que em piezan un recorrido? Cmo se com
porta el algoritmo en la figura 10.21, suponiendo que a es el vrtice 1?

*10.19

Un posible algoritmo de bsqueda local para el problem a de la separacin


en prrafos es perm itir transform aciones locales que pasen la prim era pa
labra de una lnea a la lnea anterior o la ltim a palabra de una lnea a la
lnea siguiente. Este algoritmo ser localmente optim al, en el sentido de
que toda solucin localmente optim al es una solucin globalmente optimal?

10.20

Si las transform aciones locales slo consisten en opciones dobles, hay al


gn recorrido localmente optim al en la figura 10.21 que no sea globalmen
te optimal?

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

Un modelo para cmputos con almacenamiento externo

En los algoritmos estudiados en captulos anteriores, se ha supuesto que la cantidad


de datos de entrada es lo bastante pequea como para que quepan en la memoria
al mismo tiempo. Pero, qu sucede si se desea clasificar a todos los empleados de
gobierno de acuerdo con su antigedad, o almacenar toda la informacin de los im
puestos de la nacin? En problemas como stos, la cantidad de datos por procesar
supera la capacidad de la memoria principal. La mayor parte de los grandes siste
mas de cmputo tienen dispositivos de alm acenam iento externo conectados en l
nea, como discos o dispositivos de almacenamiento masivo, en los cuales se pueden
alm acenar cantidades muy grandes de datos. Sin embargo, esos dispositivos tienen
caractersticas de acceso que difieren mucho de las de la memoria principal. Se han
desarrollado diversas estructuras de datos y algoritmos para utilizar con ms eficien
cia esos dispositivos. Este captulo comprende las estructuras de datos y algoritmos
para clasificar y recuperar la informacin almacenada en memoria secundaria.
El lenguaje Pascal, y algunos otros, tienen el tipo de datos archivo, destinado a
representar datos almacenados en memoria secundaria. Aunque el lenguaje utiliza
do no tenga este tipo de datos, es indudable que el sistema operativo debe manejar
la nocin de archivos en memoria secundaria. T anto si se habla de los archivos de
Pascal como de los m anipulados directam ente por el sistema operativo, se encuen
tran limitaciones a la forma en que puede accederse a los archivos. El sistema ope
rativo divide la memoria secundaria en bloques de igual tam ao. El tam ao de los
bloques vara entre los distintos sistemas operativos, pero de 512 a 4096 bytes es lo
tpico.
Se considera un archivo como si estuviera alm acenado en una lista enlazada de
bloques, aunque lo ms comn es que el sistema operativo utilice una disposicin

www.FreeLibros.me

U N M ODELO PARA COM PUTOS CON ALMACENAM IENTO EX TERN O

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.

Costo d las operaciones con almacenamiento secundario


Dada la naturaleza de los dispositivos de alm acenam iento secundario, como los dis
cos, el tiempo para encontrar un bloque y leerlo a la memoria principal es muy gran
de, comparado con el tiempo que lleva procesar el dato. Por ejemplo, supngase que
se tiene un bloque de 1000 enteros dentro de un disco que gira a 1000 rpm. El tiem
po que lleva colocar la cabeza sobre la pista que contenga este bloque (tiempo de bs
queda), ms el tiempo consum ido en esperar que el bloque quede bajo la cabeza
(tiempo de latericia), puede ser de 100 milisegundos en promedio. El proceso de es
critura de un bloque en un lugar particular dentro del alm acenam iento secundario
lleva una cantidad similar de tiempo. Sin embargo, la mquina puede efectuar
100 000 instrucciones en esos 100 milisegundos. Este tiem po es ms que suficiente

www.FreeLibros.me

348

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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

La clasificacin de datos organizados como archivos o de forma ms general, la cla


sificacin de datos almacenados en memoria secundaria, se conoce como clasifica
cin externa. Este estudio de clasificacin externa parte del supuesto de que los
datos estn almacenados en un archivo de Pascal. Se presenta la forma en que un
algoritmo de clasificacin por intercalacin puede ordenar un archivo de n regis
tros en slo Ofiogn) pasadas por el archivo; esta cifra es mucho mejor que los CKn)
pasos requeridos por los algoritmos estudiados en el captulo 8. Despus se estudia
cmo la utilizacin de ciertas caractersticas del sistema operativo para controlar la
lectura y escritura de bloques en tiempos adecuados puede acelerar la clasificacin
al reducir el tiem po en que el com putador est ocioso, esperando la lectura o escri
tura de un bloque hacia o desde la memoria principal.

Clasificacin por intercalacin


La idea esencial en la clasificacin por intercalacin es organizar un archivo en frag
mentos cada vez ms grandes, esto es, secuencias de registros ru
rt, donde la cla
ve de r, no es mayor que la clave de r , , , para l < i < k. Se dice que un archivo
r ..., rm de registros est organizado en fragmentos de longitud k si para toda / >: 0 tal
que ki < m. r*(, . | )+|, rt(l. l) +2>. es un fragmento.de longitud k, y adems si m
no es divisible entre k, y m - p k + q, donde q < k, por lo que la secuencia de regis
tros rm_(J+,, rm. Qt2,
rm, llamada cola, es un fragmento de longitud q. Por ejem
plo, la secuencia de enteros m ostrada en la figura l l.l est organizada en fragmen
tos de longitud 3. Obsrvese que la cola es de longitud m enor que 3, pero consta de
registros ordenados, a saber, 5 y 12.
7

15

Fig. 11.1.

29

11

13

16

22

31

Archivo con fragmentos de longitud tres.

www.FreeLibros.me

12

CLASIFICACION EXTERNA

349

El paso bsico en una clasificacin por intercalacin en archivos es em pezar con


dos archivos, com o/, y / , organizados en fragmentos de longitud k. Suponiendo que
1. el nmero de fragmentos, incluyendo las colas, en / , y / difiere a lo sum o en 1,
2. como mximo uno d e / , y f tiene cola, y
3. el nico con cola tiene por lo menos tantos fragmentos como el otro.
Es un proceso sencillo leer un fragmento d e / y / , com binar ambos y unir el frag
mento resultante, de longitud 2k, en alguno de los archivos g, y g2, que se han or
ganizado en fragmentos de longitud 2k. Alternando entre g, y g2, se hace que esos
archivos no slo se organicen en fragmentos de longitud 2k, sino que satisfagan (1).
(2) y (3). Para ver que (2) y (3) se satisfacen, es til observar que la cola entre los
fragmentos d e / y / queda combinada en (o quiz ya est) el ltimo fragmento creado.
Se empieza por dividir los n registros en dos a rc h iv o s / y / , lo ms uniforme
mente posible. Cualquier archivo se puede considerar organizado en fragmentos de
longitud 1. Despus, se combinan en fragmentos de longitud 1 y se distribuyen en
los archivos g, y g2, organizados en fragmentos de longitud 2. Se vacan/ y / , y se
combinan g, y g2 en / y f 2, ahora estarn organizados en fragmentos de longitud 4.
Despus, se combinan / y / para crear g, y g2 organizados en fragmentos de longi
tud 8, y as sucesivamente.
Despus de / pasadas de esta naturaleza, se tendrn dos archivos constituidos
por fragmentos de longitud 2. Si 2' > n, uno de los dos archivos estar vacio y el
otro tendr un solo fragmento de longitud n, esto es, estar clasificado. Como 2' > n
cuando i > logn. flognl pasadas son suficientes. Cada pasada requiere la lectura de
dos archivos y la escritura de otros dos, longitud aproxim ada n/2. El nm ero total
de bloques ledos o escritos en cada paso es aproxim adam ente 2n/b, donde b es el
nmero de registros que caben en un bloque. De este modo, el nmero de bloques
ledos y escritos por el proceso de clasificacin completo es 0((n\ogn)/b) o, de otra
forma, la cantidad de lecturas y escrituras es casi la misma que la requerida para ha
cer 0(log/i) pasadas por los datos almacenados en un solo archivo. Esta cifra supone
una importante mejora de las 0(n) pasadas requeridas por muchos de los algorit
mos de clasificacin tratados en el captulo 8.
La figura 11.2 m uestra el proceso de combinacin en Pascal. Se leen dos archi
vos organizados en fragmentos de longitud k y se escriben dos archivos organizados
en fragmentos de longitud 2k. Como ejercicio, se deja la especificacin de un algo
ritmo que siga las ideas anteriores y que utilice el procedimiento combina de la fi
gura 11.2 logn veces para clasificar un archivo de n registros.
procedure combina ( k : integer; I longitud del fragmento de entrada !
g l, g2: file of tipo_registro );
var
conm utasalida : boolean; I indica si la escritura es en g l (verdadero) o en
g l (falso) |
ganador, integer; I elige el archivo con la m enor clave del registro actual 1
usado: array [1..2] of integer; ! usado[j] indica cuntos registros se han
ledo hasta ahora en el fragmento actual del archivo / 1
fin : array [1..2] of boolean; \fin[j] es verdadero si ha term inado el

www.FreeLibros.me

350

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

fragmento de f - se han ledo k registros o se ha alcanzado el fin del


archivo de |
actual-, array [1..2] of tipo_registro; | los registros actuales de ambos
archivos}
procedure toma-registro (/': integer ); 1avanza el archivo f , pero no ms all
del final del archivo o del fragmento. Fija jin [ i\ si se encuentra el fin del
archivo o del fragmento !
begin
u s a d o [ \u s a d o [ \ + 1;
if {usado\\ - k) or
(i - 1) and eofiJ\ ) or
(/ = 2) and eofi/2) then fin[i] : true
else if / = 1 then read(f[, actuat[\\)
else read{fl, actual[2])
end; | tom a-registro)
begin ! combina I
conmuta-salida : true; {los primeros fragmentos intercalados van hacia g 1 (
rewrite(gl); rewrite(g2)-,
reset(fl); reset{fl)\
while not eoflfl) or not eofl/2) do begin | intercala dos archivos )
{asigna valor inicial i
usado[ 1] 0 ; usado[2) 0;
fin[ 1] > false; fin[2\ := false;
tom a-registrd 1); toma-registro(2);
while noty?n[l] or not fin[2] do begin I intercala dos fragmentos i
{elige ganador |
if fin[ 1] then ganador := 2
\ f l gana por om isin; el fragmento de f \ se term in |
else if fw [2 \ then ganador := I
l / l gana por om isin }
else | ningn fragmento se ha term inado !
if actual[\].clave < actual[2\.clave then ganador > 1
else g a n a d o r 2;
I escribe el registro del ganador |
if conm utasalida then write(g 1, actual[ganador])
else write{g2, actual[ganador])\
( avanza el archivo ganador 1
toma-registro(ganador)
end;
I se ha term inado la intercalacin de dos fragmentos; se conm uta el
archivo de salida y se re p ite !
c o n m u t a s a l i d a not conm utasalida
end
end; I com bina}
Fig. 11.2.

Procedimiento combina.

www.FreeLibros.me

CLASIFICACION EXTERNA

351

Obsrvese que el procedimiento combina de la figura 11.2 nunca requiere un frag


mento completo en memoria; lee y escribe un registro de cada vez. No se desea al
macenar los fragmentos completos que se encuentran en memoria principal que obli
guen a tener dos archivos de entrada. En otro caso, se podran leer dos fragmentos
al mismo tiempo desde un solo archivo.
Ejemplo 11.1. Considrese la lista de 23 nmeros que se muestra dividida en dos
archivos en la figura 11.3(a). Se empieza por combinar fragmentos de longitud I
para crear los dos archivos de la figura 11.3(b). Por ejemplo, los primeros fragmen
tos de longitud uno son 28 y 31, y se combinan tom ando primero 28 y luego 31. Los
dos fragmentos siguientes de longitud uno, 3 y 5, se combinan para form ar uno de
longitud dos, que se coloca en el segundo archivo de la figura 11.3(b). Los fragmen
tos se separan en la figura 11.3(b) por medio de lineas verticales que no son parte
del archivo. Obsrvese que el segundo archivo de la figura 11.3(b) tiene una cola de
longitud uno, el registro 22, mientras que el prim er archivo no tiene cola.
Se pasa, de la figura 11.3(b) a la figura 11.3(c) com binando los fragmentos de lon
gitud dos. Por ejemplo, los fragmentos 28, 31 y 3, 5, se combinan para form ar 3, 5,
28, 31 de la figura 11.3(c). Al alcanzar los fragmentos de longitud 16 de la figura
11.3(e), un archivo tiene un fragmento completo y el otro slo tiene una cola, de lon
gitud 7. En la ltima etapa, donde los archivos estn en apariencia organizados como
fragmentos de longitud 32, sucede que se tiene un archivo formado slo por una
cola, de longitud 23, y el segundo se encuentra vaco. El fragmento sencillo de lon
gitud 23 es, por supuesto, la clasificacin que se buscaba.

Aceleracin de la clasificacin por intercalacin


Por medio de un ejemplo simple se ha m ostrado el proceso de la clasificacin por
intercalacin partiendo de fragmentos de longitud 1. Se aprovechar ms el tiempo
si se empieza con un paso que, para una k apropiada, lea grupos de k registros den
tro de la memoria principal, los ordene, por ejemplo, con clasificacin rpida, y los
devuelva a la memoria secundaria como un fragmento de longitud k.
Por ejemplo, un milln de registros, necesitaran 20 pasadas por los datos para
hacer la clasificacin empezando con fragmentos de longitud 1. Sin embargo, si se
pueden tener 10 000 registros a la vez en la memoria principal, tam bin se pueden
leer 100 grupos de 10 000 registros en una pasada, clasificar cada grupo, y dejar 100
fragmentos de longitud 10 000 distribuidos uniformemente entre dos archivos. Sie
te pasadas de intercalacin ms culminarn con un archivo organizado como un frag
mento de longitud 10 000 x 27 - 1 280 000, lo que es mayor que un milln y signi
fica que los datos estn clasificados.

Mlnimlzacln del tiem po transcurrido

www.FreeLibros.me

352

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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

organizados en fragmentos de longitud 4

(d)
3
8

65
9

organizados en fragmentos de longitud 2

3
5 28 31
10 40 93 06

3
9

54
85

40 93 96
65 85 90

10

10 22 69

77

organizados en fragmentos de longitud 8


13 28
22 69

(e)

30 31 39
77

40

54

65

8590

93

96

organizados en fragmentos de longitud 16

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.

organizados en fragmentos de longitud 32


Clasificacin por intercalacin de una lista.

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

las operaciones en colas de prioridad INSERTA y SU PR IM E-M IN en tiempo loga


rtmico. Para seleccionar el registro con la clave ms pequea de la cola de priori
dad, se realiza SU PRIM E-M IN , y despus INSERTA, en la cola de prioridad del
siguiente registro del archivo del ganador, como reemplazo del registro seleccionado.
Si hay n registros, y la longitud de los fragmentos se multiplica por m en cada
paso, despus de i pasadas los fragmentos sern de longitud m. Si m > n, esto es,
despus de i - logmn pasadas, la lista completa estar clasificada. Como logmn - log2/i/log2 m, se ahorra en un factor de Iog2m el nmero de veces que se lee cada re
gistro. Ms an, si m es el nm ero de unidades de disco utilizadas para los archivos
de entrada, y m son usadas para la salida, es posible procesar datos m veces tan r
pido como si existiera slo una unidad de disco para la entrada y una para la salida,
o 2m veces tan rpido como si los archivos de entrada y salida estuvieran almace
nados en una unidad de disco. Lamentablemente, increm entar m en forma indefi
nida no acelera el procesamiento en un factor de logm.' La razn de esto es que para
una m suficientemente grande, el tiempo requerido por la intercalacin en memoria
principal, que en realidad se incrementa como logm, ser superior al de lectura o es
critura de datos. En este punto, si hay incrementos posteriores en m, aumentarn el
tiempo transcurrido, ya que el clculo en memoria principal se convertir en el em
botellamiento.

Clasificacin en varias fases


Es posible realizar una clasificacin por intercalacin de m-caminos con slo m + 1
archivos, como alternativa a la estrategia descrita antes, que emplea 2m archivos.
Se efecta una secuencia de pasadas al intercalar fragmentos de m de los archivos
en otros ms largos en el archivo restante. Es necesario tener en cuenta los siguientes:
En una pasada, cuando los fragmentos de cada uno de los m archivos se inter
calan en fragmentos del (m + l)-simo archivo, no es necesario usar todos los frag
mentos en cada uno de los m archivos de entrada. Antes bien, cada archivo,
cuando es de salida, se ocupa con fragmentos de cierta longitud. Se usan algu
nos de esos fragmentos para ayudar a llenar cada uno de los otros m archivos
cuando les llegue el turno de ser archivos de salida.
2. Cada paso produce archivos de longitud diferente. Puesto que cada uno de los
archivos cargados con fragmentos en las m pasadas previas contribuye a los frag
mentos del paso actual, la longitud en una pasada es la suma de las longitudes
de los fragmentos producidos en las m pasadas previas. (Si se han dado menos
de m pasadas, habr que considerar todos los anteriores como si produjeran frag
mentos de longitud 1.)
1.

Este proceso de clasificacin por intercalacin se conoce como clasificacin en


varias fases (polyphase sorting). El clculo exacto de los nmeros de pasadas necesa
rias como una funcin de m y n (el nm ero de registros), y el clculo de la distribu
cin inicial de los fragmentos en m archivos se dejan como ejercicio. Sin embargo,
aqu se dar un ejemplo para dar idea del caso general.

www.FreeLibros.me

CLASIFICACION EXTERNA

355

Ejemplo 11.2. Si m - 2, se comienza con dos archivos / , y / , organizados en frag


mentos de longitud 1. Los registros de / y / 2 se intercalan para hacer fragmentos de
longitud 2 en un tercer archivo, / . Slo se intercalan suficientes fragmentos para va
ciar f . Despus, se intercalan los restantes de longitud 1 de / , con un nm ero igual
de fragmentos de longitud 2 de / . Los resultantes, de longitud 3, quedarn coloca
dos en f . Despus, deben intercalarse los de longitud 2 d e / con los de longitud
3 d e / . Esos fragmentos, de longitud 5, se colocan e n / , que qued vaco en la pa
sada anterior.
La secuencia de longitudes de los fragmentos 1, 1, 2, 3, 5, 8, 13, 2 1 ,..., es la su
cesin de Fibonacci. Esta secuencia se genera por medio de la relacin de recurren
cia F0 - F, - 1, y F,_ , + F_2, para i >: 2. Obsrvese que la razn entre los n
m eros de F ibonacci con secu tiv o s Fi t l /F, se acerca a la razn dorada
(V 3 + l)/2 - 1.618... conforme i crece.
De aqu se deduce que para que el proceso contine hasta que la lista quede cla
sificada, los nmeros iniciales de registros en / y / 2 deben ser dos nm eros conse
cutivos de Fibonacci. Por ejemplo, la figura 11.4 m uestra qu sucede al em pezar con
n - 34 registros (34 es el nm ero de Fibonacci Fg), distribuidos 13 e n /, y 21 e n / .
(13 y 21 son el sexto y el sptimo nmeros de Fibonacci, as que la razn F7/F6 es
muy cercana a 1.618; de hecho, es 1.615.) El estado de un archivo se representa en
la figura 11.4 como a(b), lo cual significa que tiene a fragmentos de longitud b.
despus
de la pasada
inicial
1
2
3
4
5
6
7

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)

Ejemplo de clasificacin en varias fases.

Un caso en el que la velocidad de entrada/salida


no es un cuello de botella
Cuando la lectura de archivos es el cuello de botella, el siguiente bloque debe esco
gerse con sumo cuidado. Como ya se dijo, la situacin a evitar es aquella en la que
se tienen que almacenar varios bloques de un fragmento, debido a que ese fragmen
to tena registros con claves grandes, los cuales sern escogidos despus de la mayor
parte o de todos los registros del otro fragmento. El truco para evitar este problema
consiste en determ inar con rapidez qu fragmento agotar prim ero sus registros en
memoria principal, comparando los ltimos de esos registros de cada archivo.

www.FreeLibros.me

356

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

Cuando el tiempo requerido para leer datos en la memoria principal es compa


rable o m enor que el tiempo requerido para procesar los datos, se vuelve an ms
critica la seleccin del archivo de entrada desde el cual leer un bloque con cuidado,
ya que no hay esperanza de construir una reserva de registros dentro de la memoria
principal en caso de que el proceso de intercalacin empiece repentinamente al to
m ar ms registros de un fragmento que del otro. El truco mencionado antes re
sulta til en diversas situaciones, como se ver a continuacin.
Considrese el caso donde la intercalacin es el cuello de botella, y no la icctura
o la escritura, por dos razones.
1.

2.

Como se ha visto, al tener disponibles varias unidades de disco o cinta, es po


sible acelerar la entrada/salida lo suficiente para que el tiempo requerido por la
intercalacin supere al tiem po de entrada o al de salida.
Los canales de alta velocidad pueden estar pronto disponibles en el mercado.

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.

la lectura de un bloque de entrada en un buffer de entrada.


el llenado de uno de los buffers de salida con los registros seleccionados, es de
cir, los registros con las claves ms pequeas, entre todos los que se tengan en
ese momento en el buffer de entrada.

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.

Esquem a de seis b u ffe rs de entrada

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

buffers para el archivo 1


Fig. 11.5.

buffers para el archivo 2

Intercalacin con seis buffers de entrada.

La pregunta sobre qu archivo leer a continuacin es trivial. Por lo general, dado


que dos buffers estarn llenos parcialmente, como en la figura 11.5, habr slo un
buffer vaco y deber llenarse. Si sucede, com o cuando se est empezando, que cada
fragmento tiene dos buffers com pletamente llenos y uno vaco, se toma cualquiera
de los que se encuentran vacos. Obsrvese que la dem ostracin de que no es posi
ble agotar un fragmento [existen 6 registros con claves iguales o menores que mn
(Acg, k 2)] dependa slo del hecho de que estuvieron presentes 4b registros.
Adems, las flechas de la figura 11.5 representan apuntadores a los primeros re
gistros disponibles (cuyas claves son m enores) en am bos fragmentos. En Pascal, se
representara ese apuntador con dos enteros. El primero, en el intervalo 1..3, repre
senta el buffer apuntado, y el segundo, en el intervalo 1..b, representa el registro den
tro del buffer. En form a alternativa, es posible dejar que los buffers sean el primero,
el medio y el ltimo tercios de un arreglo y usar un entero en el intervalo I ..36. En
otros lenguajes, donde los apuntadores pueden apuntar hacia elementos de arre
glos, puede preferirse un apuntador de tipo t tipo_registro.

Esquem a de cu a tro b u ffers

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

Intercalacin con cuatro buffers de entrada.

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

Obsrvese que, como en el esquema con seis buffers, no se lee un archivo ms


all del fin de un fragmento. Sin embargo, si no es necesario leer un bloque desde
uno de los fragmentos actuales, puede leerse un bloque del siguiente fragmento de
ese archivo. As, existe la oportunidad de leer un bloque de cada uno de los frag
mentos siguientes, y entonces ser posible iniciar la intercalacin de los fragmentos
tan pronto como se hayan seleccionado los ltimos registros del fragmento anterior.

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.

Almacenamiento de informacin en archivos

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

ALMACENAMIENTO DE INFORM ACION EN ARCHIVOS

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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.

Aceleracin de operaciones con archivos


La desventaja obvia de los archivos secuenciales es que las operaciones son lentas.
Cada operacin requiere la lectura del archivo completo, y algunos bloques pueden
requerir ser reescritos tambin. Por fortuna, existen organizaciones de archivos que
permiten acceder a un registro, leyendo en la memoria principal slo una pequea
fraccin del archivo completo.
Para hacer posible dichas organizaciones, se supone que cada registro de archivo
tiene una clave, un conjunto de campos que identifica de m anera unvoca cada re
gistro. Por ejemplo, el campo nombre del archivo nombre-direccin-telfono puede
considerarse una clave. Esto es, se puede suponer que no existen simultneamente

www.FreeLibros.me

ALMACENAMIENTO DE INFORM ACION EN ARCHIVOS

363

dos registros en el archivo con el m ismo valor en el campo nombre. La recuperacin


de un registro dando valores a sus campos clave, es una operacin habitual que se
realiza con gran facilidad en muchas organizaciones de archivo comunes.
Otro elemento necesario para lograr operaciones rpidas con archivos es la ca
pacidad de acceder a bloques en forma directa, en vez de recorrer en secuencia los
bloques que contienen el archivo. Muchas de las estructuras de datos utilizadas para
operaciones rpidas con archivos usarn apuntadores a los propios bloques, los cua
les son direcciones fsicas de los bloques, como se describi antes. Desafortunada
mente, no es posible escribir programas en Pascal, ni en muchos otros lenguajes, que
se ocupen de los datos en el nivel de bloques fsicos y sus direcciones; dichas ope
raciones se efectan de ordinario con m andatos del sistema operativo. Sin embargo,
se har una breve descripcin informal de la forma de trabajo de las organizaciones
que utilizan el acceso directo a bloques.

Archivos con funcin de dispersin


La dispersin (hashing) es una tcnica muy utilizada para tener acceso rpido a in
formacin almacenada en archivos secundarios. La idea bsica es sim ilar a la dis
persin abierta estudiada en la seccin 4.7. Los registros de un archivo se dividen
entre varias cubetas, y cada una consiste en una lista enlazada de uno o ms bloques
de almacenamiento extemo. La organizacin es sim ilar a la presentada en la figu
ra 4.10. Existe una tabla de cubetas que contiene B apuntadores, uno para cada cu
beta. En la tabla de cubetas, cada apuntador es la direccin fsica del prim er bloque
de la lista enlazada de bloques para esa cubeta.
Las cubetas estn num eradas 0, 1, ..., 5 - 1 . U na funcin de dispersin h hace
corresponder cada valor de clave con uno de los enteros 0 a B - 1. Si x es una clave,
h(x) es el nmero de la cubeta que contiene el registro con la clave x, si tal registro
est presente en alguna. Los bloques que forma cada cubeta se encuentran encade
nados y forman una lista enlazada. As, el encabezado del i-simo bloque de una cu
beta contiene un apuntador a las direcciones fsicas del (i + 1)-simo bloque. El l
tim o bloque de una cubeta contiene un apuntador NIL en su encabezado.
Esta organizacin se ilustra en la figura 11.8. La principal diferencia entre las fi
guras 11.8 y 4.10 es que aqu, los elementos alm acenados en un bloque de una cu
beta no tienen que estar encadenados con apuntadores; slo los bloques deben estar
encadenados.
Si el tam ao de la tabla de cubetas es pequeo, puede quedar almacenada en me
moria principal. De otra forma, puede almacenarse en forma secuencial, en tantos
bloques como sea necesario. Para buscar el registro con clave x, se calcula h(x), para
encontrar el bloque de la tabla de cubetas que contengan el apuntador al prim er blo
que de la cubeta h(x). Despus, se leen los bloques de la cubeta h(x) de m anera su
cesiva, hasta encontrar el que contenga el registro con la clave x. Si se agotan todos
los bloques de la lista enlazada para la cubeta h(x), se concluye que x no es la clave
de ningn registro.
Esta estructura es eficiente en operaciones donde se especifican los valores de

www.FreeLibros.me

364

ESTRUCTURAS DE DATOS Y ALGORITMOS PARA ALMACENAMIENTO EXTERNO

directorio
de cubetas
Fig. 11.8.

Funcin de dispersin con cubetas que contienen bloques encadenados.

los campos de la clave, como la recuperacin de un registro con un valor especifi


cado en la clave o una insercin de un registro (lo que, como es obvio, especifica el
valor de la clave para ese registro). El nmero promedio de accesos a bloques reque
rido para una operacin que especifica la clave de un registro es aproximadamente
el nmero prom edio de bloques en una cubeta, que es n/bk si n es el nmero de re
gistros, un bloque contiene b registros, y k es el nmero de cubetas. Asi, en prome
dio, las operaciones basadas en claves son k veces ms rpidas con esta organiza
cin que con la de archivos no organizados. Lamentablemente, las operaciones no
basadas en claves no se aceleran, puesto que se deben examinar esencialmente todas
as cubetas durante esas otras operaciones. La nica forma general de incrementar
la velocidad en operaciones que no se basan en claves es usar ndices secundarios,
que se analizan en el final de esta seccin.
Para insertar un registro con la clave x, primero se verifica si ya existe un regis
tro con la misma clave. De ser as. se informa de un error, dado que se supone que
la clave identifica de manera unvoca cada registro. Si no existe el registro con la cla
ve .V. se inserta el registro nuevo en el prim er bloque de la cadena para la cubeta
h(x) en el que pueda caber. Si el registro no cabe en ningn bloque de los existentes
para la cubeta h(x), se llama al sistema de archivos para encontrar un bloque nuevo
en el cual se pueda colocar el registro. Este bloque nuevo se agrega al final de la ca
dena de la cubeta b(x).
Fara eliminar un registro con clave x, primero debe localizarse, y despus se le
asigna su bit de eliminacin. O tra estrategia posible (que no puede usarse cuando
'os registros estn adheridos) es sustituir el registro eliminado por el ltimo de la ca
dena de h(x). Si la eliminacin del ltimo registro causa el vaciado del ltimo blo
que de la cadena se puede devolver el bloque vaco al sistema de archivos para usar
lo de nuevo ms tarde.
Una organizacin de archivos de acceso con funcin de dispersin bien disea
da, requiere slo unos cuantos accesos a bloques para cada operacin de archivo. Si
la funcin de dispersin es buena y el nmero de cubetas es ms o menos igual al
nmero de registros en el archivo, dividido entre el nmero de registros que pueden
caber en un bloque, entonces la cubeta prom edio consta de un bloque. Excluyendo
c' nmero de accesos a bloques para buscar la tabla de cubetas, una recuperacin
tpica basada en claves har un solo acceso a un bloque, y una insercin, elimina
cin o modificacin tpicas efectuarn dos accesos a bloques. Si el nmero prome-

www.FreeLibros.me

ALMACENAMIENTO D E INFORM ACION EN ARCHIVOS

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.

Un archivo principal y su ndice disperso.

www.FreeLibros.me

366

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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.

Archivos no clasificados con ndice denso


O tra forma de organizar un archivo de registros es m antener el archivo en orden alea
torio y tener otro, llamado ndice denso, para ayudar a ubicar los registros. El ndice
denso consta de pares (x, p ), donde p es un apuntador al registro con la clave x en
el archivo principal. Esos pares estn clasificados por el valor de la clave, de modo
que una estructura com o el ndice disperso m encionado antes, o el rbol B mencio
nado en la siguiente seccin, puede usarse para ayudar a encontrar las claves en el
ndice denso.
Con esta organizacin se emplean los ndices densos para encontrar la localiza
cin en el archivo principal de un registro con una clave dada. Para insertar un nue
vo registro, se sigue la pista del ltim o bloque del archivo principal y ah se insertan
los registros nuevos, tom ando un nuevo bloque del sistema de archivos si el ltimo
bloque est lleno. Tam bin se inserta un apuntador a ese registro en el archivo del

www.FreeLibros.me

ALMACENAMIENTO D E INFORM ACION EN ARCHIVOS

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

secundarios sigan representando exactam ente el archivo. La actualizacin de un n


dice secundario requiere por lo menos dos accesos a bloques, ya que se debe leer y
escribir un bloque. Sin embargo, puede requerir m ucho m s de dos accesos a blo
ques, ya que es necesario encontrar ese bloque, y cualquier organizacin empleada
para el archivo del ndice secundario requerir unos cuantos accesos adicionales, en
prom edio, para encontrar cualquier bloque. Algo parecido sucede en cada elimina
cin. La conclusin es que la seleccin de los ndices secundarios requiere seguir un
criterio, puesto que debe determ inarse qu conjuntos de cam pos se especificarn en
operaciones muy frecuentes de modo que el tiem po ahorrado teniendo esos ndices
secundarios disponibles compense los costos de la actualizacin de los ndices en
cada insercin y eliminacin.

1 1 .4

Arboles de bsqueda externa

La estructura de datos tipo rbol presentada en el captulo 5 para representar con


juntos puede usarse tam bin para representar archivos extemos. El rbol B, una ge
neralizacin de los rboles 2-3 analizados en el captulo 5, es especialmente adecua
da para alm acenam iento extem o, y se ha convertido en la organizacin estndar
para ndices en sistemas de bases de datos. Esta seccin presenta las tcnicas bsicas
de recuperacin, insercin y eliminacin de inform acin en rboles B.

Arboles de bsqueda mltiple


Un rbol de bsqueda m -ario es una generalizacin del rbol binario de bsqueda
en el cual cada nodo tiene como m xim o m hijos. G eneralizando la propiedad del
rbol binario de bsqueda, se requiere que si n, y n2 son dos hijos de algn nodo, y
n , est a la izquierda de n2, los elementos descendientes de n, sean todos menores
que los de n2. Las operaciones MIEMBRO, INSERTA y SU PRIM E de un rbol de
bsqueda m-ario se realizan con una generalizacin de las operaciones en rboles bi
narios de bsqueda, estudiadas en la seccin 5.1.
Sin embargo, aqu interesa el alm acenam iento de registros en archivos, donde
los archivos se depositan en bloques de alm acenam iento extem o. La adaptacin
correcta de la idea de rboles mltiples consiste en pensar en los nodos como blo
ques fsicos. Un nodo interior contiene apuntadores a sus m hijos y tam bin contie
ne m -1 claves que separan los descendientes del hijo. Los nodos hojas son bloques
tam bin, y contienen los registros del archivo principal.
Si se emplea un rbol binario de bsqueda de n nodos para representar un ar
chivo alm acenado en forma extem a, pueden requerirse, en promedio, log2n accesos
a bloques para recuperar un registro del archivo. En cambio, si se utiliza un rbol
de bsqueda m-ario para representar el archivo, requerir, en promedio, slo logmn
accesos a bloques para recuperar un registro. Para n - O6, el rbol binario de bs
queda puede requerir cerca de 20 accesos a bloques, m ientras que un rbol de 128
cam inos requerir slo 3.

www.FreeLibros.me

ARBOLES DE BUSQUEDA EXTERNA

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.

Se puede considerar un rbol B como un ndice jerrquico en el cual cada nodo


ocupa un bloque en el alm acenam iento externo. La raz del rbol B es el ndice de
primer nivel. Cada nodo que no es hoja en el rbol B tiene la forma
(A>. K P\> K

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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

ARBOLES DE BUSQUEDA EXTERNA

371

los antecesores de P, de forma especfica, en el m enor antecesor A tal que L no sea


el descendiente ms a la izquierda de A. As pues, se debe propagar el cam bio en la
m enor clave de L de vuelta por la trayectoria de la raz a L.
Si L queda vacio despus de la eliminacin, se devuelve al sistema de archivos t;
despus se ajustan las claves y los apuntadores de P para reflejar la eliminacin de
L. Si el nmero de hijos de P ahora es menor que m i2. se examina el nodo P' situa
do inmediatam ente a la izquierda (o a la derecha) de P e n el mismo nivel del rbol.
Si P' tiene por lo menos fm/21 + 1 hijos, se distribuyen las claves y los apuntadores
de P y P en forma equitativa entre ambos, cuidando, por supuesto, el orden de cla
sificacin, de m anera que ambos nodos tengan por lo m enos \mJ2] hijos. Despus,
se modifican los valores de las claves para P y P ' en el padre de P y, si fuera nece
sario, se propagan recursivamente los efectos de este cam bio a todos los antecesores
de P que se vean afectados.
Si P' tiene exactamente \m !2] hijos, es bueno com binar P y P ' en un solo nodo
con 2 [m /2| - 1 hijos (esto es, m hijos a lo sumo). Despus, se deben quitar en el pa
dre la clave y el apuntador correspondientes a P'. Esta eliminacin puede hacerse
con una aplicacin recursiva del procedimiento de eliminacin.
Si los efectos de la eliminacin se propagan hasta la raz, puede requerirse la com
binacin de los dos nicos hijos de sta. En ese caso, el nodo combinado resultante
quedar como nueva raz, y la raz anterior puede devolverse al sistema de archivos.
La altura del rbol B se ver reducida en uno.
Ejemplo 1J.5. Considrese el rbol B de orden 5 de la figura 11.10. Insertar el re
gistro con clave 23 en este rbol produce el rbol B de la figura 11.11. Para inser
tar 23, se debe partir el bloque que contiene 22, 23, 24 y 26. ya que se ha supuesto
que un bloque se Uena con tres registros. Los dos registros ms pequeos permane
cen en el mismo bloque y los otros dos se colocan en un bloque nuevo. Un par apun
tador-clave del nodp nuevo debe insertarse en el padre, que entonces se divide, por
que no puede contener seis apuntadores. La raz recibe el par apuntador-clave para
el nodo nuevo, pero no se divide, porque tiene capacidad en exceso.

Fig. 11.11.

Arbol B d esp u s de la insercin.

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAM IENTO EXTERNO

La eliminacin del registro 10 del rbol B de la figura 11.11 produce el rbol B


de la figura 11.12. Aqu, el bloque que contiene a 10 se descarta; su padre queda con
slo dos hijos, y el hermano derecho tiene el nm ero mnimo, tres; as, se combina
el padre con su hermano, haciendo un nodo con cinco hijos, a

Anlisis dei tie m p o d e las operaciones co n rboles B

Supngase que se tiene un archivo con n registros organizado en un rbol B de or


den m. Si cada hoja contiene en prom edio b registros, el rbol tiene cerca de [n/b]
hojas. Los cam inos ms largos posibles se producen si cada nodo interior tiene la me
nor cantidad posible de hijos, esto es, m i2. En este caso, habr unos 2 [n/b]!m pa
dres de hojas, 4 [n/b]/m2 padres de padres de hojas, y as sucesivamente.
Si hay j nodos en el cam ino que va de la raz a una hoja, entonces 2/~ 1[n /j/m '' 1
> 1, pues si no habra menos de un nodo en el nivel de la raz. Por tanto, \n/b\ >
y j < 1 + log^j \n/t\. Por ejemplo, si n - 106, b - 10 y m - 100, entonces
j < 3.5. Obsrvese que b no es el nm ero m xim o de registros que se pueden poner
en un bloque, sino un promedio, o nm ero esperado. Sin embargo, redistribuyendo
los registros entre bloques vecinos cuando uno se vaca hasta menos de la mitad, se
puede asegurar que b es por lo menos la m itad del valor mximo. Obsrvese tam
bin que se ha supuesto que cada nodo interior tiene el m nim o nm ero posible de
hijos; en la prctica, el nodo interior prom edio tendr ms que el mnimo, por lo
que el anlisis anterior resulta conservador.
Para una insercin o elim inacin, se necesitan j accesos a bloques para localizar
la hoja apropiada. El nm ero exacto de accesos adicionales a bloques necesario para
culm inar la insercin o la elim inacin, y distribuir sus efectos por el rbol, es difcil
de calcular. La m ayor parte de las veces slo es necesario escribir de nuevo un blo
que, la hoja que contiene al bloque de inters. As, 2 + logm/2 \n/b\ puede tomarse
como el nm ero aproxim ado de accesos a bloques para insercin o eliminacin.

C om p aracin de m tod os

Se ha estudiado la funcin de dispersin, los ndices dipersos y los rboles B como


mtodos posibles de organizacin de archivos externos. Es interesante com parar en

www.FreeLibros.me

ARBOLES DE BUSQUEDA EXTERNA

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

Ejercicios

11.1

Escrbase un programa concatena que tome una secuencia de nombres de


archivos como argumentos y escriba el contenido de los mismos en la sali
da estndar, concatenando as los archivos.

11.2

Escrbase un programa incluye que copie su entrada en su salida, excepto


cuando encuentre una lnea de la forma #incluye archivo, en cuyo caso
reemplaza esta lnea por el contenido del archivo mencionado. Obsrvese
que los archivos incluidos tambin pueden contener proposiciones # inclu
ye.

11.3

Cmo se comporta el programa del ejercicio 11.2 cuando un archivo se in


cluye a s mismo?

11.4

Escrbase un programa compara que compare dos archivos, registro por re


gistro, para determ inar si son iguales.

*11.5

Reescrbase el programa de comparacin de archivos del ejercicio 11.4 con


el algoritmo SCL de la seccin 5.6 para encontrar la subsecuencia comn
ms larga de registros en ambos archivos.

11.6

Escribase un programa encuentra que tome dos argumentos que consten de


una cadena y un nombre de archivo, e imprima todas las lneas del archivo
que contengan la cadena como una subeadena. Por ejemplo, si la cadena
es ado y el archivo es una lista de palabras, entonces encuentra imprime
todas las palabras que contienen el trigrama ado.

11.7

Escrbase un programa que lea un archivo y escriba en su salida estndar


los registros del archivo clasificados.

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)

4 4-. + 4-2 Para i ^ l . donde /0 y L , se consideran las longitudes de


los fragmentos en los dos archivos ocupados inicialmente.
ri r - 2 ~ r,-i (o, en forma equivalente, rh2 - r(_, + r, para z > 1), donde
r0 y r_, son el nm ero de fragmentos en los dos archivos iniciales.
rn =
= 1 y, por tanto, r, r_,,..., r,, forma una sucesin de Fibonacci.

*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

Sugerencia. Considrense unos cuantos ejemplos, como l = 50,


/ - 50,
- 32.

375

= 31 o

**11.11 Generalcense los ejercicios 11.9 y 11.10 a clasificaciones de varias fases


con ms de tres archivos.
**11.12 Mustrese que:
a)

Cualquier algoritmo de clasificacin externa que utilice slo una cinta


como alm acenam iento externo debe requerir un tiem po Q (n1) para cla
sificar n registros.
b) Un tiem po G(nlogn) es suficiente si hay dos cintas para alm acenam ien
to externo.

11.13

Supngase que se tiene un archivo externo de arcos dirigidos x y que for


m a un grafo acclico, y que no hay suficiente espacio en la m em oria inter
na para contener el conjunto completo d e vrtices o aristas al m ismo tiem
po.
a)

Escrbase un programa de clasificacin topolgica externa que escriba


un ordenam iento lineal de vrtices, de m odo que si x -* y es un arco
dirigido, el vrtice x aparezca antes de y en el ordenam iento lineal.
b) Cul es la complejidad de tiem po y espacio de este programa como
una funcin del nm ero de accesos a bloques?
c) Q hara este programa si el grafo dirigido fuera cclico?
**d) Cul es el nm ero m nim o de accesos a bloque necesarios para clasi
ficar topolgicamente un grafo dirigido acclico alm acenado externa
mente?
11.14

Supngase que se tiene un archivo de un milln de registros, donde cada


registro ocupa 100 bytes. Los bloques son de 1000 bytes de longitud, y un
apuntador a un bloque ocupa 4 bytes. Disese una organizacin con fun
cin de dispersin para este archivo. Cuntos bloques se necesitan para la
tabla de cubetas y las cubetas?

11.15

Disese una organizacin con rboles B para el archivo del ejercicio 11.14.

11.16

Escrbanse programas para implantar las operaciones RECUPERA, INSER


TA, SUPRIM E y MODIFICA en
a)
b)
c)

11.17

archivos con funcin de dispersin,


archivos indizados,
archivos con rboles B.

Escrbase un programa para encontrar el fc-simo elemento ms grande en


a)
b)

un archivo con ndice disperso


un archivo con rbol B

www.FreeLibros.me

376

*11.18

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

Supngase que se necesitan a + bm milisegundos para leer un bloque que


contiene un nodo de un rbol m-ario de bsqueda, y c + d log2m milisegun
dos para procesar cada nodo en memoria interna. Si hay n nodos en el r
bol, es necesario leer cerca de \ogmn nodos para localizar un registro dado.
Por tanto, el tiempo total requerido para encontrar un registro dado en el
rbol es
(logmn)(a + bm + c + d\og2m ) = (log2nX(a + c + bm)l\og2m ) + d)
milisegundos. Hganse estimaciones razonables para los valores de a, b, c
y d, y represntese grficamente esta cantidad como una funcin de m.
Para qu valor de m se obtiene el mnimo?

*11.19

Un rbol B* es un rbol B en el que cada nodo interno est lleno en dos


terceras partes por lo menos (en vez de la mitad). Disese un esquema de
insercin para rboles B* que retrase la divisin de nodos internos hasta
que dos nodos hermanos estn llenos. Los dos nodos hermanos pueden en
tonces dividirse en tres, cada uno lleno en dos terceras partes. Qu venta
jas y desventajas tienen los rboles B* en relacin con los rboles B?

*11.20

Cuando la clave de un registro es una cadena de caracteres, se puede ahorrar


espacio almacenando slo un prefijo de la clave como separador clave de
cada nodo interno de un rbol B. Por ejemplo, gato y perro, pueden
separarse por el prefijo g o ga de gato. Disese un algoritmo de in
sercin en rboles B que utilice prefijos de claves como separadores que
sean siempre lo ms cortos posible.

*11.21

Supngase que en cierto archivo las operaciones de insercin y eliminacin


se efectan en una fraccin p del tiempo, y en el tiempo 1-p restante se rea
lizan recuperaciones donde se especifica exactamente un campo. Hay k
campos en los registros, y una recuperacin especifica el i-simo campo con
probabilidad q,. Supngase tam bin que una recuperacin requiere a milisegundos si no hay ndice secundario para el campo especificado, y b milisegundos, si lo hay, y que una insercin o eliminacin requiere c + sd mi
lisegundos, donde 5 es el nm ero de ndices secundarios. Determnese,
como una funcin de a, b, c, d, p y las q qu ndices secundarios deben
crearse para el archivo, de m anera que el tiempo prom edio por operacin
se minimice.

**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

un algoritmo para aprovechar el conocimiento estadstico en esta for


ma, y
una demostracin de que Ofloglogn) accesos a bloques son suficientes,
en promedio, para encontrar una clave.

Supngase que se tiene un archivo externo de registros, y que cada registro


consta de una arista de un grafo G y un costo asociado a esa arista.
a)

b)

Escrbase un programa para construir un rbol abarcador de costo


m nim o para G, suponiendo que existe suficiente memoria para alma
cenar todos los vrtices de G. pero no todas las aristas.
Cul es la complejidad de tiempo de ese programa como una funcin
del nm ero de vrtices y aristas?

Sugerencia. Un enfoque posible de este problema es m antener en memoria


un bosque con los componentes conexos actuales. Cada arista es leda y pro
cesada como sigue: si la siguiente arista tiene extremos en dos componen
tes distintos, se agrega y se mezclan los componentes. Si la arista crea un
ciclo en un componente ya existente, se agrega y se elimina la arista de ma
yor costo del ciclo (que puede ser la arista actual). Este enfoque es similar
al algoritmo de Kruskal, pero no requiere clasificar las aristas, lo cual es un
aspecto importante de este problema.
11.24

Supngase que se tiene un archivo que contiene una secuencia de nmeros


positivos y negativos a ,, a2, ..., a. Escrbase un programa 0 (n ) para encon
trar una subsecuencia contigua a a .tl, ..., a, que tenga la suma mayor a, +
ah , + ... + a de cualquier subsecuencia.

Notas bib liogrficas

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

ESTRUCTURAS DE DATOS Y ALGORITM OS PARA ALMACENAMIENTO EXTERNO

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

En este captulo se analizan las estrategias bsicas para reutilizar el espacio en me


moria o compartirlo entre objetos distintos que crecen y se contraen de m anera ar
bitraria. Por ejemplo, se estudiarn los mtodos que mantienen listas enlazadas de
espacio disponible, y tcnicas de recoleccin de basura, que sirven para conocer la
disponibilidad de espacio slo cuando parece que se ha term inado el espacio dispo
nible.

1 2 .1

A sp ecto s d e

la ad m inistracin de m em oria

En la operacin de sistemas de cm puto existen muchas situaciones en las que se


administra un recurso lim itado de memoria, es decir, se com parte entre varios com
petidores. Un programador que no se ocupe de la realizacin de programas del sis
tema (compiladores, sistemas operativos, etctera) tal vez no perciba dichas activi
dades, debido a que suelen realizarse entre bastidores. Como ejemplo, los progra
madores de Pascal saben que el procedimiento new(p) har que el apuntador p se
ale hacia un objeto nuevo del tipo correcto; pero, de dnde procede el espacio
para el objeto? El procedimiento new tiene acceso a una regin grande de memoria,
conocida como estructura dinm ica (heap), que las variables del programa no
usan. De esa regin, se selecciona un bloque no utilizado de bytes consecutivos su
ficiente para contener un objeto del tipo al que apunta p. y se hace que p contenga
la direccin del primer byte de ese bloque. Pero cmo sabe el procedimiento new
qu bytes de la memoria estn desocupados? La seccin I2.4 sugiere la respuesta.
An ms misterioso es lo que sucede si se modifica el valor de p, bien por una
asignacin o por otra llamada a new{p). El bloque de memoria al que apunta p pue
de ser ahora inaccesible, en el sentido de que no hay forma de llegar a l mediante
las estructuras de datos del programa, y se puede reutilizar su espacio. Por otro lado,
antes de cambiar p. su valor pudo haberse copiado en otra variable. En ese caso, el
bloque de memoria ser parte todava de las estructuras de datos del programa.
Cmo se puede saber si un bloque de la regin de memoria utilizada por el proce
dimiento new ya no es requerido por el programa?
El tipo de administracin de memoria que se efecta en Pascal slo es uno ms.
Por ejemplo, en algunas situaciones, como Pascal, objetos de tam aos distintos com
parten el mismo espacio de memoria; en otras situaciones, todos los objetos que com
parten el espacio son del mismo tam ao. Esta distincin con respecto a los tamaos

www.FreeLibros.me

380

ADM INISTRACION DE MEMORIA

de los objetos es una forma de clasificar las clases de problemas de administracin


de memoria a que uno debe enfrentarse. A continuacin se presentan algunos ejem
plos ms.
1.

2.

3.

4.

En el lenguaje de programacin LISP, el espacio de memoria se divide en celdas


que, en esencia, son registros que constan de dos campos; cada campo puede con
tener un tom o (un objeto del tipo elemental, como puede ser un entero) o un
apuntador a una celda. Los tom os y apuntadores son del mismo tamao, as
que todas las celdas requieren el mismo nm ero de bytes. Todas las estructuras
de datos conocidas pueden construirse a partir de esas celdas. Por ejemplo, las
listas enlazadas de tom os pueden usar los prim eros campos de las celdas para
contener tomos, y los segundos campos, para contener apuntadores a las si
guientes celdas de la lista. Los rboles binarios pueden representarse utilizando
el prim er campo de cada celda para apuntar al hijo izquierdo, y el segundo, para
apuntar al hijo derecho. Al ejecutar un program a en LISP, el espacio de memo
ria empleado para contener una celda puede ser a la vez parte de estructuras dis
tintas en momentos diferentes, ya sea porque una celda se mueve entre estruc
turas, o porque se separa de todas las estructuras y su espacio se utiliza de nuevo.
Un sistema de archivos, en general, divide los dispositivos de almacenamiento
secundario, como los discos, en bloques de longitud fija. Por ejemplo, UNIX
siempre usa bloques de 512 bytes. Los archivos se almacenan en una secuencia
de bloques (que no son necesariamente consecutivos). Conforme se crean y des
truyen archivos, los bloques del alm acenam iento secundario quedan disponibles
para ser utilizados de nuevo.
U n sistema operativo de multiprogram acin tpico permite que varios progra
m as com partan la m em oria principal al m ismo tiempo. Cada programa requie
re una cantidad determ inada de memoria, la cual es conocida por el sistema ope
rativo, y este requisito es parte de la solicitud de servicio em itida cuando se de
sea ejecutar el programa. M ientras en los ejemplos ( I) y (2) los objetos que com
parten memoria (celdas y bloques, respectivamente) eran todos del mismo ta
mao, distintos program as requieren cantidades diferentes de memoria. As,
cuando term ina un programa que usa 100K bytes, puede reemplazarse por otros
dos que manejen 50K cada uno, o uno 20K y otro 70K (con 10K no utilizados).
Com o solucin distinta, los 100K bytes liberados a la term inacin del programa
pueden combinarse con los 50K adyacentes que estn sin utilizar, y entonces
puede ejecutarse un program a que requiera hasta 150K. Otra posibilidad es que
ningn programa nuevo quepa en el espacio liberado, y que 100K bytes quede
m om entneam ente sin utilizar.
Hay muchos lenguajes de programacin, como SNOBOL, APL o SETL, que asig
nan espacio a objetos de tam ao arbitrario. A esos objetos, que son valores asig
nados a variables, se les asigna un bloque de espacio de un gran bloque de me
moria, que suele denom inarse estructura dinmica (heap). Cuando cambia al va
lor de una variable, al valor nuevo se le asigna un espacio en la estructura din
mica, y un apuntador para que la variable apunte al nuevo valor. Es posible que
el valor anterior de la variable quede ahora sin utilizar, y su espacio se pueda
volver a utilizar. Sin embargo, los lenguajes como SNOBOL o SETL realizan asig

www.FreeLibros.me

ASPECTOS DE LA ADM INISTRACION DE MEMORIA

381

naciones como A = B haciendo que el apuntador de A apunte al mismo objeto


que el apuntador de B\ si A o B fueran reasignados, el objeto anterior no se li
berara y su espacio no podra solicitarse.
Ejemplo 12.1. En la figura I2.1(a) se observa la estructura dinm ica que puede m a
nejarse en un programa en SNOBOL con las variables A, B y C. El valor de cual
quier variable en SNOBOL es una cadena de caracteres y, en este caso, el valor de
A y B es BUENOS DIAS y el valor de C es PASA LA SAL.
Se ha elegido la representacin de cadenas de caracteres por medio de apunta
dores a bloques de memoria en la estructura dinmica. Esos bloques tienen sus dos pri
meros bytes (el nmero 2 es un valor tpico que podra cambiarse) dedicados a un en
tero que da la longitud de la cadena; por ejemplo, BUENOS DIAS tiene longitud
11, contando el espacio entre palabras, asi que el valor de A (y de B) ocupa 13 bytes.
Si el valor de B se cambia por BUENAS NOCHES, se puede encontrar un blo
que vaco en el m ontn con 15 bytes para almacenar el nuevo valor de B, incluyen
do los dos bytes de la longitud. Se hace que el apuntador de B apunte al nuevo va
lor, como se muestra en la figura 12. l(b). El bloque que contiene el entero 11 y BUE
NOS DIAS an es til, pues A contina apuntando a l. Si el valor de A cambia,
ese bloque quedar sin uso y puede volver a utilizarse. La forma de saber que no
hay apuntadores a tales bloques es un tema importante en este captulo

(b)
Fig. 12.1.

Variables de cadenas en una estructura dinmica.

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

ADM INISTRACION DE MEMORIA

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

ADM INISTRACION DE BLOQUES DE IGUAL TAMAO

383

recuperacin del espacio no utilizado


explcita

recoleccin de basura

fijo

sistema de archivos

LISP

variable

sistema de
multiprogramacin

SNOBOL

tamao
del bloque

Fig. 12.2.

Ejemplos de las cuatro estrategias de administracin de memoria.

Como en LISP, un intrprete tpico de SNOBOL no intenta recuperar bloques de


memoria hasta que se agota el espacio. En ese momento, el intrprete realiza una
recoleccin de basura igual que lo hace un intrprete de L1PS, pero con la posibilidad
adicional de que las cadenas se muevan en tom o a la estructura dinm ica para re
ducir la fragmentacin, y que los bloques libres adyacentes se combinen para for
mar bloques ms grandes. Obsrvese que los dos ltimos pasos no tienen sentido en
un ambiente LISP.

1 2 .2

Administracin de bloques de igual tamao

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

ADM INISTRACION DE MEMORIA

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

Un enfoque atractivo para la deteccin de celdas inaccesibles consiste en incluir en


cada celda una cuenta de referencia, esto es, un campo de tipo entero cuyo valor sea
igual al nmero de apuntadores a la celda. Es fcil m antener las cuentas de referen
cia: cuando se hace que un apuntador apunte a una celda, se agrega un uno a la cuen
ta de referencia de esa celda, y cuando se reasigna un apuntador no nulo, primero

www.FreeLibros.me

ALGORITM OS DE RECOLECCION DE BASURA PARA BLOQUES DE IGU AL TAMAO

385

disminuye en uno la cuenta de referencia de la celda apuntada. Si una cuenta de re


ferencia llega a valer cero, la celda ser inaccesible y se podr devolver a la lista de
disponibles.
Lamentablemente, las cuentas de referencia no siempre funcionan. Las celdas
con g y h de la figura 12.3 son inaccesibles y enlazadas en un ciclo. Sus cuentas de
referencia valen 1, de m anera que no se pueden devolver a la lista de disponibles.
Se puede intentar detectar ciclos de celdas inaccesibles de distintas formas, pero tal
vez no valga la pena hacerlo. Las cuentas de referencia son tiles para estructuras
que no tienen ciclos de apuntadores. Un ejem plo de estructura sin posibilidades de
ciclos es una coleccin de variables apuntando a bloques que contienen datos, como
en la figura 12.1. De esta forma, se puede hacer la recoleccin de basura de forma
explcita, recogiendo un bloque cuando su cuenta de referencia ha alcanzado el va
lor cero. Sin embargo, cuando las estructuras de dalos permiten ciclos de apuntado
res, la estrategia basada en cuentas de referencia por lo general es inferior a otro en
foque que se analizar en la siguiente seccin, tanto en funcin del espacio requeri
do por las celdas como del tiem po relacionado con el caso de las celdas inaccesibles.

1 2 .3

A lg o ritm o s d e re coleccin de basura


para bloques de Igual tam ao

Ahora se presenta un algoritmo para detectar qu celdas de una coleccin de los ti


pos sugeridos en la figura 12.3 son accesibles desde las variables del programa. Se
definir con precisin el problem a definiendo un tipo de celda en Pascal que es una
variante de tipo registro; las cuatro variantes, que se llamarn PP, PA, AP, A A , se
determinan segn cules de los dos cam pos de datos son apuntadores y cules son
tomos. Por ejemplo, PA significa que el cam po izquierdo es un apuntador y el cam
po derecho es un tomo. Un cam po booleano adicional en las celdas, llam ado m ar
ca, indica si la celda es accesible. Es decir, poniendo m arca en verdadero al hacer
la recoleccin de basura, se marca la celda, indicando que es accesible. En la figura
12.4 se muestran las definiciones de los tipos.
type
tipo_tom o - I algn tipo apropiado, de preferencia,
del m ismo tam ao que los apuntadores !
patrones - (PP. PA. AP. AA);
tipo_celda - record
m arca : boolean;
case patrn : patrones of
PR. (izquierda : f tipo_celda; derecha: t tipo_celda);
PA: (izquierda: t tipo.celda; derecha: tipo.tom o);
A R . (izquierda: tipo.tom o; derecha: \ tipo.celda);
AA: (izquierda: tipo_tom o; derecha: tipo_tomo);
end;
Fig. 12.4.

Definicin del tipo de las celdas.

www.FreeLibros.me

386

ADM INISTRACION DE M EM ORIA

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)

procedure b p f ( celda-actual : t tip o _ c e ld a );


I Si se marc lacelda actual no se hace nada; en caso contrario,
debe marcarse y llam ar a b p f en cualquier celda apuntada por
la celda actual i
begin
with c e l d a - a c t u a l t do
if m arca - false then begin
m a r c a true;
if (patrn - PP) or (patrn = PA) then
if izquierda < > nil then
bpfizquierd)-,

(7 )

if (patrn = PP) or (patrn - AP) then


if derecha < > nil then

(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

ALGORITMOS DE RECOLECCION DE BASURA PARA BLOQUES DE IGUAL TAMAO

( 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.

Algoritmo para marcar celdas accesibles.

Recoleccin en el m ism o sitio

El algoritmo de la figura 12.5 tiene un defecto sutil; en un am biente de programa


cin donde la memoria es lim itada, puede suceder que no haya espacio disponible
para almacenar la pila requerida para las llamadas recursivas a bpf. Como se ilustr
en la seccin 2.6, cada vez que bpf se llama a s mismo, Pascal (o cualquier otro len
guaje que permita la recursin) crea un registro de activacin para esa llamada par
ticular a b p f En general, un registro de activacin contiene espacio para parm etros
y variables locales al procedimiento, del cual cada llamada necesita su propia copia.
Algo que tambin es necesario en cada registro de activacin es una direccin de
retomo, el lugar al cual debe regresar el control cuando term ina esta llamada recursiva al procedimiento.
En el caso particular de bpf slo se necesita espacio para el parm etro y la di
reccin de retom o [esto es, fue llamado desde la lnea (14) de recoge, desde la l
nea (7) o la (10) de otra invocacin de bpf]. No obstante, esta solicitud de espacio
es suficiente para que, si toda la memoria se enlaza en una sola cadena extendida
desde fuente (por lo que el nm ero de llamadas activas a bpf puede ser en algn mo
mento igual a la longitud de esta cadena), se requerir bastante ms espacio para la
pila de registros de activacin que el asignado para la memoria. Si ese espacio quiz
no estuviera disponible, seria imposible realizar la marcacin.
Por fortuna, hay un ingenioso algoritmo, conocido como algoritmo de DeutschSchorr-Waile, para hacer la marcacin en el mismo sitio. Es necesario convencerse
de que la secuencia de celdas sobre la cual se ha realizado una llamada a bpf, sin ha
ber term inado, en realidad forma un cam ino desde fuente hasta la celda en la cual
se hizo la llamada actual a b p f As, se puede usar una versin no recursiva de bpf
y en vez de una pila de registros de activacin para registrar el camino de celdas des
de fuente hasta la celda que se est exam inando en ese momento, se pueden usar los
campos apuntadores del cam ino para contener el cam ino mismo. Esto es, cada cel
da del camino, excepto la ltima, contiene en el campo derecha o izquierda un apun
tador a su predecesor, la celda ms cercana a fuente. Se describir el algoritmo de
Deutsch-Schorr-Waite con un campo extra de un solo bit, llamado atrs, que es de
un tipo enumerado (I,D), e informa si el campo izquierdo o el derecho apunta al pre
decesor. Ms tarde, se evaluar la forma de almacenar la informacin contenida en
atrs en el campo patrn, sin necesidad de espacio adicional en las celdas.
El nuevo procedimiento para bsqueda en profundidad no recursiva, que se lla
ma bpfnr, se vale de un apuntador, actual, a la celda actual, y un apuntador, previo,
al predecesor de la celda actual. La variable fuente apunta a una celda fuentel que

www.FreeLibros.me

388

ADM INISTRACION DE MEMORIA

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

(a) Estructura de una celda


(3)

(2 )

fuente

/-

R V/
Y<

L
T
b -

actual

()

previo

(b) Situacin en la que la celda (4) es la actual


Fig. 12.6.

Uso de apuntadores para representar el camino de regreso a fuente.

a (3) a (2) y a (l), de vuelta a fu en te l ; est representado por lneas (apuntadores) de


puntos. Por ejemplo, la celda (1) tiene atrs = I, ya que el campo izquierda de (1),
que en la figura 12.6 contiene un apuntador a (2), est apuntando hacia atrs, en
vez de hacia adelante a lo largo del camino; sin embargo, se restaurar ese apunta
dor cuando la bsqueda en profundidad por fin regrese de la celda (2) a la (1). An
logamente, en la celda (2), atrs - D, y el campo derecho de (2) apunta hacia atrs
en el camino hacia (1), en vez de dirigirse a (3), como lo haca en la figura 12.6(a).
t Esta incom odidad es necesaria debido a las peculiaridades de Pascal.

www.FreeLibros.me

ALGORITM OS DE RECOLECCION DE BASURA PARA BLOQUES DE IGU AL TAMAO

389

Son tres los pasos bsicos para realizar la bsqueda en profundidad:


1. Avanzar. Si se determ ina que la celda actual tiene uno o m s apuntadores no nu
los, se avanza al prim ero de ellos, esto es, se sigue el apuntador en izquierda, pero
si no lo hay, se sigue el apuntador en derecha. Por avanzan) se entiende hacer
que la celda apuntada se convierta en la celda actual y, la celda actual, en la an
terior. Para ayudar a encontrar el cam ino de regreso, se hace que el apuntador
recin seguido apunte a la celda anterior. Esos cambios se m uestran en la figura
12.7(a), en el supuesto de que se siga al apuntador izquierdo. En esa figura, los
apuntadores anteriores se representan con lneas de trazo continuo, y los nuevos,
con lneas de puntos.
2. Conmutador. Si se determ ina que las celdas siguientes a la actual ya se han revi
sado (por ejemplo, la celda actual puede tener slo tom os, puede estar marcada,
o se pudo haber replegado a la celda actual desde la apuntada por el cam po de
recha de la actual), se consulta el campo atrs de la celda anterior. Si ese valor
es /, y el cam po derecha de la celda previa contiene un apuntador no nulo a al
guna celda C, se hace que C se convierta en la celda actual, y la identidad de la
celda anterior no se cambia. Sin embargo, el valor de atrs en la celda anterior
se hace D, y el apuntador izquierdo en esa celda recibe su valor correcto; esto es,
se hace que apunte a la celda actual anterior. Para m antener el cam ino de regreso
a fuente desde la celda anterior, se hace que el apuntador a C en el cam po dere
cha apunte hacia donde apuntaba izquierda. La figura 12.7(b) muestra esos cam
bios.
3. Replegar. Si se determina, como en (2), que las celdas que parten de la actual se
han recorrido, pero el campo atrs de la celda anterior es D, o es I. pero el campo
derecho contiene un tom o o un apuntador nulo, entonces se han revisado todas
las celdas que parten de la anterior. Se efecta el repliegue haciendo que la celda
anterior sea la actual y que la celda siguiente en el cam ino de la celda anterior a
fuente sea la nueva celda anterior. Esos cam bios se muestran en la figura 12.7(c),
en el supuesto de que atrs - D en la celda anterior.
U na coincidencia fortuita es que cada paso de la figura 12.7 se puede considerar
como la rotacin sim ultnea de tres apuntadores. Por ejemplo, en la figura 12.7(a),
se reemplazan sim ultneamente {previo, actual, actual!.izquierda) por (actual, ac
tual lizquierda, previo), respectivamente. Debe subrayarse la simultaneidad: la ubi
cacin de actual \.izquierda no cambia al asignar un valor nuevo a actual. Para rea
lizar esas modificaciones a los apuntadores es til contar con un procedim iento ro
tar, que se muestra en la figura 12.8. Obsrvese en especial que el paso de parm e
tros por referencia asegura que las ubicaciones.de los apuntadores se establezcan an
tes de cam biar ningn valor.
Ahora se considera el diseo del procedim iento no recursivo bpfnr para hacer el
marcado. Este procedimiento es uno de esos raros procesos que son m s fciles de
entender cuando se escriben con etiquetas y proposiciones goto. En especial, existen
dos estados del procedimiento, avance representado por la etiqueta 1, y replie
gue, representado por la etiqueta 2. Se introduce inicialmente el prim er estado, y
tambin siempre que se pasa a una celda nueva, por un paso de avance o uno de

www.FreeLibros.me

390

ADM INISTRACION DE MEMORIA

conmutacin. En este estado, se intenta otro paso de avance, y slo se efecta un re


pliegue o una conmutacin si existe un bloqueo, que se puede deber a dos razones:
1) la celda recin alcanzada ya est marcada, o 2) no hay apuntadores no nulos en
la celda. Cuando hay un bloqueo, se cambia al segundo estado o replegado.

(b) Conm utar

(c) Replegar
F ig . 1 2 .7 .

Tres p aso s bsicos.

procedure rota ( var p 1, p2, p3: t tipo_celda );


var
temp: t tipo.celda;
begin
temp p 1;
p \ :-p 2 ;
p 2 p3;
p3temp
end; | rota I
Fig. 12.8.

Procedimiento de modificacin de apuntadores.

www.FreeLibros.me

ALGORITM OS DE RECOLECCION DE BASURA PARA BLOQUES D E IGUAL TAMAO

391

El segundo estado se alcanzar cuando ocurra un repliegue o cuando no sea po


sible permanecer en estado de avance porque hay un bloqueo. En el estado de re
pliegue, se prueba si ya se ha replegado hasta la celda ficticia fu en te I. Com o se ana
liz antes, se reconocer esta situacin porque previo - actual, en cuyo caso se pasa
al estado 3. De otra forma, se decide un repliegue para perm anecer en ese estado o
se pasa al estado de avance. El cdigo de bpfnr se muestra en la figura 12.9; este c
digo utiliza las funciones bloque-izq, bloque-der y bloque, que prueban si los cam
pos izquierdo o derecho de una celda, o am bos, tienen un tom o o un apuntador
nulo, bloque tam bin prueba si hay una celda marcada.
function bloque-izquierdo ( celda: tipo.celda): boolean;
i prueba si el cam po izquierda es un tom o o un apuntador nulo i
begin
with celda do
if (patrn - PP) or (patrn - PA) then
if izquierda O
nil then return (false);
return (true)
end; 1 bloque-izquierdo I
function bloque-derecho ( celda : tipo.celda ): boolean;
I prueba si el cam po derecha es un tom o o un apuntador nulo I
begin
with celda do
if (patrn - PP) or (patrn - AP) then
if derecha < > nil then
return (false);
return (true)
end; bloque-derecho i
function bloque ( celda : tipo.celda ): boolean;
I prueba si la celda est marcada o no contiene un apuntador no nulo s I
begin
if (celda, marca - true) or bloque-izquierdo(celda) and bloque-derecho
(celda) then
return (true)
else
return (false)
end; { bloque |
procedure bpfnr, \ marca las celdas accesibles desde fuente I
var
actual, previo: ]tipo.celda;
begin | asignacin de valor in ic ial}
a c t u a l f u e n t e ! ].derecha; I celda apuntada por fuente 1 |
p r e v io f u e n t e 1; | previo apunta a fu e n te 1}
fu en te1f .atrs D\
fuente)].derecha fuente)', Ifuente) se apunta a s m ism o }
f u e n t e ) ] .m a r c a true;

www.FreeLibros.me

392

ADM INISTRACION DE MEMORIA

estado 1: I intenta avanzar (


if bloque{actual]) then begin |prepara el repliegue I
actual].marca true;
goto estado2
end
else begin * marca y avanza }

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;

estado2: I term ina, repliega o conm uta i


if previo = actual then I term ina 1
goto estado3
else if {previo].atrs - 7) and
not bloque-derecho(previo] ) then begin | conm uta i
previo] .atrs := D\
rota(previo].izquierda, actual, previo].derecha);
I realiza los cambios de la figura 12.7(b) I
goto estado 1
end
else if previo].atrs D then j repliega \

rota {previo, previo] .derecha, actual)


I realiza los cam bios de la figura 12.7(c)}
else |previo] .atrs - 71
rota{previo, previo],izquierda, actual);
I realiza los cam bios de la figura 12.7(c), pero con el campo
izquierda de la celda previa comprendido en el camino |
goto estado2
end;

estado3: I poner aqui el cdigo para enlazar celdas no marcadas en la


lista de espacio disponible }
end; {bpfnr I
Fig. 12.9.

Algoritmo no recursivo para marcar celdas.

www.FreeLibros.me

ASIGNACION DE ALMACENAMIENTO PARA OBJETOS DE DIFERENTES TAMAOS

A lg o ritm o D eutsch-Schorr-W aite sin un b it extra para el cam p o

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

En el cam ino hacia fuente 1


atrs
atrs
atrs
atrs

=
=

/.
/.
D,
D,

patrn
patrn
patrn
patrn

Fuera del camino

PP
= PA
= PP
= AP

patrn
patrn
patrn
patrn

= PP
= PA
= AP
- AA

Interpretacin de dos bits com o patrn y atrs.

A signacin de alm acenam iento para objetos


de diferen tes tam aos

Considrese ahora el manejo de una estructura dinmica, como lo presenta la figura


12 .1, donde hay una coleccin de apuntadores a bloques asignados. Los bloques con
tienen datos de algn tipo. En la figura 12.1, por ejemplo, los datos son cadenas de
caracteres. Aunque el tipo de los datos almacenados en la estructura dinm ica no
tiene por qu ser cadenas de caracteres, se supone que los datos no tienen apunta
dores a localidades de la estructura dinmica.
El problema de la administracin de estructuras dinm icas tiene aspectos que fa
cilitan y tambin dificultan su m antenem iento en comparacin con las estructuras

www.FreeLibros.me

394

ADM INISTRACION DE MEMORIA

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.

Una estructura dinmica con lista de espacio disponible.

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

ASIGNACION DE ALMACENAMIENTO PARA OBJETOS DE DIFERENTES TAMAOS

395

U na consecuencia interesante de las suposiciones anteriores es que los bloques


deben ser capaces de almacenar datos, algunas veces (cuando estn en uso), y apun
tadores, en otras (cuando estn en desuso), exactamente en el mismo lugar, con lo
que es imposible o muy incmodo escribir programas que manipulen bloques de
esta clase en Pascal o cualquier otro lenguaje fuertemente orientado a tipos. As, esta
seccin debe ser discursiva por necesidad; slo pueden escribirse programas en seudo-Pascal, nunca programas reales en Pascal. Sin embargo, no hay ningn problema
para escribir programas que hagan las cosas descritas en lenguaje ensamblador o en
la mayora de los lenguajes de programacin de sistemas, como C.

Fragm entacin y com p acta cln d e bloques vacos

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

Despus de devolver el bloque de Y.

www.FreeLibros.me

396

ADM INISTRACION DE MEMORIA

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

ASIGNACION DE ALMACENAMIENTO PARA OBJETOS DE DIFERENTES TAMAOS

397

sicin p de un bloque y de su contador c determ inan la posicin del bloque de la


derecha, pero esto no sirve como gua para encontrar el principio del bloque izquier
do. Es necesario encontrar un bloque vaco que empiece en alguna posicin p, y ten
ga un contador c, tal que p, + c, - p. Para esto hay tres posibles estrategias.
1. Revisar la lista de disponibles buscando un bloque en la posicin p, y con con
tador C| donde p, + c,= p. Esta operacin lleva un tiem po proporcional a la lon
gitud de la lista de disponibles.
2. Conservar un apuntador en cada bloque (usado o no) indicando la posicin del
bloque de la izquierda. Este enfoque perm ite encontrar el bloque izquierdo en un
tiempo constante; se prueba si est vaco, en cuyo caso se com bina con el bloque
en cuestin. Se puede encontrar el bloque en la posicin p + c y hacer que apunte
al principio del bloque nuevo, para poder m antener esos apuntadores a la izquier
da f.
3. M antener clasificada la lista de disponibles d e acuerdo con la posicin. Entonces
el bloque vaco de la izquierda se encuentra al insertar en la lista el bloque va
ciado recientemente, y slo es necesario revisar, usando la posicin y el contador
del bloque vaco anterior, que no se interponga ningn bloque no vaco.
Al igual que con la intercalacin de bloques vacos recientes con el bloque de la
derecha, el primero y tercer enfoques para la bsqueda e intercalacin con el bloque
de la izquierda requieren un tiem po proporcional a la longitud de la lista de dispo
nibles. El mtodo (2) tam bin requiere tiem po constante, pero tiene una desventaja
sobre los problemas relativos a la lista de disponibles doblem ente enlazada (ya su
gerida en relacin con la bsqueda de los bloques vecinos de la derecha). Mientras
que el doble enlace de los bloques vacos aum enta el tam ao m nim o de los bloques,
no puede decirse que este enfoque desperdicie espacio, ya que slo los bloques que
no se usan para alm acenar datos son los que se enlazan. Sin embargo, apuntar a los
vecinos izquierdos requiere un apuntador en los bloques utilizados y en los no uti
lizados, y con justicia puede acusrsele de consum ir espacio. Si el tam ao promedio
de los bloques es de cientos de bytes, el espacio extra para un apuntador puede ser
despreciable. Por otro lado, el espacio adicional puede ser prohibitivo si el bloque
tpico tiene slo 10 bytes de longitud.
Para resum ir las implicaciones de estas exploraciones en cuanto a cmo combi
nar bloques vacos recientes con vecinos vacos, hay tres enfoques para tratar la frag
mentacin.
1. U sar uno de varios enfoques, como puede ser conservar clasificada la lista de dis
ponibles, que requiere un tiem po proporcional a la longitud de la lista cada vez
que un bloque queda sin utilizar, pero perm ite encontrar y com binar vecinos va
cos.
2. Usar una. lista de espacio disponible doblem ente enlazada cada vez que un blo
que quede sin utilizar, y tam bin utilizar apuntadores a los vecinos izquierdos de
todos los bloques, estn o no disponibles, para com binar vecinos vacos en un
tiempo constante.
t C om o ejercicio, se debe descubrir cm o m antener lo s apuntadores cuando un bloque se divide en
dos: se toma una pane para un elem ento de datos nuevo, m ientras que la otra permanece vacia.

www.FreeLibros.me

398

ADM INISTRACION DE MEMORIA

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 .

Combinacin de bloques vacos adyacentes.

Ejemplo 12.5. Como ejemplo, considrese el programa de la figura 12.13, aplicado


a la estructura dinm ica de la figura 12.12. Supngase que el byte de ms a la iz
quierda de la estructura dinm ica es cero, as que inicialmente, p - 0. Como c - 500
para el prim er bloque, a q se le asigna un valor inicial p + c - 500. Cuando el bloque
que empieza en 500 est lleno, el ciclo de las lneas (10) a (12) no se ejecuta y el blo
que que consta de los bytes 0 a 499 se coloca en la lista de disponibles, haciendo que
dispo apunte al byte 0 y poniendo un apuntador nil en el lugar designado en ese blo
que (despus del contador y el bit vaco/lleno). Despus, se asigna a p el valor 500
en la lnea (14), y se incrementa a 700 en la lnea (7). El apuntador q tom a el valor
1700 en la lnea (9), y despus, 2300 y 3000 en la lnea (12), al tiem po que 600 y
700 se agregan al contador 1000 en el bloque que empieza en 700. Cuando q excede
del byte de m s a la derecha, 2999, el bloque que empieza en 700, que ahora tiene

www.FreeLibros.me

ASIGNACION DE ALMACENAM IENTO PARA OBJETOS DE D IFERENTES TAMAOS

399

el contador 2300, se inserta en la lista de disponibles. Entonces, en la lnea (14), p


se ajusta en 3000 y el ciclo externo finaliza en la lnea (5).
El nm ero total de bloques y el nm ero de bloques disponibles puede no ser muy
diferente, y probablemente la frecuencia con que se puede encontrar que no hay blo
ques vacos bastante grandes sea baja, se cree que el m todo (3), com binar bloques
vacos adyacentes slo cuando se term ine el espacio adecuado, es superior a (1) en
una situacin real. El mtodo (2) es un posible competidor, pero considera los re
quisitos de espacio adicional y el hecho de que se requiere un tiem po extra cada vez
que se inserta o elim ina un bloque de la lista de disponibles, se cree que (2) ser pre
ferible a (3) en circunstancias muy raras, y tal vez se pueda olvidar.

Seleccin d e bloqu es disponibles

Se ha tratado con detalle qu debe suceder cuando deja de necesitarse un bloque y


se puede devolver al espacio disponible. Existe tam bin el proceso inverso de pro
porcionar bloques para contener nuevos datos. Es evidente que se debe seleccionar
algn bloque disponible y usarlo parcial o totalm ente para contener los datos nue
vos. Hay dos tem as a tener en cuenta. Prim ero, qu bloque vaco se selecciona? Se
gundo, si es necesario usar slo parte de un bloque seleccionado, qu parte se usa?
La segunda pregunta es fcil de aclarar. Si se utiliza un bloque con contador c y
se requieren d < c bytes de ese bloque, se escogen los ltim os d bytes. De esta forma,
slo es necesario reem plazar c por c-d, y el bloque vaco restante puede permanecei
en la lista de disponibles f.
Ejemplo 12.6. Supngase que se requieren 400 bytes para la variable W en la situa
cin representada en la figura 12.12. Podra decidirse tom ar los 400 bytes finales de
los 600 que existen en el prim er bloque de la lista de disponibles. Tal situacin se
muestra en la figura 12.14.
La seleccin de un bloque para colocar datos nuevos no es fcil, debido a que
existen conflictos entre las m etas de tales estrategias. Se desea, por un lado, poder
tom ar con rapidez un bloque vaco en el cual quepan los datos y, por otro, hacer
una seleccin de un bloque vaco que reduzca la fragmentacin. Hay dos estrategias
que representan extremos en el espectro conocidas como prim er ajuste y mejor
ajuste, y se describen a continuacin.
1. Primer ajuste. Para seguir la estrategia de primer ajuste, cuando se necesita un blo
que de tam ao d, se revisa la lista de disponibles desde el principio hasta llegar
a un bloque de tam ao c > Utilcense las ltim as d palabras en ese bloque,
como se describi antes.
2. Mejor ajuste. Para seguir la estrategia de mejor ajuste, cuando se necesita un blo
que de tam ao d, se exam ina toda la lista de disponibles para encontrar el blo
que de tam ao m nim o d que sea lo m s cercano posible a d. Se tom an las lti
mas d palabras de ese bloque.
t Si c - d es tan pequeo que un contador y un apuntador no caben, hay que utilizar el bloque com
pleto y elim inarlo de la lista de disponibles.

www.FreeLibros.me

400

ADM INISTRACION DE MEMORIA

Pueden hacerse algunas observaciones acerca de estas estrategias. La estrategia


de m ejor ajuste es bastante ms lenta que la de prim er ajuste, ya que con esta ltima
se puede esperar encontrar, en promedio, un bloque suficiente con rapidez, mien
tras que con la de mejor ajuste es necesario recorrer toda la lista de disponibles. La
estrategia de m ejor ajuste puede acelerarse si se m antienen listas de bloques dispo
nibles de acuerdo con varias gamas de tam aos. Por ejemplo, se puede mantener
una lista de bloques disponibles con longitud entre 1 y 16 bytes t , entre 17 y 32, en
tre 33 y 64, y as sucesivamente. Esta mejora no beneficia en forma apreciable la
estrategia de prim er ajuste, y, de hecho, puede alentarla si las estadsticas de los ta
maos de bloques son malas. (Comprese la bsqueda del prim er bloque de tam ao
m ayor que 32 en la lista de disponibles com pleta y en la lista de bloques de tamao
17 a 32, por ejemplo.) U na ltima observacin es que un espectro de estrategias se
puede definir entre las dos planteadas aqu, buscando el m ejor ajuste entre los pri
meros k bloques disponibles para algn tam ao fijo k.
La estrategia de m ejor ajuste parece reducir la fragmentacin en comparacin
con la de prim er ajuste, en el sentido de que la prim era tiende a producir fragmen
tos muy pequeos, es decir, bloques abandonados. Y aunque el nm ero de esos frag
m entos es casi el m ismo que para el prim er ajuste, tienden a ocupar un rea menor.
Sin embargo, el m ejor ajuste no tiende a producir fragmentos de tam ao medio.
En cambio, los bloques disponibles tienden a ser fragmentos muy pequeos o blo
ques devueltos al espacio disponible. Como consecuencia, hay secuencias de peti
ciones que la estrategia de prim er ajuste puede satisfacer y la de m ejor ajuste no, y
viceversa.
Ejemplo 12.7. Supngase, como en la figura 12.12, que la lista de disponibles consta
de los bloques de tam ao 600, 500, 1000 y 700, en ese orden. Si se emplea la estra
tegia de prim er ajuste y se hace una peticin de un bloque de tam ao 400, se obtie
ne el bloque de tam ao 600 que es el prim ero de la lista en el cual cabe un bloque
de tam ao 400. La lista de disponibles tiene ahora bloques de tam ao 200, 500,
1000 y 700. As que es imposible satisfacer de inm ediato tres peticiones de bloques
de tam ao 600 (aunque se puede hacer despus de com binar bloques vacos adya
centes o al recorrer bloques utilizados sobre la estructura dinmica).
t En realidad, hay un tam ao de bloque m n im o m ayor que 1. puesto q ue los b loques deben contener
un apuntador, un contador y un bit vaco/lleno si se van a encadenar a una lista de disponibles.

www.FreeLibros.me

SISTEMAS DE M ANEJO DE M EM ORIA PO R AFINIDADES ( B U D D Y S Y S T E M S )

401

No obstante, si se aplicara la estrategia de m ejor ajuste con la lista de disponi


bles 600, 500, 1000 y 700, y llegara la peticin de 400, podra colocarse donde ajus
ta mejor, esto es, en el bloque de 500, dejando una lista de bloques disponibles de
600, 100, 1000 y 700. En este caso, se pueden satisfacer tres peticiones de bloques
de tam ao 600 sin necesidad de recurrir a la reorganizacin del almacenamiento.
Por otro lado, hay situaciones donde, al em pezar con la lista 600, 500, 1000, 700
de nuevo, la estrategia de m ejor ajuste puede fallar, m ientras que la de prim er ajuste
puede funcionar sin necesidad de reorganizacin del almacenamiento. D ada la pe
ticin de 400 bytes, el m ejor ajuste puede, igual que antes, dejar la lista en 600, 100,
1000 y 700, m ientras que el prim er ajuste la deja en 200, 500, 1000 y 700. Supn
gase que las dos peticiones siguientes son de 1000 y 700, de manera que cualquier
estrategia asignara completamente los dos ltim os bloques vacos, dejando 600 y
100 en el caso del m ejor ajuste, y 200 y 500, en el caso del prim er ajuste. Ahora
bien, el prim er ajuste puede satisfacer peticiones de bloques de tam ao 200 y 500,
m ientras que el m ejor ajuste obviam ente no podr.

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

ADM INISTRACION DE MEMORIA

que se puede restringir la seleccin de valores para las sr Si se hace que j - / - k,


para alguna k > 0, dado que shl - s - ,.*, se sigue que

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

sh determ ina com pletamente a sM , sM

,+ , =

2s

(1 2 .2 )

empezando con s - 1 en (12.2), se obtiene la secuencia exponencial 1, 2,4, 8,.... Por


supuesto, no im porta el valor inicial de s,; las s crecern exponencialmente en (12.2).
O tro ejemplo, si /c - 1, , - 1 y s2 - 2, (12.1) se transform a en

si+, = s + 5 ^ ,

(12.3)

esta ecuacin define la sucesin de Fibonacci: 1, 2, 3, 5, 8, 13,....


Para cualquier valor de k escogido en (12.1), habr un sistema de afinidades de
orden k-simo. Para cualquier k, la secuencia de tam aos permitidos crece exponen
cialmente; esto es, la razn sM/s se aproxim a a alguna constante m ayor que uno.
Por ejemplo, para k - 0, sM/st es exactam ente 2. Para k - 1la razn se aproxima a
la razn dorada (V 5 + 1) / 2 - 1.618, y la razn decrece conforme k crece, pero
nunca es m enor que 1.
D istribu ci n de bloques

En el sistema de afinidades de orden k- sim o, cada bloque de tam ao sM se puede


considerar form ado por un bloque de tam ao s y otro de tam ao s,_h Para ser ms
especficos, supngase que el bloque de tam ao s, est a la izquierda (en las posicio
nes num eradas menores) del bloque de tam ao s.k f. Si se considera la estructura
dinm ica com o un solo bloque de tam ao s, para alguna n grande, entonces las po
siciones en las que los bloques de tam ao s, pueden empezar estn completamente
determinadas.
Las posiciones en el sistema exponencial, o de orden 0-simo, son fciles de de
term inar. Si se supone que las posiciones en la estructura estn num eradas a partir
de 0, un bloque de tam ao s, empieza en cualquier posicin que comience con un
m ltiplo de 2', esto es, 0, 2*,.... Ms an, cada bloque de tam ao 2*+l, que empiece,
por ejemplo, en J2M est compuesto de dos grupos afines de tam ao 2', que em
piezan en las posiciones (2j)2, que son J2M, y (2j + 1)2'. As, es fcil encontrar el gru
po afn de un bloque de tam ao 2'. Si em pieza en algn mltiplo par de 2', como
(2y)2', su afn est a la derecha, en la posicin (2/ + 1)2'. Si empieza en un mltiplo
im par de 2', por ejemplo, en (2,j+ 1)2', su afn est a la izquierda, en (2j)2.
Ejemplo 12.8. No es simple el com portam iento de los sistemas de afinidades de or
den m ayor que cero. La figura 12.15 m uestra el sistema de afinidades de Fibonacci
t A veces es conveniente considerar que los bloques de tam ao s,
o i ,, , com o afines; de ahi el trm ino sistem a de afinidades.

www.FreeLibros.me

forman un bloque de tama

SISTEMAS DE M ANEJO DE MEMORIA PO R AFINIDADES (BU DD Y S Y S T E M S )

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

Divisin de una estructura dinmica segn el sistema de afinidades


de Fibonacci.

Asignacin d e bloques

Si se requiere un bloque de tam ao n, se escoge cualquiera de la lista de disponibles


de tam ao sh donde j, > n e i - 1 o s M < n, esto es, el bloque de mejor ajuste. En
un sistema de afinidades de orden A:-simo, si no hay bloques de tam ao s, es po
sible elegir un bloque de tam ao j*, o
para dividirlo, obteniendo en cualquier
caso algn bloque de tam ao s. Si no existen bloques de esos tamaos, se crea uno
aplicando la estrategia de divisin recursivamente para el tam ao
Sin embargo, hay una pequea tram pa. En un sistema de orden A:-simo, puede
ser que no se dividan los bloques de tam ao s s2 .... sh ya que de eso puede resultar
un bloque de tam ao m enor que S,. Se debe usar dicho bloque completo si no se
encuentra disponible otro menor. Este problema no surge si k - 0, esto es, en el sis
tema exponencial. Puede reducirse en el sistema de Fibonacci si se empieza con
i - 1, pero esa seleccin quiz no sea aceptable, puesto que los bloques de tam ao
uno (byte o palabra, tal vez), pueden ser muy pequeos para contener un apuntador
y un bit vaco/lleno.
Devolucin de bloques al espacio disponible

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

ADM INISTRACION DE MEMORIA

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

CO M PACTACIO N DEL ALMACENAM IENTO

405

Si se m antiene toda esta informacin, y se ligan las listas de disponibles en am


bas direcciones, slo se emplea una cantidad constante de tiem po en cada divisin
de un bloque o se combinan los afines en un bloque m s grande. Com o el nm ero
de combinaciones nunca puede exceder del nm ero de divisiones, la cantidad total
de trabajo es proporcional a este nmero. No es difcil reconocer que la m ayor parte
de las solicitudes de un bloque no requieren divisiones, ya que hay disponible un blo
que del tam ao correcto. Sin embargo, hay situaciones extrem as en las que cada asig
nacin requiere bastantes divisiones. El ejem plo extrem o es donde se solicita repe
tidam ente un bloque del tam ao ms pequeo y despus se devuelve. Si hay n ta
maos diferentes, se requieren por lo menos n /k divisiones en un sistema de orden
/c-simo, las cuales estarn seguidas de n /k combinaciones cuando se devuelve el blo
que.

1 2 .6

Com p actacin del alm acenam iento

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

ADM INISTRACION DE MEMORIA

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.

Prob le m a de la com p acta cln

Un problem a que debe enfrentarse con frecuencia es el de tom ar una coleccin de


bloques en uso, como la sugerida en la figura 12.16<a), donde cada bloque puede ser
de tam ao diferente y estar apuntado por ms de un apuntador, y correrlos hacia la
izquierda hasta que todo el espacio disponible quede en el extremo derecho de la es
tructura dinm ica, como se m uestra en la figura 12.16(b). Como es natural, los apun
tadores deben continuar apuntando a los mismos datos.

(a)

(b)
Fig. 12.16.

Antes de la compactacin

Despus de la compactacin

Proceso de com pactacin del almacenamiento.

Existen soluciones simples a este problema asignando un poco de espacio adi


cional en cada bloque, y se analizar otro m todo ms complicado, pero eficiente,
que no requiere espacio extra en los bloques utilizados, slo el que se ha usado hasta
ahora en cualquiera de los esquemas de manejo del espacio estudiados, es decir, un
bit vaco/lleno y un contador que indique el tam ao del bloque.

www.FreeLibros.me

COM PACTACION DEL ALMACENAMIENTO

407

U n esquema simple para la compactacin consiste en revisar primero todos los


bloques desde la izquierda, sean llenos o vacos, y calcular una direccin de avan
ce para cada bloque lleno. La direccin de avance de un bloque es su posicin ac
tual menos la sum a de todo el espacio vaco que se encuentra a su izquierda, esto
es, la posicin a la cual habr de pasar finalmente. Es fcil calcular la direccin de
avance. Al revisar los bloques desde la izquierda, se acumula la cantidad de espacio
vaco que se encuentra para sustraer esta cantidad a la posicin de cada bloque vis
to. El algoritmo se plantea en la figura 12.17.
(1)

var

p: integer; | posicin del bloque actual |


hueco: integer; | cantidad total de espacio vaco hallado
hasta ahora |
begin

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.

Clculo de las direcciones de avance.

Una vez calculada la direccin de avance, se revisan todos los apuntadores al


montn f. Se sigue cada apuntador hacia algn bloque B para reemplazar el apun
tador por la direccin de avance encontrada en ese bloque. Por ltimo, se mueven
todos los bloques llenos hacia su direccin de avance. Este proceso es sim ilar al de
la figura 12.17, con la lnea (8) reemplazada por
for

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

ADM INISTRACION DE MEMORIA

A lg o ritm o d e Morris

F. L. M orris descubri un mtodo para la com pactacin de la estructura dinmica


sin usar espacio en los bloques para la direccin de avance. No obstante, requiere
un bit de marca asociado con cada apuntador y con cada bloque para indicar el fi
nal de una cadena de apuntadores. La idea esencial es crear una cadena de apunta
dores que salen de una posicin fija en cada bloque lleno y enlazados todos a ese
bloque. Por ejemplo, en la figura 12.16(a) se observan tres apuntadores. A, D y E,
apuntando al bloque lleno del extremo izquierdo. En la figura 12.18, se encuentra
la cadena deseada de apuntadores. U na porcin de los datos de tam ao igual a la
de un apuntador se ha extrado del bloque y colocado al final de la cadena, donde
se encontraba el apuntador A.

est ahora el apuntador E

del fin de cadena


Fig. 12.18.

Encadenamiento de apuntadores.

El mtodo para crear dichas cadenas de apuntadores es como sigue. Se exami


nan todos los apuntadores en cualquier orden conveniente. Supngase un apunta
dor p al bloque B. Si el bit de m arca en el bloque B es cero, entonces p es el primer
apuntador encontrado que apunta a B. Se colocan en p los contenidos de las posi
ciones de B utilizadas para la cadena de apuntadores, y se hace que esas posiciones
de B apunten a p. Despus, se hace el bit de marca en B igual a l , indicando que
ahora tiene un apuntador, y el bit de marca en p igual a 0, indicando el fin de la ca
dena de apuntadores y la presencia de los datos desplazados.
Ahora bien, al considerar el apuntador p al bloque B, el bit de marca en B est
en uno; entonces, B ya tiene la cabeza de la cadena de apuntadores. Se copia el apun
tador de B en p, para que B apunte a p, y se hace el bit de marca en p igual a 1; de
este modo, p queda, efectivamente, en la cabeza de la cadena.
Una vez que se tienen todos los apuntadores a cada bloque enlazados en una ca
dena que parte desde ese bloque, se pasan los bloques llenos tan a la izquierda como
sea posible, igual que en el sencillo algoritmo analizado con anterioridad. Por lti
mo, se examina cada bloque en su nueva posicin y se recorre su cadena de apun
tadores. Cada apuntador localizado se actualiza para que apunte al bloque en su nue
va posicin. Al encontrar el final de la cadena se reinstalan los datos de B, conteni
dos en el ltim o apuntador, a su lugar correcto en el bloque B y se fija el bit de mar
ca del bloque igual a 0.

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

Supngase que se realizan las siguientes peticiones:


1) asignar un bloque de 120 bytes,
2) asignar un bloque de 70 bytes,
3) devolver al frente de
la lista de disponibles el bloque que se encuentra
entre los bytes 700 y 849, y
4) asignar un bloque de 130 bytes.
Proporcinese la lista de espacio libre, en orden, despus de ejecutar la se
cuencia de pasos anterior, suponiendo que los bloques libres se seleccionan
de acuerdo con la estrategia de
a)
b)
12.2

primer ajuste
m ejor ajuste.

Obsrvese la siguiente estructura dinm ica, donde las regiones en blanco se


encuentran en uso y las regiones etiquetadas estn vacas.
'o

100
a

200

300

500
b___________

Establzcase una secuencia de solicitudes que puedan satisfacerse al em


plear
a) prim er ajuste, pero no m ejor ajuste
b) mejor ajuste, pero no prim er ajuste

*123 Supngase que se utiliza un sistema de afinidades exponencial con tam a


os 1, 2, 4, 8 y 16 en una estructura dinm ica de tam ao 16. Si se solicita
un bloque de tam ao n, para 1 < n < 16, es necesario asignar un bloque
de tam ao 2', donde 2'~ < n < 2*. La porcin no utilizada del bloque, si
existe, no puede emplearse para satisfacer ninguna otra solicitud. Si se ne
cesita un bloque de tam ao 2', i < 4, y no existe dicho bloque libre, pri
mero se busca un bloque de tam ao 2,+l y se divide en dos partes del mis
mo tamao. Si no existe un bloque de tam ao 2M , se busca y se parte un
bloque de tam ao 2M , y as sucesivamente. Si se llega a buscar un bloque
libre de tam ao 32, el proceso falla y no puede satisfacerse la solicitud. A

www.FreeLibros.me

410

ADMINISTRACION DE MEMORIA

efectos de este ejercicio, no se combinan bloques libres adyacentes en la es


tructura dinmica.
Existen secuencias de solicitud alt a2, ..., a cuya suma es menor que
16, tal que la ltim a peticin no puede satisfacerse. Por ejemplo, consid
rese la secuencia 5, 5, 5. La primera peticin hace que el bloque inicial de
tam ao 16 se parta en dos bloques de tam ao 8, uno de los cuales se usa
para satisfacer la solicitud. El bloque libre restante de tam ao 8 satisface
la segunda, y no queda espacio libre para satisfacer la tercera.
Encuntrese una secuencia a,, a2, ..., an de enteros entre 1 y 16 (no es
necesario que sean idnticos), cuya suma sea lo ms pequea posible, tal
que, tratada como una secuencia de solicitudes de bloques de tam ao a
a2, ..., an, la ltima peticin no se satisfaga. Expliqese por qu esta secuen
cia de peticiones no se satisface, pero cualquier otra secuencia cuya suma
sea ms pequea si puede satisfacerse.
12.4

Considrese la compactacin de memoria en la administracin de bloques


de igual tamao. Supngase que cada bloque consta de un campo para da
tos y otro para apuntador, y que se han marcado todos los bloques que se
encuentran en uso actualmente. Los bloques estn ubicados entre las loca
lidades de memoria a y b. Se desea relocalizar todos los bloques activos de
m anera que ocupen memoria contigua partiendo de a. Recurdese que, para
relocalizar un bloque, el campo del apuntador de cualquier bloque que
apunta al bloque relocalizado debe actualizarse. Disese un algoritmo para
la compactacin de bloques.

12.5

Se da un arreglo de tam ao n. Proporcinese un algoritmo para correr to


dos los elementos del arreglo k lugares en forma cclica, en sentido con
trario al de las manecillas del reloj, slo con una cantidad constante de me
moria adicional, independiente de k y n. Sugerencia. Tngase en cuenta qu
sucede si se invierten los k primeros elementos, los n-k ltimos elementos
y, por ltimo, el arreglo completo.

12.6

Disese un algoritmo para sustituir una subcadena y de una cadena xyz


por otra subcadena y', con la m enor cantidad posible de memoria adicio
nal. Cul es la complejidad de tiempo y espacio de este algoritmo?

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?

12.9 Obtngase el algoritmo de compactacin de las estructuras dinmicas de


Morris, m ostrado en la seccin 12.6.
*12.10

Disese un esquema de asignacin de almacenamiento para una situacin


en la que la memoria se asigna y libera en bloques de longitud 1 y 2. Pro
porcinense cotas sobre la eficiencia del algoritmo.

www.FreeLibros.me

NOTAS BIBLIOGRAFICAS

411

Notas bib liog rficas

La administracin eficiente alm acenam iento es un tem a central en muchos lengua


jes de programacin, incluyendo SNOBOL [Farber, Griswold y Polonsky (1964)],
LISP [McCarthy (1965)], APL [Iverson (1962)] y SETL [Schwartz (1973)]. Nicholls
(1975] y Pratt (1975] comentan las tcnicas de adm inistracin de alm acenam iento
en el contexto de la compilacin de lenguajes de programacin.
El sistema de afinidades para asignacin de alm acenam iento fue publicado por
primera vez por Knowlton (1965]. Los sistemas de afinidades de Fibonacci fueron
estudiados por Hirschberg (1973].
El elegante algoritmo de marcado utilizado en la recoleccin de basura fue descu
bierto por Peter Deutsch (Deutsch y Bobrow [ 1966]) y por Schorr y W aite [ 1965]. El
esquema de compactacin de estructuras dinm icas de la seccin 12.6 se debe a
Morris (1978].
Robson (1971] y Robson (1974] analizan la cantidad de m em oria requerida para
algoritmos dinmicos de asignacin de almacenamiento. Robson (1977] presenta un
algoritmo acotado en espacio de trabajo para copiar estructuras cclicas. Fletcher y
Silver (1966] contiene otra solucin al ejercicio 12.5 que utiliza poca m em oria adi
cional.

www.FreeLibros.me

También podría gustarte