Temas Sele 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 2. Ordenamiento Se uen ial Un Lmite Inferior de Velo idad 15 3. Alma enamiento por Hashing La Clave esta en la Dire ion 19 4. Compresi on de Texto Codi a ion Hu man 27 5. B usqueda de Cadenas El Algoritmo Boyer-Moore 33 6. Bases de Datos Rela ionales Consultas \Hagalo Usted Mismo" 39 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, Compresion 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 asignaturas que se imparten omo parte de la Li en iatura en Cien ias de la Computa ion, Fa ultad de Cien ias, UNAM. Jorge L. Ortega Arjona Febrero 2004 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 onebido en programa ion de sistemas. Consiste en un onjunto de nodos organizados 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 re ere 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 5 0 51 0 −80 17 0 0 0 0 42 6 0 0 9 0 0 Figura 1.1: Un arbol de busqueda on nueve nodos Un arbol puede dire tamente implementarse en memoria prin ipal mediante un programa a nivel ensamblador, o puede implementarse en forma de arreglo en un programa de alto nivel. La gura 1.2 ilustra ambas posibilidades para el arbol anterior. Elemento 101 102 103 104 −80 29 42 nil 105 106 107 37 5 17 102 nil nil nil 106 nil nil 101 1 2 2 1 2 37 3 4 3 5 4 29 4 11 4 nil nil 5 51 5 10 5 7 110 107 nil 6 109 51 1 derecha 3 108 110 izquierda 111 111 6 104 112 112 9 nil nil 6 7 6 7 8 42 8 9 9 6 8 7 9 8 9 nil 9 nil 10 −80 10 nil 10 nil 11 12 5 11 12 nil 11 12 13 13 17 13 nil 13 nil 14 14 Directamente en memoria 14 Como arreglo Figura 1.2: Dos formas de programar un arbol de busqueda 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 uentran 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 apuntadores. 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. Cuando los datos se alma enan en un arbol, fre uentemente es on el proposito de a eder a elementos parti ulares rapidamente. Por ejemplo, si los elementos que se alma enan tienen un orden en parti ular, omo puede ser < (menor que), enton es la busqueda por elementos puede ha erse en forma espe ialmente rapida si los nodos se ordenan de a uerdo a la siguiente regla: \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 re eren, 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 los elementos aqui son <x Todos los elementos aqui son >x Figura 1.3: Un arbol de busqueda puede organizarse mediante un orden Knuth Cook Shannon Church Chomsky Hoare Dijkstra Codd Michie McCarthy Kleene Von Neumann Turing Minsky Wiener Figura 1.4: Utilizando nombres omo datos alma enados en un arbol 10 pro edure 1. found 2. node 3. SEARCH false top repeat a) item(node) = name print si; node nil; found b ) if item(node) > name then node right(node); ) if item(node) < name then node left(node); if then 4. until 5. if not then true; node = nil; found 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 almaenado 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 ordenamientos, 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 programa 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 de ne 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 left(x) 6= nil then DEP T H (left(x)) 2. if 3. if right(x) 6= nil DEP T H (right(x)) then 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 apuntadores 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 inmediatamente 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 uentran 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 ontrado 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. 35 nil nil 35 42 nil 42 nil nil Figura 1.5: A~nadiendo un nodo Borrar un nodo resulta algo mas ompli ado. De nuevo, el algoritmo de busqueda puede ser utilizado para lo alizar un elemento, pero la dire ion del nodo que apunta ha ia el debe preservarse por el algoritmo de borrado. En la segunda parte de la gura 1.6 un algoritmo de borrado se muestra en opera ion. Inspe ionando la gura 1.6, es notorio que el nodo onteniendo el valor 42 se remueve del arbol onjuntamente on sus dos apuntadores. Conseuentemente, otros dos apuntadores (mar ados on un asteris o) deben ser re-arreglados. Esen ialmente, todo el subarbol dere ho dependiente del nodo onteniendo el valor 42 se mueve ha ia arriba un nivel, mientras que todo el subarbol izquierdo se ha deslizado ha ia abajo dos niveles hasta el primer nodo disponible en la posi ion mas a la izquierda del primer subarbol. La palabra \disponible" aqu se re ere a que el apuntador izquierdo del nodo es nulo y es posible olo ar el segundo subarbol ah. 13 58 58 * Borrar 42 47 35 30 nil 47 36 46 46 nil 54 54 35 nil nil * 30 Figura 1.6: Borrando un nodo 14 nil 36 nil nil Cap tulo 2 Ordenamiento Se uen ial Un Lmite Inferior de Velo idad Ordenar es una tarea omputa ional on enormes impli a iones en el omer io y la industria. Mu has de las omputadoras de uso omer ial e industrial pasan una fra ion signi ativa de su tiempo ordenando listas. De este modo, resulta muy pra ti o preguntarse: >Dada una lista de n el- ementos, ual es la mnima antidad de tiempo que puede llevarle a una omputadora ordenarla? Un algoritmo ono ido omo mez la-ordenamiento (merge-sort) puede lograr esta tarea en un tiempo O(n log n). Partiendo de esto, y onsiderando una n lo su ientemente grande, es posible proponer una onstante positiva tal que el numero de pasos que requiere este algoritmo para ordenar n elementos nun a es mayor que n log n. Esta antidad tiene tambien el orden de magnitud orre to para ser un lmite inferior de el numero de pasos requerido, al menos uando la pregunta anterior se reformula ade uadamente. Si la palabra \ordenarla" se restringe a signi ar que la omputadora solo ompara dos elementos de la lista de n elementos en un momento dado, enton es este lmite inferior no es dif il de demostrar. Sea la lista a ser ordenada representada omo: L = x1 ; x2 ; :::; x 15 n Considerese que la omputadora omienza omparando una x on una x , y ha e una de dos osas omo resultado de la ompara ion ( gura 2.1). i j L xi< xj xi> xj L0 L1 Figura 2.1: De ision ini ial de un algoritmo de ordenamiento Lo que se onsidera ha e la omputadora es alterar la lista L para onvertirla en L0 o L1 , dependiendo de la ompara ion. Por ejemplo, a partir de L la omputadora puede inter ambiar x y x para rear L0 , o dejar x y x en su posi ion original para rear L1 . De modo similar, la omputadora puede ontinuar trabajando sobre L0 o L1 , apli ando pre isamente la misma observa ion. Continuando on este pro eso, resulta un arbol uyos nodos mas bajos orresponden todos a una version ordenada de la lista ini ial. i j i j Por ejemplo si L tiene solo tres elementos, la gura 2.2 muestra omo el \arbol de de ision" podra ser. Para entender la signi an ia de los nodos terminales, es util imaginarse que ha e el algoritmo de ordenamiento on todas las n! posibles versiones de listas de un onjunto de n elementos. Dadas dos de tales listas, supongase que el algoritmo toma la misma rama para ambas listas en ada nivel del arbol, de tal modo que se llega al mismo nodo terminal en ada aso. Cada vez que el algoritmo de ordenamiento toma una de ision omo resultado de una ompara ion, se realiza una permuta ion de la version a tual de la lista de entrada L. Mas aun, se realiza esta permuta ion en ualquier lista que se tenga a tualmente. Por lo tanto, si dos versiones distintas de la lista de un mismo onjunto terminan en el mismo nodo terminal, enton es ambas listas han permutado de forma identi a. Pero esto signi a que a lo mas, una de esta listas ha sido ordenada orre tamente. La uni a on lusion que surge de todo esto es que si el algoritmo de ordenamiento se realiza orre tamente, el arbol de de ision orrespondiente debe tener al menos n! nodos terminales. 16 L xi< xj xi> xj L0 L1 L 01 L 00 L 000 L 001 L 010 L 10 L 11 L 011 Figura 2.2: Un arbol de de ision para una lista de tres elementos Ahora bien, un arbol binario on m nodos terminales debe tener una profundidad de al menos dlog me, y la profundidad (D) del arbol de de ision debe satisfa er que: D = dlog me = log n(n 1)(n n > log( ) 2 2 n n = log 2 2 = O(n log n) 2):::(n=2) n= Esto es tan solo otra forma de de ir que ualquier ompara ion para ordenamiento 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 algoritmo 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 Alma enamiento por Hashing La Clave esta en la Dire ion Hay prin ipalmente tres te ni as de alma enar y re obrar registros en ar hivos grandes. La mas simple involu ra una busqueda se uen ial a traves de los n registros, y requiere O(n) pasos para re obrar un registro parti ular. Si los n registros estan espe ialmente ordenados o alma enados en un arbol, enton es un registro puede re obrarse en O(log n) pasos (vesae el aptulo 1). Finalmente, si ierta informa ion de ada registro se utiliza para generar una dire ion de memoria, enton es un registro puede re obrarse promedio en O(1) pasos. Esta ultima te ni a, que es el tema de este aptulo, se le ono e omo hashing. Considerese un registro \tpi o" en un ar hivo, onsistente de una llave y un dato, omo se muestra en el siguiente ejemplo: 3782-A:670-15 DURALL RADIAL, 87.50, STOCK 24 Aqu, la llave es 3782-A, y el dato onsiste de un tama~no y mar a de llanta seguido por su pre io por unidad y numero de elementos en alma enamiento. Respe to a alma enar, bus ar y re obrar registros de ar hivos, es su iente espe i ar omo manipular la llave; el dato se \a~nade" dada la programa ion apropiada. Transformar una llave (o hashing), en un sentido, es ortarla y usar solo parte de ella. La parte usada dire tamente genera una dire ion de memoria, 19 Llave TO IT IS AS AT IF OF AM BE DO AN GO SO ASCII 124117 111124 111123 101123 101124 111106 117106 101115 102105 104117 101116 107117 123117 Direccion 17 24 23 23 24 06 06 15 05 17 16 17 17 05 06 07 10 11 14 15 16 17 23 24 25 BE IF, OF AM AN TO, DO, GO AS, IS IT, AT Figura 3.1: Transforma ion de llaves en dgitos 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 omo dire ion h(k), en la ual ada palabra puede ser alma enada. De a uerdo 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 memoria, 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 trabaje orre tamente, las olisiones deben resolverse. Uno podra pensar que las olisiones son relativamente raras. Ciertamente, el gran numero de olisiones 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 distribuidas aleatoriamente, mu ho antes de que el espa io de memoria reservado 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 olision 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, llamados 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 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 k Con este mismo valor de M se obtienen muy diferentes resultados para las mismas 13 palabras de dos letras. Las dire iones de memoria en la gura 3.2 se expresan en nota ion de imal. Con la primera fun ion hash se sufran uatro olisiones ( ontando TO, DO y GO omo dos olisiones), pero on la nueva fun ion hash este numero baja a tan solo dos. 21 h = dos ultimos digitos 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 h = modulo 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 BE IF, OF AM AN TO, DO, GO AS, IS IF SO DO BE AM TO AN AS AT IS, OF IT 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: x; 2x; 3x; :::; nx y tomando sus partes fra ionales hasta n: x1 ; x2 ; x3 ; :::; x n los numero resultantes son todos diferentes y dividen al intervalo unitario en n + 1 subintervalos. Cada uno de estos subintervalos tiene al menos uno de tres posibles longitudes, y si se a~nade un nuevo punto x +1 , este ae en un subintervalo del tipo mas grande. Su ede que si x se es oge a ser la \media aurea" ( on el valor aproximadamente de 0.61803399), enton es las tres longitudes sufren la menor varia ion, y todas estan mas er anas que las produ idas por ualquier otro numero irra ional. Estas observa iones sugieren una fun ion hash h produ ida de a uerdo al siguiente algoritmo. 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 retoman las te ni as para manejo de olisiones. La primera involu ra la onstru ion de una adena de apuntadores desde ada dire ion en la ual o urra una olision, y la segunda se re ere 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 16 17 AM AN TO DO 23 AS IS GO Figura 3.3: En adenamiento ( haining) Las llaves TO, DO y GO se aso ian todas on la dire ion 17, en ese orden. Las llaves AS e IS se aso ian on la dire ion 23. Si una por ion 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 \relativamente 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 3. if ontenido(i) < k then 4. i 5. i goto ontenido(i) k; exit inter ambia valores de ontenido(i) y k p mod M 2 Es interesante notar que si esta polti a de inser ion se sigue desde el ini io de la onstru ion de la tabla, produ ira la misma tabla que se ha supuesto. Es de ir, este algoritmo tanto introdu e omo mantiene la misma tabla que se obtuvo al insertar primero la llave mas grande, despues la siguiente mas grande, y as su esivamente. Claramente, se ha e mas on una tabla hash que meramente ha er inser iones. Mas fre uentemente, se bus a en la tabla para ver si una llave se en uentra ah. O asionalmente, tambien se borran elementos de la tabla. 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 funion 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 O M 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 log O 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 lineal 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 Hu man 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 adena 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 desubrir 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 tradiional 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 enamiento 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 alma enamiento es importante, onviene omprimir el texto de alguna forma antes de alma enarlo. La odi a ion Hu man 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 que el i-esimo smbolo que apare e en un punto aleatoriamente sele ionado de la adena es p . Cada smbolo s se substituye por una adena binaria de n i i 27 longitud l , de tal modo que la longitud promedio que representa un smbolo esta dado por i L= X n pl i i =1 Suponiendo que p1 > p2 > ::: > p , se nota que L se minimiza solo si l1 < l2 ::: < l . Esta observa ion forma la base para una te ni a que sele iona 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 probabilidades 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. i n n Un arbol de Hu man para estos smbolos y sus probabilidades es una representa 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. 0 1.0 1 0.57 0.43 0.32 0.25 0 0.21 1 0.22 0.14 0.13 0 C 1 0 B A 0.18 1 0 1 0 0.09 1 D E 0.07 0.06 F G Figura 4.1: Un arbol de Hu man 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 Hu man 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 Hu man 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 Hu man. Ini ialmente, subarboles no ontiene mas que subarboles de un solo nodo, uno por ada uno de los n smbolos s del alfabeto que se odi a. Hay, por lo tanto, un arreglo orrespondiente de probabilidades \prob", que por ada nodo raz en ada subarbol en onstru ion, ontiene la probabilidad aso iada on ese nodo. Dos arreglos de apuntadores \ligaizquierda" y \ligadere ha" ontienen la estru tura del arbol de Hu man, y uando el algoritmo se termina, debe haber 2n 1 nodos, de los uales n son nodos y el resto apuntadores. i A la i-esima itera ion del algoritmo, los primeros n i+1 subarboles se reordenan, de tal modo que sus probabilidades aso iadas formen una se uen ia de re iente. Los dgitos binarios apropiados se a~naden a los nodos terminales de los ultimos dos subarboles en se uen ia reordenada, y estos se mez lan para formar un nuevo subarbol que se olo a en el arreglo subarboles. for i 1 to n 1 1. reordena subarboles desde 1 a n i+1 2. a~nade 0 a la terminal del subarbol n i 3. a~nade 1 a la terminal del subarbol n i+1 4. prob(n + i) prob(subarboles(n 5. ligadere ha(n + i) 6. ligaizquierda(n + i) i+1 n n i 29 i)) + prob(subarboles(n i + 1)) 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 algoritmo 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 Hu man. 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 0.25 0.21 0.18 0.14 0.09 0.07 0.06 A B C D E F G Figura 4.2: Siete subarboles de un solo nodo Despues de que un 0 y un 1 se a~naden a las terminales de los subarboles 6 y 7, se rea un nuevo subarbol on ndi e n + i = 8. Este se liga a la dere ha on el subarbol 7 y a la izquierda on el subarbol 6. A la siguiente itera ion del algoritmo, los subarboles se rearreglan en orden de re iente de probabilidad ( gura 4.3). A la siguiente itera ion, un nuevo subarbol se forma de los dos anteriores, y el numero de subarboles se redu e a 5 ( gura 4.4). Despues de n = 7 itera iones, solo queda un subarbol, el ual es el arbol de Hu man. A ada paso, se asignan 0 o 1 omo dgitos del odigo a la liga izquierda y dere ha respe tivamente, en forma su esiva a los subarboles on probabilidades menores. Esto asegura que las palabras mas largas de la odi a ion tiendan a ser menos fre uentemente utilizadas. 30 8 1 2 3 4 0.25 0.21 0.18 0.14 A B C D 5 0.13 0.09 E 6 7 0.07 0.06 F G Figura 4.3: Subarboles despues de la primera itera ion 1 9 2 3 0.25 0.22 0.21 0.18 0.14 B C D A 8 4 5 0.13 0.09 E 6 7 0.07 0.06 F G Figura 4.4: Subarboles despues de la segunda itera ion 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-esimo smbolo o urre. La probabilidad p de la pieza de texto es simplemente n =l, donde l es la longitud de la pieza de texto. Apli ar el algoritmo resulta en la asigna ion de un odigo a ada smbolo, as omo en la onstru ion del arbol de Hu man. El texto se re orre, y en una sola pasada, se onvierte en una larga adena binaria de odigos on atenados. En seguida, esta adena se divide en bloques de longitud m, que se re ere al tama~no de palabra de la omputadora parti ular para la que el algoritmo se implementa. Cada bloque, enton es, se onvierte en un solo entero, y se alma ena en la memoria de esta forma. El arbol de Hu man, por su parte, se alma ena en otro sitio de la memoria. i i i Para re uperar el texto que ha sido as alma enado, se invo a el proedimiento inverso, y el arbol de Hu man se utiliza en el ultimo paso del pro esamiento para los smbolos de la adena binaria. Cada smbolo orresponde a una sola sub- adena, determinada por una sola busqueda desde la raz hasta el nodo terminal pertinente del arbol. Para evitar onstruir un arbol ada vez que algun texto se alma ena, es posible onstruir un arbol mas general de una vez por todas, que re eje las probabilidades de ada smbolo en forma mas generi a. Por ejemplo, la ora ion promedio en Ingles (ignorando la puntua ion) ontiene los smbolos de A a Z y un espa io en blan o ( ) en una lo alidad aleatoria on las siguientes probabilidades A D G J M P S V Y 0.065 B 0.032 E 0.015 H 0.001 K 0.032 N 0.015 Q 0.056 T 0.008 W 0.017 Z 0.013 C 0.104 F 0.047 I 0.005 L 0.058 O 0.001 R 0.081 U 0.018 X 0.001 32 0.022 0.021 0.058 0.032 0.064 0.049 0.023 0.001 0.172 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 de nido, 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 Ya que O y L no oin iden, no es ne esario en ontinuar las omparaiones, por lo que se re orre el patron en una unidad a la dere ha, y se intenta de nuevo: 33 LAS MINAS ORO De nuevo, los ara teres omparados, A y O, no oin iden. Re orriendo de esta forma, eventualmente la adena se a aba, y se on luye que no hay ORO en LAS MINAS. Varios editores de texto ha en busquedas de adenas de esta forma. Un algoritmo des ubierto por R.S. Boyer y J.S. Moore en 1977 mejoran este metodo mediante veri ar la oin iden ia de los ara teres de dere ha a izquierda en lugar de izquierda a dere ha. Si la se ion de la adena no oin ide on el patron, se puede re orrer el patron por toda su longitud. De este modo, se puede ir de: LAS MINAS ORO inmediatamente a: LAS MINAS ORO A primera vista, pare e ser un dramati o in remento en la e ien ia, espe ialmente si en el siguiente paso el patron puede saltar otros tres ara teres por la misma razon. Desafortunadamente, este in remento en la e ien ia es meramente ilusorio, ya que para veri ar si A no esta en ORO requiere tantas ompara iones omo el re orrer ORO ha ia adelante un espa io ada vez despues de una ompara ion de la primera O on ada uno de los tres ara teres en la adena. Sin embargo, si se onstruye una tabla (llamada tabla 1) la ual por ada letra del alfabeto ontiene su posi ion mas a la dere ha en el patron ORO, enton es solo es ne esario bus ar A en la tabla (lo que se puede ha er muy rapidamente) y notar que su entrada orrespondiente es nula (no existe A en ORO, lo que se simboliza por ;). Uno puede enton es re orrer el patron a la dere ha por tantos ara teres omo los haya en el. 34 Ademas de la te ni a de re orrer basado en tabla 1, el algoritmo BoyerMoore 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 En el ejemplo anterior, el algoritmo Boyer-Moore podra des ubrir rapidamente que B no esta en TRASTRA, y omo resultado, re orrere el patron por otros siete ara teres. El algoritmo Boyer-Moore es orto y dire to. Ademas de tabla 1, utiliza otra tabla, tabla 2, que por ada por ion terminal del patron indi a su re urren ia mas a la dere ha y no terminal. Esta tabla puede a ederse tambien rapidamente. ST RING 1. i 2. largo while haya adena a ) j an ho b ) if j = 0 then imprime `Coin iden ia en' i + 1 ) if string(i) = pattern(j ) then 35 j j 1, i i 1, goto 2.b 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 rigurosamente 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 Bases de Datos Rela ionales Consultas \Hagalo Usted Mismo" En mu has apli a iones que involu ran el alma enamiento de informaion en ar hivos de omputadora, normalmente se dan algunas onsultas que un usuario del ar hivo desea ha er. Por ejemplo, el ar hivo podra ser un dire torio telefoni o. Para en ontrar el numero telefoni o de alguien, el usuario del sistema meramente es ribe el nombre de la persona en el te lado, y momentos mas tarde el orrespondiente numero telefoni o apare e en pantalla. La omputadora, usando el nombre omo lave o llave, ha bus ado a traves del ar hivo por el nombre, re obrado el numero telefoni o alma enado, y lo despliega en pantalla. Sin embargo, algunas formas de alma enar datos son mas omplejas que otras. Involu ran mu has lases de informa ion on rela iones espe iales entre ellas. Considerese, por ejemplo, los datos aso iados on una liga de futbol. Existen varias rela iones entre jugadores y equipos, entre jugadores y numeros telefoni os, entre equipos y entrenadores, et . (Figura 6.1). Para asos omo la liga de futbol, se utilizan bases de datos rela ionales, mediante las uales es posible produ ir informa ion que no esta alma enada en forma inmediatamente a esible. Puede haber, por ejemplo, una lista de jugadores, sus equipos, y hasta de sus numeros telefoni os, pero no haber una lista de numeros telefoni os de todos los jugadores de un equipo en parti ular 1 . 1 Lo ual sera de mu ha utilidad para avisarles si uno de sus juegos resulta an elado 39 Jugador Edad Numero telefonico Entrenador Equipo Figura 6.1: Rela iones de datos en una liga de futbol 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 Leones M. Cervantes 5535 6798 Demonios G. Gonzalez 5671 2033 ... ... ... Tabla de Jugadores Jugador A. Johns L. E heverra K. Or ... Edad 22 33 25 ... Tel efono 5432 6592 5574 6378 5522 1362 ... Equipo Leones Angeles Leones ... Tabla de En uentros Lo al Demonios Leones ... Visitante Angeles Tornados ... D a Hora Lugar 22 O tubre 12:00 hrs. Estadio \Julian Gar a" 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) Las otras rela iones onsisten en tuplas de 4 y 5 elementos, respe tivamente: Jugadores:(jugador,edad,telefono,equipo) Juegos:(lo al,visitante,da,hora,lugar) Cada olumna en una tabla (rela ion) representa un atributo. Algunos atributos fun ionan omo llaves uando se bus a en las tablas. En las tres tablas anteriores, algunos atributos llave podran ser equipo, jugador, lo al y visitante. Hablando matemati amente, una rela ion es un onjunto de n-tuplas (x1 ; x2 ; :::; x ) donde ada elemento x se obtiene de un onjunto X , y ninguna tupla se repite. Las tablas en una base de datos rela ional satisfa en esta de ni ion. Como resultado, la teora matemati a se puede apli ar; en parti ular, una teora llamada algebra rela ional de ne opera iones sobre las tablas. n i i 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 : jugadorytelef ono ( = equipo Leones (Jugadores)) Analizando de adentro ha ia afuera, la opera ion de sele ion espe i a todos los renglones de la tabla de jugadores en el ual el nombre del equipo es Leones. En seguida, de entre estos, la proye ion espe i a los atributos 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: A. Johns 5432 6592 K. Or 5522 1362 ... ... Otra rela ion importante es llamada la \union natural" (natural join), y se denota on el smbolo ./. Opera sobre dos tablas que tienen uno o mas atributos omunes. Para ada par de tuplas (una de la primera tabla y una de la segunda), produ e una nueva tupla si los atributos omunes tienen valores identi os para tal par. Supongase por ejemplo que se le pide a la base de datos rela ional la union de las tablas Entrenadores y Jugadores: 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: Leones, M. Cervantes, 5535 6798, A. Johns, 22, 5432 65 92 El atributo equipo, que tiene un valor omun de Leones para un renglon de Entrenadores y un renglon de Jugadores, resulta en un renglon nuevo en una nueva tabla. La opera ion union fun iona de forma ombinada on otras opera iones para produ ir onsultas de datos mas versatiles. Supongase que un usuario de la base de datos quisiera una lista telefoni a del equipo entrenado por M. Cervantes. La siguiente se uen ia de opera iones produ ira esa lista: jugadorytelef ono ( entrenador = M:C ervantes (Entrenadores ./ Jugadores)) Dada la tabla Entrenadorer ./ Jugadores, la sele ion de M. Cervantes omo entrenador produ ira tuplas de 6 elementos onteniendo el atributo entrenador on valor de M. Cervantes. Es laro, el valor de Leones sera redundante en este aso. Ya que se requieren solo los nombres y numeros telefoni os de los jugadores entrenados por M. Cervantes, la proye ion se realiza onsiderando solo estos datos. 42 Notese que la misma informa ion es re uperable en mu has formas diferentes 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: jugadorytelef ono (Jugadores ./ ( entrenador = M:C ervantes (Entrenadores))) La sele ion on entrenador = M. Cervantes, uando se apli a a Entrenadores, produ e una sola tupla de tres elementos: Leones, M. Cervantes, 5535 6798 La union on Jugadores de esta tupla, enton es, espe i a todos los jugadores 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 lenguajes 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 dado 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 sele ion es fa ilmente implementado: simplemente revisa la tabla renglon por renglon, probando una expresion booleana que de ne los renglones a ser sele 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 relativamente 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 om43 para ion, omo por ejemplo, desigualdades. Por otro lado, existen otros operadores 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 so sti andose y re nandose. 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 ; :::; A FROM R1 ; R2 ; :::R WHERE Expresion Booleana n m Tal onsulta impli a no solo la opera ion sele ion, sino tambien la proye ion, produ to artesiano, y union natural. Los argumentos A espe i an uales atributos son parte de la onsulta, y los argumentos R son rela iones. Los usuarios espe i an uales rela iones son requeridas para produ ir una respuesta a una onsulta. Ciertamente, la lista R1 ; :::; R de ne un produ to artesiano de todas las rela iones (tablas) existentes. La expresion booleana que apare e en la por ion \WHERE" de la onsulta in luye una variedad de operadores, omo por ejemplo, sele iones y uniones. i j m Ahora es posible mostrar omo algunas de las onsultas anteriores, expresadas usando algebra rela ional, pueden re-expresarse usando SQL. Para produ ir la lista de los jugadores de los Leones y sus numeros de telefono, es posible es ribir: SELECT jugador; telefono FROM Jugadores WHERE equipo = Leones 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 relaional) 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 Algorithms. 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. AddisonWesley, 1967. [5℄ D.E. Knuth. The Art of Computer Programming, vol. 3. AddisonWesley, 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