Documentos de Académico
Documentos de Profesional
Documentos de Cultura
tos de
Estru
turas de Datos
Jorge L. Ortega Arjona
Departamento de Matem ati
as
Fa
ultad de Cien
ias, UNAM
Febrero 2004
2
Indi
e general
1. Arboles de B
usqueda
Re
orrido y Mantenimiento 7
4. Compresi
on de Texto
Codi
a
ion Human 27
5. B
usqueda de Cadenas
El Algoritmo Boyer-Moore 33
3
4
Prefa
io
Los Temas Sele
tos de Estru
turas de Datos introdu
en en forma simple
y sen
illa a algunos temas relevantes de Estru
turas de Datos. No tiene
la inten
ion de substituir a los diversos libros y publi
a
iones formales en
el area, ni
ubrir por
ompleto los
ursos rela
ionados, sino mas bien, su
objetivo es exponer brevemente y guiar al estudiante a traves de los temas
que por su relevan
ia se
onsideran esen
iales para el
ono
imiento basi
o
de esta area, desde una perspe
tiva del estudio de la Computa
ion.
Los temas prin
ipales que se in
luyen en estas notas son: Arboles de
Busqueda, Ordenamiento Se
uen
ial, Alma
enamiento por Hashing, Com-
presion de Texto, Busqueda de Cadenas y Bases de Datos Rela
ionales.
Estos temas se exponen ha
iendo enfasis en los elementos que el estudiante
(parti
ularmente el estudiante de Computa
ion) debe aprender en las asig-
naturas que se imparten
omo parte de la Li
en
iatura en Cien
ias de la
Computa
ion, Fa
ultad de Cien
ias, UNAM.
5
6
Cap
tulo 1
Arboles de B
usqueda
Re
orrido y Mantenimiento
Un arbol es una de las estru
turas de datos mas utiles que se han
on-
ebido en programa
ion de sistemas. Consiste en un
onjunto de nodos or-
ganizados que alma
enan algun tipo de dato. Ciertamente, existen mu
hos
algoritmos para la busqueda y manipula
ion de los datos alma
enados en
arboles. Este
aptulo des
ribe
omo se
onstruyen los arboles, un algoritmo
de busqueda de datos en el arbol, algunos esquemas de re
orrer el arbol, y
una te
ni
a de mantener (a~nadiendo o borrando) los datos del arbol.
El uso de nodos y apuntadores es fundamental para la
onstru
ion de
arboles de busqueda. Un nodo no es mas que una
ole
ion de lo
alidades
de memoria aso
iadas en
onjunto por un programa. Cada nodo tiene un
nombre que, ya sea dire
ta o indire
tamente, se reere a la dire
ion de una
de sus lo
alidades de memoria. Esta ultima normalmente tiene un
ontenido,
que es el elemento a ser alma
enado en el nodo. Ademas, in
luye
ero, uno
o dos (y a ve
es mas) apuntadores o ligas. Estos apuntadores no son mas
que los nombres de otros nodos en el arbol. Los programas que usan arboles
de busqueda tienen la op
ion de pasar de un nodo a otro seguiendo tales
apuntadores.
Con
eptualmente, un arbol de busqueda se representa por
ajas y
e
has
(gura 1.1). Cada
aja representa un nodo, y
ada
e
ha representa un
apuntador. Cada nodo en el diagrama
onsiste de
ampos (espa
ios donde
puede alma
enarse un dato o apuntador), que en este
aso, son un
ampo
de datos y dos
ampos de apuntadores.
7
37
29 0 51
5 0 −80 0 0 6
17 0 0 42 0 0 9 0 0
1 1 1
2 2 2
101 −80 nil nil
3 37 3 4 3 5
102 29 106 nil
103 4 29 4 11 4 nil
104 42 nil nil 5 51 5 10 5 7
105 37 102 110 6 6 6
106 5 nil 107
7 6 7 8 7 9
107 17 nil nil
8 42 8 8
108
9 9 9 nil 9 nil
109
10 −80 10 nil 10 nil
110 51 101 111
11 5 11 nil 11 13
111 6 104 112
12 12 12
112 9 nil nil
13 17 13 nil 13 nil
14 14 14
Directamente en memoria Como arreglo
8
No resulta dif
il trazar en ambos diagramas los datos y apuntadores
de un nodo a otro; meramente, se ini
ia en el nodo indi
ado
on la
e
ha
en ambos
asos. En el primer
aso, los tres
ampos se alma
enan en una
sola palabra en la dire
ion de memoria 105. El
ampo de datos
ontiene
el valor 37, y los
ampos de apuntador indi
an respe
tivamente los nodos
\hijos" izquierdo y dere
ho de ese nodo. En este
aso, el nodo hijo izquierdo
se en
uentra en la dire
ion 102, y el nodo hijo dere
ho en la dire
ion 110.
En la segunda representa
ion, los
ampos de datos y apuntadores se en
uen-
tran alma
enados en tres arreglos separados llamados Elemento, izquierda
y dere
ha, respe
tivamente. En este
aso, los
ampos son utilizados de la
misma manera que en el
aso anterior. Los
ampos de apuntador que no
apuntan a nada
ontienen un valor \nil". Esto meramente signi
a que se
usa un smbolo distinguible de valores (dire
iones) validos para los apun-
tadores. Los espa
ios en ambas representa
iones se muestran para ha
er
evidente que los arboles son
onstruidos en formas que el programador no
siempre puede
ontrolar.
\En
ada nodo, todos los elementos alma
enados en su subarbol izquierdo
tienen un valor menor que el elemento alma
enado en ese nodo; y todos los
elementos alma
enados en el subarbol dere
ho tienen un valor mayor que el
elementos alma
enado en ese nodo" (gura 1.3)
Un arbol de datos que satisfa
e tal
ondi
ion se le
ono
e
omo arbol de
busqueda binario. La gura 1.4 muestra un ejemplo en el que puede verse
que tan rapido puede ha
erse una busqueda en arboles. En este
aso, los
elementos son nombres, y el ordenamiento simplemente es alfabeti
o.
Para bus
ar en este arbol, se puede usar un algoritmo muy simple, que
toma
omo entrada el \nombre", y su salida es s o no dependiendo si tal
nombre fue hallado en el arbol. Las nota
iones item(node), left(node) y
right(node) se reeren, respe
tivamente, al elemento, al apuntador izquierdo
y al apuntador dere
ho de un nodo dado. El algoritmo
omienza en el nodo
mas alto del arbol:
9
X
Todos Todos
los elementos los elementos
aqui son aqui son
<x >x
Knuth
Cook Shannon
10
pro
edure SEARCH
1. found false
2. node top
3. repeat
a) ifitem(node) = name
then print si; node nil; found true;
b ) if item(node) > name
then node right(node);
) if item(node) < name
then node left(node);
4. until node = nil;
5. if not found
then print no;
El pro
edimiento SEARCH des
iende nodo a nodo: si el nombre que se
bus
a es \menor que" el nombre alma
enado en tal nodo, el algoritmo toma
la rama izquierda; si el nombre que se bus
a es \mayor que" el nombre alma-
enado en el nodo a
tual, el algoritmo toma la rama dere
ha. Finalmente,
si el nombre es en
ontrado en un nodo, el algoritmo imprime s.
El
i
lo termina tan pronto
omo node = nil. Esto su
ede no solo
uando
el nombre bus
ado se en
uentra, sino tambien
uando el algoritmo trata de
des
ender a traves de un apuntador nulo, es de
ir, ha llegado al fondo del
arbol. Notese el uso de la variable logi
a found, que a
tua
omo se~nal para
la prueba, al nal del algoritmo. Esta variable se ini
ializa
on un valor de
false, y solo
ambia si la busqueda es exitosa.
Es notorio que el numero de itera
iones en el
i
lo prin
ipal de SEARCH
no es nun
a mayor que el numero de niveles en el arbol. Ya que la
antidad de
trabajo he
ho dentro del
i
lo se limita a un numero
onstante de pasos, es
posbile es
ribir la
omplejidad en el tiempo de busqueda limitado por O(l),
donde l es el numero de niveles en el arbol. Sin embargo, en un arbol de
busqueda binario
on n nodos, y todos los nodos ex
epto los mas profundos
teniendo dos hijos, el numero de niveles l esta dado por:
l = dlog2 ne
11
Esto permite es
ribir la
omplejidad en el tiempo de SEARCH
omo O(log n)
en el
aso general, al menos
uando el arbol se en
uentra \lleno" en el sentido
dado previamente.
Este tiempo de busqueda es ex
esivamente rapido. Si en lugar de 15
de los mas famosos personajes en
omputa
ion se
olo
an mil millones de
nombres de quienes trabajan en
omputa
ion1 el tiempo de busqueda se
in
rementara apenas de 4 pasos a solo 30.
Ahora bien, puede darse el
aso de que se requiera listar todos los datos
alma
enados en un arbol de busqueda. Un algoritmo que produ
e tal lista
puede re
orrer el arbol, es de
ir, visitar
ada nodo en alguno de varios orde-
namientos, el mas
omun de los
uales es el orden de \primero profundidad"
(depth-rst order) o preorden. Este modo de re
orrido o visita se progra-
ma fa
ilmente utilizando la re
ursion. El algoritmo se mueve ha
ia arriba
y abajo dentro del arbol siguiendo los apuntadores. La regla sen
illa que
dene su progreso requiere, por ejemplo, que ningun nodo a la dere
ha de
un nodo dado sea visitado hasta que todos los nodos a la izquierda hayan
sido visitados.
pro
edure DEP T H (x)
1. usex
2. ifleft(x) 6= nil
then DEP T H (left(x))
3. if right(x) 6= nil
then DEP T H (right(x))
program DEP T H (root)
El paso \use x" signi
a aqu imprimir x o pro
esarlo de alguna manera.
Si el pro
edimiento no ha al
anzado el fondo del arbol donde los apunta-
dores son nulos, enton
es se llama a s mismo primero des
endiendo por la
izquierda del nodo a
tual, y luego por la dere
ha. Obviamente, la llamada a
DEP T H
on el nodo izquierdo
omo argumento podra resultar inmediata-
mente en otra llamada igual, y as hasta llegar al fondo del arbol. De esta
forma, el algoritmo
onsiste en una sola llamada a DEP T H
on argumento
en el nodo raz (root) del arbol, lo que resulta en un barrido sistemati
o de
izquierda a dere
ha atraves de todos los nodos del arbol.
1
Lo
ual sera su
iente para
onsiderar a todos quienes trabajamos en
omputa
ion
12
En mu
has apli
a
iones, los arboles de busqueda binarios no se en
uen-
tran jos de prin
ipio a n, sino que pueden
re
er o empeque~ne
erse
omo
ualquier ar
hivo de datos. Para insertar un nuevo elemento en un arbol de
busqueda (gura 1.5), es tan solo ne
esario modi
ar levemente el algoritmo
de busqueda: tan pronto
omo la busqueda por el elemento falla, obtengase
una dire
ion nueva (no usada), y reempla
ese el apuntador a nulo en
ontra-
do
on tal dire
ion. En seguida se
olo
a el nuevo elemento en la dire
ion,
y se
rean dos apuntadores nulos, para formar entre los tres los
ampos de
un nuevo nodo.
42 42 nil nil
13
58 58
*
Borrar
42 47
35 47 46 54 nil nil
*
30 nil 36
14
Cap
tulo 2
L = x1 ; x2 ; :::; x n
15
Considerese que la
omputadora
omienza
omparando una x
on unai
xi< xj xi> xj
L0 L1
16
L
xi< xj xi> xj
L0 L1
L 00 L 01 L 10 L 11
D = dlog me
= log n(n 1)(n 2):::(n=2)
n
> log( ) 2 n=
2
n n
= log
2 2
= O(n log n)
Esto es tan solo otra forma de de
ir que
ualquier
ompara
ion para or-
denamiento que tome una lista de n elementos
omo entrada debe realizar
al menos O(n log n)
ompara
iones en el peor de los
asos. Cualquier algo-
ritmo que se reali
e substan
ialmente mejor que esto, en total, debe ha
er
su de
ision para ordenamiento en base a otro
riterio, o debe ser
apaz de
ha
er las
ompara
iones en paralelo.
17
18
Cap
tulo 3
19
Llave ASCII Direccion
TO 124117 17 05 BE
IT 111124 24 06 IF, OF
IS 111123 23 07
AS 101123 23 10
AT 101124 24 11
IF 111106 06
OF 117106 06
AM 101115 15 14
BE 102105 05 15 AM
DO 104117 17 16 AN
AN 101116 16 17 TO, DO, GO
GO 107117 17
SO 123117 17
23 AS, IS
24 IT, AT
25
omo se muestra en la gura 3.1, la
ual usa palabras de dos letras en ingles
omo llaves.
Los dos ultimos dgitos del
odigo ASCII para
ada llave k se utilizan
o-
mo dire
ion h(k), en la
ual
ada palabra puede ser alma
enada. De a
uer-
do
on esto, en la parte dere
ha de la gura 3.1 se muestra una por
ion
de memoria en forma esquemati
a. Ademas de
ada lo
alidad de memo-
ria, se muestra la llave que ha sido transformada a tal dire
ion. Algunas
lo
alidades de memoria no tienen llaves, y otras tienen mas de una.
Esto ultimo se
ono
e
omo
olision, y para ha
er que el hashing tra-
baje
orre
tamente, las
olisiones deben resolverse. Uno podra pensar que
las
olisiones son relativamente raras. Ciertamente, el gran numero de
ol-
isiones en el ejemplo previo se debe al he
ho de que varias de las palabras
de dos letras usadas
omo llaves terminan en la misma letra. De he
ho,
omo lo apunta Knuth, las
olisiones son
asi la regla, aun
on llaves dis-
tribuidas aleatoriamente, mu
ho antes de que el espa
io de memoria reser-
vado para el alma
enamiento sea totalmente utilizado. Knuth ilustra este
punto
on la famosa paradoja del
umplea~nos: >Cual es la probabilidad de
que al menos dos personas en una habita
ion
on 23 personas tengan el
mismo
umplea~nos?
20
La respuesta es mas que 0.5. Si se
onsidera a los 365 posibles
umplea~nos
omo lo
alidades de memoria, a los nombres de las 23 personas
omo datos,
y sus
umplea~nos
omo llaves, enton
es este simple ejemplo muestra que tan
posibles son las
olisiones: la probabilidad de que al menos su
eda una
ol-
ision es mayor que 0.5 aun antes de que el 10 por
iento de las lo
alidades
de memoria sean utilizadas.
Existen prin
ipalmente dos metodos para resolver las
olisiones, llama-
dos en
adenamiento (
haining) y area de desbordamiento (open addresing).
Sin embargo, antes de des
ribirlos, se observa que puede lograrse mediante
mantener las
olisones a un mnimo.
El medio de alma
enamiento se
onsidera
omo un
onjunto de dire
-
iones enteras de 0 a M ; estas pueden ser ndi
es de un arreglo o dire
iones
verdaderas de memoria, dependiendo del nivel del lenguaje usado. Una llave
k es generalmente una
adena alfanumeri
a, pero siempre podemos
onvertir
k en su equivalente entero ASCII. Suponiendo que k es ya un entero, >
omo
generar una dire
ion de memoria en un rango de 0 a M a n de minimizar
la probabilidad de
olisiones? Una forma es utilizar la opera
ion modulo de
M:
h(k) = k mod M
La uni
a forma en que se puede
ontrolar la fun
ion h es sele
ionando
M ; no es una
uestion de que tan grande o peque~na ha
er M . Es solo
ne
esario que M sea el tipo
orre
to de numero. Se ha observado que si
M es un numero primo, enton
es h genera dire
iones de memoria bien
distribuidas, siempre y
uando M no tenga la forma r + a, donde r es la
k
raz del
onjunto de
ara
teres (r = 128 para los
ara
teres ASCII), y a es
un entero peque~no. Si se toma este
onsejo para el ejemplo anterior, enton
es
es notorio que M = 23 esta
iertamente muy lejos de la forma 128 . k
21
h = dos ultimos digitos h = modulo 23
0 0
1 1
2 2 IF
3 3 SO
4 4 DO
5 5 BE
6 6
7 BE 7 AM
8 IF, OF 8 TO
9 9 AN
10 10
11 11
12 12
13 13 AS
14 14 AT
15 AM 15 IS, OF
16 AN 16 IT
17 TO, DO, GO 17
18 18
19 19
20 20
21 AS, IS 21
22 22 GO
Figura 3.2: Utilizando la fun ion modulo on primos genera una mejora
Ademas del metodo de la division, hay otro metodo util el
ual usa la
multipli
a
ion. Se basa en la observa
ion general de que si uno toma un
numero irra
ional x, y forma n de sus multiplos:
x1 ; x2 ; x3 ; :::; x n
22
Sea g la razon aurea, tan
er
ana
omo el tama~no de una palabra pueda
aproximarla.
1. h kg
2. h parte fra
ional de h
3. h hM
4. h parte entera de h
Este
al
ulo forma el produ
to k g, toma su parte fra
ionaria, lo es
ala
a M y toma el entero mas
er
ano (menor que) el resultado.
Apli
ando este metodo al ejemplo de las llaves para palabras de dos
letras, solo se obtiene una
olision, lo
ual es el mejor desempe~no que se
pudiera esperar bajo las
ir
unstan
ias a
tuales.
Ahora bien, habiendo dis
utido algunos tipos de fun
iones hash, se re-
toman las te
ni
as para manejo de
olisiones. La primera involu
ra la
on-
stru
ion de una
adena de apuntadores desde
ada dire
ion en la
ual
o
urra una
olision, y la segunda se reere a
ambiarse a una nueva dire
-
ion de memoria dentro de la tabla hash en la por
ion de memoria dedi
ada
al alma
enamiento de llaves.
El en
adenamiento se ilustra en la gura 3.3 para la fun
ion hash del
ejemplo.
15 AM
16 AN
17 TO DO GO
23 AS IS
23
de
ada lo
alidad de memoria en la tabla se reserva para un apuntador,
enton
es
uando una llave
omo DO se aso
ia
on la misma dire
ion que
TO, una nueva lo
alidad se a~nade de un espa
io de memoria auxiliar. La
llave DO se
olo
a en esta lo
alidad, y su dire
ion se inserta en el espa
io
para apuntador aso
iado
on la primera palabra TO. Similarmente,
uando
despues llega GO a la misma dire
ion, se le a~nade a la
adena tras DO
mediante un segundo apuntador.
La otra te
ni
a para resolver
olisiones, llamada area de desbordamiento,
onsiste en insertar una llave k, y des
ubrir que h(k) se en
uentra ya o
upada
por otra llave; enton
es, se \prueba" la tabla hash, examinando dire
iones a
una distan
ia ja p(k) adelante de la dire
ion que se
onsidera a
tualmente.
Si h(k) esta o
upada, se examina h(k) p(k), y si esta se en
uentra o
upada,
se examina h(k) 2p(k), y as su
esivamente.
Si p(k) = 1, la te
ni
a lineal resulta en un largos \ra
imos" (
lusters)
onforme se llena la tabla. Al ha
er p(k) =
, donde
es un entero \relati-
vamente primo" (i.e.
on po
os divisores) respe
to a M , hay una tenden
ia
menor a formarse ra
imos.
Quiza la mejor te
ni
a de todas es
ombinar esta prueba se
uen
ial
on
una tabla hash ordenada: si las llaves k se han insertado en la tabla en orden
de
re
iente de k, enton
es el siguiente algoritmo inserta una nueva llave en
la tabla, siempre y
uando haya espa
io para ella.
1. i h(k)
2. if
ontenido(i) = 0 then
ontenido(i) k; exit
24
En la mayora de los
asos, bus
ar en una tabla hash es muy similar
a insertar una nueva llave: se
al
ula el valor hash h(k), y se veri
a la
dire
ion para ver si k se en
uentra en la tabla. Dependiendo si se trata
de en
adenamiento o de area de desbordamiento, se sigue una
adena de
apuntadores o se prueba una se
uen
ia dentro de la tabla.
Si m dire
iones de las M dire
iones en una tabla
ontienen llaves , y las
adenas de tal tabla
ontienen ademas n llaves, enton
es el numero de pasos
requeridos para bus
ar en una tabla
on en
adenamiento es n=m. Si la fun-
ion hash lleva a una distribu
ion relativamente uniforme de llaves, enton
es
m es mayor que n, y el tiempo de busqueda es esen
ialmente
onstante (y
peque~no).
La razon m=M se
ono
e
omo \fa
tor de
arga" (load fa
tor) de una
tabla hash. Bajo la te
ni
a de area de desbordamiento, una se
uen
ia de
pruebas requiere de
M
O
M m
pasos para lo
alizar una llave dentro de la tabla. Aun
uando este resultado
puede ser derivado teori
amente, hasta ahora solo hay eviden
ia empri
a
que el orden de una tabla hash requiere de
M M
O log
m M m
pasos para una busqueda exitosa. Este lmite de
omplejidad promedio es,
sin embargo, una
onjetura. Notese que la
omplejidad de una prueba lin-
eal
re
e mu
ho mas rapidamente que el orden supuesto de la
omplejidad
onforme m se aproxima a M .
Resulta util
omparar varias te
ni
as de alma
enamiento y re
upera
ion
para de
idir
ual es la mejor para una apli
a
ion dada. Por ejemplo, es
posible
omparar las tablas hash
on los metodos de arboles binarios (vease
el
aptulo 1), y
on
luir que aun
uando el tiempo de a
eso es mu
ho menor
en las tablas hash, esto se debe a que generalmente se utiliza una tabla de
tama~no jo M . Esta in
exibilidad puede ser una desventaja si el ar
hivo
que se mantiene no tiene un lmite espe
o de
re
imiento. Sin embargo,
las tablas hash son mas fa
iles de programar que algunos esquemas basados
en arboles.
25
26
Cap
tulo 4
Compresi
on de Texto
Codi
a
ion Human
Las dos apli
a
iones mas importantes de las te
ni
as de
odi
a
ion son
la prote
ion y
ompresion. Cuando un mensaje es
odi
ado
omo una
a-
dena de
eros y unos, existen te
ni
as que, mediante la inser
ion de algunos
bits extra en la
adena a trasmitir, permiten al re
eptor del mensaje des-
ubrir
uales
eros o unos (si los hay) son erroneos. Ademas, hay metodos
de a
ortamiento de la
adena, de tal modo que no se requieren transmitir
mu
hos bits.
Las dos grandes areas de apli
a
ion de la teora de
odi
a
ion son tiempo
y espa
io. Las apli
a
iones de tiempo son aquellas de
omuni
a
ion tradi-
ional en que un mensaje se transmite ele
troni
amente a traves del tiempo,
y la mayor preo
upa
ion es proteger el mensaje de errores. Las apli
a
iones
de espa
io involu
ran la prote
ion o
ompresion de datos durante el alma
e-
namiento en algun medio ele
troni
o,
omo la memoria de una
omputadora
o los dis
os magneti
os.
Si una gran
antidad de texto debe alma
enarse, o si el espa
io de al-
ma
enamiento es importante,
onviene
omprimir el texto de alguna forma
antes de alma
enarlo. La
odi
a
ion Human ha
e esto mediante explotar
la redundan
ia en el texto fuente.
En esen
ia, la idea es muy simple. Supongase que se tiene una
adena de
texto que usa un alfabeto
on smbolos s1 , s2 , ..., s , y que la probabilidad de
n
27
longitud l , de tal modo que la longitud promedio que representa un smbolo
i
L= pl i i
=1 i
Suponiendo que p1 > p2 > ::: > p , se nota que L se minimiza solo si l1 <
n
l2 ::: < l . Esta observa
ion forma la base para una te
ni
a que sele
iona
n
las
adenas binarias reales que
odi
an los varios smbolos. Supongase, por
ejemplo, que los smbolos A, B , C , D, E , F y G apare
en
on las probabil-
idades 0.25, 0.21, 0.18, 0.14, 0.09, 0.07 y 0.06 respe
tivamente. Notese que
la suma de todas las probabilidades suma 1.0.
Un arbol de Human para estos smbolos y sus probabilidades es una rep-
resenta
ion visual
onveniente de la sele
ion, en la
ual las
adenas binarias
representan los smbolos (gura 4.1). Cada nodo del arbol esta etiquetado
on la suma de las probabilidades asignadas a los nodos que tiene debajo.
1.0
0 1
0.57 0.43
0 1
0 1
0.07 0.06
F G
Antes de des
ribir
omo se
onstruye este arbol, notese que
ada smbolo
en el alfabeto fuente se en
uentra en un nodo terminal del arbol, y que la
adena binaria que lo
odi
a esta en la se
uen
ia de
eros y unos que se
28
en
uentran al re
orrer el arbol desde la raz a un nodo en parti
ular. La
odi
a
ion Human para el sistema que se ha des
rito es por lo tanto:
A 00
B 10
C 010
D 011
E 111
F 1100
G 1101
La longitud promedio del
odigo L es 2.67 bits, y este es un mnimo.
El algoritmo que asigna estos
odigos
onstruye un arbol de Human
expl
ito de abajo ha
ia arriba. Un arreglo llamado \subarboles"
ontiene
los ndi
es de las ra
es de todos los subarboles de los que se
onstruye el
arbol de Human. Ini
ialmente, subarboles no
ontiene mas que subarboles
de un solo nodo, uno por
ada uno de los n smbolos s del alfabeto que
i
29
7. subarboles(n i) n+i
El pro
eso que se indi
a por el paso \a~nade 0 a la terminal del subarbol
n i" simplemente quiere de
ir re
orrer el (n i)-esimo subarbol y a~nadir
un 0 a
ada palabra alma
enada
omo sus nodos terminales. No se ha
e
referen
ia expl
ita de estas palabras en el algoritmo, pero son fa
ilmente
manejadas
uando el algoritmo se
onvierte en un programa. El paso \ a~nade
1 a la terminal del subarbol n i + 1" tiene un signi
ado similar.
Despues de que los apuntadores se modi
an para aso
iarse
on el nuevo
nodo n + i (siendo los nodos anteriores 1; 2; :::; n; n + 1; :::; n + i 1), el algo-
ritmo nalmente reemplaza las dos ultimas entradas en el arreglo subarboles
por la raz del nuevo subarbol
onstruido. Cuando i llega a ser n 1, hay
un solo subarbol en todo el arreglo, y este es el arbol de Human.
Los primeros pasos de la opera
ion del algoritmo pueden ilustrarse por
el ejemplo ya presentado. Ini
ialmente hay n i + 1 = 7 subarboles que
onsisten de un nodo
ada uno. Esto se rearreglan en orden de
re
iente
respe
to a su probabilidad (gura 4.2).
1 2 3 4 5 6 7
A B C D E F G
30
1 2 3 4 8 5
A B C D E
6 7
0.07 0.06
F G
1 9 2 3 4
A B C D
8 5
0.13 0.09
E
6 7
0.07 0.06
F G
31
Para alma
enar una pieza dada de texto utilizando la
odi
a
ion Hu-
man, se
rea una tabla en la
ual se
uenta el numero de ve
es n que el
i
32
Cap
tulo 5
B
usqueda de Cadenas
El Algoritmo Boyer-Moore
Existen algunas sutilezas en lo que pare
e ser el asunto sen
illo de bus
ar
un patron parti
ular dentro de una
adena de
ara
teres, espe
ialmente si
desea ha
erse rapidamente. Por lo tanto, la pregunta >Que tan rapido se
puede bus
ar un patron dado dentro de una
adena de n
ara
teres? tiene
una
ierta di
ultad pra
ti
a.
Por ejemplo,
omo todo minero sabe, hay mu
has formas de bus
ar ORO
en LAS MINAS. Una
antidad razonable de metodos di
tan que se busque la
adena en un orden denido, por ejemplo, de izquierda a dere
ha. Se intenta
ha
er
oin
idir el patron
on la parte mas a la izquierda de la
adena, y si la
oin
iden
ia falla, se
ontinua re
orriendo la
adena ha
ia la dere
ha hasta
que se en
uentra una
oin
iden
ia o se a
aba la
adena. Realmente, pare
e
razonable
omparar los primeros
ara
teres en el patron y la
adena en tal
orden:
LAS MINAS
ORO
33
LAS MINAS
ORO
LAS MINAS
ORO
inmediatamente a:
LAS MINAS
ORO
34
Ademas de la te
ni
a de re
orrer basado en tabla 1, el algoritmo Boyer-
Moore usa otra buena idea: supongase que en el pro
eso de ha
er
oin
idir
los
ara
teres del patron
on los
ara
teres de la
adena, los primeros m
ara
teres (de dere
ha a izquierda) se en
uentra que
oin
iden:
TRESTRISTESTIGRESTRAGABANTRIGO
TRASTRA
En tal
aso, la por
ion que
on
ide hasta ahora al nal del patron podra
bien o
urrir en
ualquier otro lado del patron. Sera enton
es inteligente
re
orrer el patron a la dere
ha solo la distan
ia entre las dos por
iones:
TRESTRISTESTIGRESTRAGABANTRIGO
TRASTRA
35
d) i i + max(table1(string(i)); table2(j ))
donde an
ho es la longitud del patron, largo es la longitud de la
adena,
i es la posi
ion a
tual en la
adena de
ara
teres, j es la posi
ion a
tual
en el patron, string(i) es el i-esimo
ara
ter en la
adena, y pattern(j) es el
j -esimo
ara
ter en el patron.
Como ejemplo del algoritmo anterior en opera
ion, supongase que el
patron TRASTRA se ha
olo
ado en seguida de ...GRESTRA... en la
adena.
Comenzando en el paso 2.
, se nota que i = 20 y j = 7. Ya que string(26) =
pattern(7), ambos i y j se de
rementan. Retornando al paso 2.b
on i = 19 y
j = 6 se en
uentra otra
oin
iden
ia, volviendo i = 18 y j = 5. Finalmente,
una nueva
on
iden
ia su
ede, lo que deja i = 17 y j = 4. Sin embargo, los
ara
teres en las siguientes posi
iones no
oin
iden, y la eje
u
ion pro
ede
on string(17) = E. Por otro lado, la entrada en tabla 1 apare
e
omo sigue:
C 2
D 2
E 5
F 6
G 6
Por tanto, tabla1(E) = 5 signi
a que el apuntador i debe re
orrerse al
menos 5
ara
teres a la dere
ha antes de que un nuevo intento de
oin
iden
ia
tenga
ualquier esperanza de exito. Esto es equivalente a re
orrer el patron
uatro
ara
teres a la dere
ha, en donde las T
oin
iden de nuevo.
Sin embargo, tabla 2 se podra ver
omo sigue:
1 11
2 10
3 9
4 5
5 4
5 1
De nuevo, el apuntador i debe re
orrerse al menos 5
ara
teres a la
dere
ha antes de que sea razonable re
omenzar el pro
eso de
oin
iden
ia.
Como su
ede en este ejemplo, tabla1(E) = tabla2(4), lo que impli
a que
el apuntador i debe re
orrerse 5
ara
teres en
ualquier
aso. Sin embargo,
36
tratando otros patrones es posible notar mas
laramente la utilidad que
provee la independen
ia de las dos tablas.
El algoritmo Boyer-Moore ha sido exhaustivamente probado y rigurosa-
mente analizado. El resultado de las pruebas muestra que en promedio, este
algoritmo es \sublineal". Esto es, para en
ontrar un patron en la i-esima
posi
ion de una
adena requiere de menos de i + an
ho pasos
uando el
algoritmo esta ade
uadamente
odi
ado. En terminos del
omportamiento
en el peor
aso, el algoritmo aun se eje
uta en el orden de i + an
ho.
En
uanto a la utilidad de tabla 1 y tabla 2, es interesante que
on
alfabetos grandes y patrones peque~nos, tabla 1 resulta mas util. Sin embargo,
esta situa
ion se ha
e inversa para peque~nos alfabetos y grandes patrones.
37
38
Cap
tulo 6
1
Lo
ual sera de mu
ha utilidad para avisarles si uno de sus juegos resulta
an
elado
39
Jugador Edad
Entrenador Numero
telefonico
Equipo
En una base de datos rela
ional, es posible
rear una \
onsulta" (query)
que produz
a tal lista (y mu
ha mas informa
ion). Para espe
i
ar los rangos
de
onsultas posibles en una base de datos rela
ional, supongase que la
informa
ion de la liga de futbol se alama
ena en tres tablas separadas:
Tabla de Entrenadores
Equipo Entrenador Tel
efono
Demonios
Angeles 22 O
tubre 12:00 hrs. Estadio \Julian Gar
a"
Leones Tornados 12 Noviembre 16:00 hrs. Estadio Na
ional
... ... ... ... ...
40
Cada tabla representa una rela
ion que sera usada por la base de datos.
Mas aun,
ada rela
ion es realmente un
onjunto de tuplas; por ejemplo, la
primera rela
ion
onsiste en tros de datos
on la forma:
Entrenadores:(equipo,entrenador,telefono)
Jugadores:(jugador,edad,telefono,equipo)
Juegos:(lo
al,visitante,da,hora,lugar)
na tupla se repite. Las tablas en una base de datos rela
ional satisfa
en esta
deni
ion. Como resultado, la teora matemati
a se puede apli
ar; en par-
ti
ular, una teora llamada algebra rela
ional dene opera
iones sobre las
tablas.
Dos opera
iones del algebra rela
ional son sele
ion y proye
ion. La
opera
ion de sele
ion espe
i
a un sub
onjunto de renglones en una tabla
mediante una expresion booleana que involu
ra atributos. La opera
ion de
proye
ion espe
i
a un
onjunto de
olumnas en una tabla, mediante listar
los atributos involu
rados. Tambien elimina las dupli
a
iones que se tengan
de los renglones resultantes.
Para obtener una lista de telefonos de los Leones, estas dos opera
iones
son su
ientes. La sele
ion se denota por , y la proye
ion por :
41
\jugador" y \telefono", des
artando todos los otros atributos de la tupla no
espe
i
ados por . Por tanto, la siguiente lista apare
e:
Entrenadores ./ Jugadores
Las dos tablas tienen a equipo
omo un atributo
omun. Un registro
dentro de la nueva tabla (es de
ir, una rela
ion) que resulta de la opera
ion
de union podra ser:
42
Notese que la misma informa
ion es re
uperable en mu
has formas dife-
rentes de una base de datos rela
ional. Ademas, no siempre se obtienen los
datos a la misma velo
idad. Por ejemplo, la opera
ion union que se invo
a
en la
onsulta anterior es inherentemente ine
iente, ya que se apli
a a dos
tablas relativamente grandes. Una forma equivalente, pero mas e
iente,
sera la siguiente:
La union
on Jugadores de esta tupla, enton
es, espe
i
a todos los ju-
gadores del equipo de Leones. Una proye
ion nal elimina todos los valores
de los atributos ex
epto nombre y telefono de las tuplas resultantes.
Este ejemplo ilustra una
ara
tersti
a importante de la
lase de lengua-
jes de
onsulta de alto nivel que se usan en bases de datos rela
ionales, y
se basa en el algebra rela
ional. Tales lenguajes,
uando son
ompletamente
implementados, ha
en posible a los usuarios optimizar sus
onsultas. Y da-
do que hay mas de una manera de produ
ir
onsultas, tambien es posible
sele
ionar aquella que lo ha
e mas rapidamente.
>Como se implementan las bases de datos rela
ionales? Ya que solo se
mantienen tablas en la memoria de la
omputadora, todas las opera
iones
rela
ionales deben redu
irse a opera
iones sobre las tablas. El operador se-
le
ion es fa
ilmente implementado: simplemente revisa la tabla renglon por
renglon, probando una expresion booleana que dene los renglones a ser se-
le
ionados a partir de los valores de los atributos de los propios renglones.
La proye
ion tambien es bastante simple de programar, mediante ordenar
los renglones resultantes y eliminar los dupli
ados.
La opera
ion union se puede eje
utar mas rapidamente en tablas relati-
vamente grandes si las tablas primero se ordenan a partir de los valores del
atributo
omun. Cuando las tablas se ordenan, pueden mez
larse mediante
el atributo
omun, valor por valor.
Hay mu
has varia
iones para el operador union. En lugar de igualdad,
puede pedirse que los atributos
omunes satisfagan otras formas de
om-
43
para
ion,
omo por ejemplo, desigualdades. Por otro lado, existen otros op-
eradores ademas de la sele
ion, proye
ion y union, disponibles para las
onsultas. En la mayora de los sistemas de bases de datos rela
ionales, las
onsultas pueden formarse a partir de opera
iones
artesianas de produ
to,
union, interse
ion, y substra
ion de
onjuntos.
Hasta la de
ada de los 1970s, se introdujeron tres formas de sistemas de
bases de datos: jerarqui
a, distribuida y rela
ional. Ahora se re
ono
e que
las bases de datos rela
ionales son las que tienen la mas amplia variedad de
apli
a
iones y utilidad. Conse
uentemente, solo se men
ionan aqu tal tipo
de bases de datos.
Los lenguajes en que las
onsultas para bases de datos rela
ionales se
expresan se han desarrollado durante varias genera
iones de lenguajes, que
han ido sosti
andose y renandose. Las
onsultas que se han ilustrado hasta
ahora tienen una forma algebrai
a y pro
edural. Un lenguaje desarrollado
para expresar parti
ularmente
onsultas, llamado SQL, ha sido dise~nado
para ser usado en forma natural por el humano, y es no-pro
edural.
La
onsulta basi
a en SQL tiene la siguiente forma general:
SELECT A1 ; A2 ; :::; An
FROM R1 ; R2 ; :::R m
rela
iones. Los usuarios espe
i
an
uales rela
iones son requeridas para pro-
du
ir una respuesta a una
onsulta. Ciertamente, la lista R1 ; :::; R dene
m
44
Para el ejemplo donde se involu
ran una lista de jugadores y sus numeros
telefoni
os
on el equipo entrenado por M. Cervantes, se podra obtener la
onsulta de la siguiente forma:
SELECT jugador; telefono
FROM Jugadores; Entrenadores
WHERE Entrenadores:entrenador = M:Cervantes and
Entrenadores:equipo = Jugadores:equipo
Para aquellos programadores que
onsideran a SQL (o el algebra rela-
ional) redu
ido a estru
turas relativamente simples, se ofre
e el siguiente
ejemplo
on una
onsulta anidada:
SELECT jugador; telefono
FROM Jugadores
WHERE equipo In
(SELECT equipo
FROM Entrenadores
WHERE entrenador = M:Cervantes )
A
tualmente, SQL se ha
onvertido en el lenguaje de
onsultas estandar
para los sistemas de bases de datos rela
ionales de grandes
omputadoras.
45
46
Bibliograf
a
[1℄ A.V. Aho, J.E. Hop
roft, and J.D. Ullman. The Design and Analysis
of Computer Algorithms. Addison-Wesley, 1974.
[2℄ A.V. Aho, J.E. Hop
roft, and J.D. Ullman. Data Stru
tures and Algo-
rithms. Addison-Wesley, 1983.
[3℄ C.J. Date. An Introdu
tion to Database Systems. Addison-Wesley, 1980.
[4℄ D.E. Knuth. The Art of Computer Programming, vol. 1. Addison-
Wesley, 1967.
[5℄ D.E. Knuth. The Art of Computer Programming, vol. 3. Addison-
Wesley, 1967.
[6℄ R.W. Hamming. Coding and Information Theory. Prenti
e-Hall, 1980.
[7℄ T.A. Standish. Data Stru
tures and Te
hniques. Addison-Wesley, 1980.
[8℄ J.D. Ullman. Prin
iples of Database Systems. Computer S
ien
e Press,
1980.
[9℄ N. Wirth. Algoritmos y Estru
turas de Datos. Prenti
e-Hall, 1987.
47