4. TABLAS Las tablas son agregados de componentes individuales llamados registros. Los registros son una entidad con una colección de datos asociados con nombres para establecer el tipo de información. Los registros en una tabla generalmente tienen asociada una clave y cada registro contiene información asociada con su clave. Así, puede decirse que los registros serían (k 1,I 1 ),(k 2,I 2 ),(k 3,I 3 ),...(k j,i j ), donde I i es la información asociada con la clave k i, para i = 1,2,...j Una utilización de las tablas, es aquella en la cual la información que contiene se refiere a direcciones de cada uno de los nodos de una lista encadenada. Figura 4.1 Utilización de una tabla para una Lista encadenada. Hay muchas maneras para representar la información en una tabla, T, así que operaciones tales como: búsqueda, actualización, inserción, borrado y reportes pueden ser hechos eficiente y convenientemente. Figura 4.2 Ejemplo de una Tabla con varios campos. Muchas veces, la clave del registro esta dada por la posición que ocupe en la tabla. El proceso de buscar en una tabla consiste de un método sistemático para localizar la clave deseada, k r, de la cual deseamos conocer su información asociada. A menudo una tabla es creada en memoria con límites definidos. Una tabla esta ordenada, si las claves de información de los registros están ordenadas: k j < k j+1 (j=1,2,...) Búsqueda secuencial en tablas. BUSSEC() J=1
clave <- dato MQ (~eof) lea registro SI clave = k j TH info <- I j ÉXITO SN j <- j+1 ERROR "la clave a buscar no existe" FBUSSEC() 64 Búsqueda binaria en tabla Sea T una tabla de n entradas, ordenada por un campo que es clave para la información. Se busca en la tabla un campo clave, si está o no. a<= t 1 <t 2 <...<t n <=b. a y b son las fronteras izquierda y derecha (menor y mayor) del intervalo de valores de la clave. BUSBIN() unf <-a sup <- b sw <- 0 clavek <- 1 MQ sw = 0 med = (inf+sup)/2 SI med = clave TH sw =1 SN SI dato < med TH sup = med SI sw = 1 TH "la clave hallada es:", med SN "la clave buscada no esta" FBUSBIN() Búsqueda Multiplicativa BUSMULT() dato <- clave i <- 1 sw <- 0 MQ i<= N & sw = 0 SI dato>t1 TH i <- i*2 SN SI dato<ti TH i <- (i+2)/2 SN SI dato<>ti TH "no existe la clave" sw=1 SN infor <- ti Luis Carlos Torres Soler
Estructuras de Datos FBUSMULT() sw = 1 65 El almacenamiento secuencial y/o ordenado, en general es muy deficiente, porque en muchos casos debe consultarse la totalidad de la tabla, y cuando la tabla es muy grande, el tiempo de proceso es demasiado. El almacenamiento se realiza al asignarle a cada clave del registro una posición especifica en la tabla, para almacenar cada valor clave en una única posición se requiere que la tabla sea tan grande como el mismo rango de las claves. Pero en general, el número total de claves no es muy amplio, entonces la posición se halla por transformaciones de las claves a una posición en la tabla, técnica que se llama hash. Se dice que la posición que ocupa la clave en la tabla es el Hash. Hashing Dada una tabla de tamaño N, y un conjunto S ( S<=N) de claves con un rango M (N << M); la posición de una clave particular se determina transformando la clave en un entero que se halle entre 1 y N. El proceso de transformación se llama Hashing y una transformación particular se llama hash. El hash de una clave es la posición que dicha clave va a ocupar en la tabla. Funciones. La organización de datos en tablas busca una correspondencia entre la clave del registro y la dirección física donde este se almacena. En este caso, la función hashing de la clave, define la posición del registro en la tabla. La función hashing es una transformación que sirve como base para obtener una dirección. Hay varias técnicas para la determinación de dichas direcciones, las más comunes son: Congruencia el tamaño de la tabla. En este caso, cada clave se divide por el tamaño de la tabla, el residuo se toma como la posición. H(Clave) Clave mod N 1 Siendo N el tamaño de la tabla. Ejemplo. NOTA. Es aconsejable que el tamaño de la tabla, N, sea un número primo. 1 Según la numeración que tenga la tabla, en algunos casos es necesario al valor dado en la formula, o en otras formulas posteriores, sumarle 1. Facultad de Ingeniería
66 De acuerdo al tamaño de la tabla, algunas veces es necesario adecuar un multiplicador para estandarizar al tamaño de la misma tabla. Dígitos Centrales. Consiste en elevar al cuadrado la clave y tomar los dígitos centrales como dirección. El número de dígitos a tomar queda determinado por el tamaño de la tabla. Sea K la clave a insertar o buscar, la función hashing queda definida por la siguiente formula: H(K) = digitos_centrales(k 2 ) Ejemplo. Clave Cuadrado centro hash 13452 180 95 6304 95 95 93624 8765 45 3376 45 45 76171 5802 02 1241 02 02 48315 2334 33 9225 33 33 01372 1 88 2384 88 88 Nuevamente, cuando el tamaño de la tabla es menor que el rango a darse con los dígitos centrales tomados, se considera el hash con respecto al módulo de la tabla o a un multiplicador adecuado. es decir, H(K) [digitos_centrales(k 2 )]mod N Sea N=17, de los datos anteriores se tiene: Clave Cuadrado centro hash 13452 180 95 6304 95 10 93624 8765 45 3376 45 11 76171 5802 02 1241 02 02 48315 2334 33 9225 33 16 01372 1 88 2384 88 03 Sea tamaño de la tabla M=500, multiplicador = 500/1000, siendo 999 el máximo cuadrado central a hallar en tres cifras. Si clave = 675, 675 2 = 45 562 5, centro = 562, 562*.5=281, posición de la clave en la tabla es la 281. Si clave = 873, 873 2 = 76 212 9, centro = 212, 212*.5=106, posición en la tabla de la clave es 106. Luis Carlos Torres Soler
Estructuras de Datos Truncamiento. Consiste en tomar algunos dígitos de la clave, operar con ellos y luego hallar la posición respectiva. Sea K la clave, K esta formada por los dígitos d 1,d 2,d 3,...,d n, la función hashing queda definida por: H(K) {operar[elegir_digitos(d 1,d 2,d 3,...,d n )]} mod N. La elección de los dígitos es arbitraria, pero uniforme en el mismo proceso. Defazamiento. Si la clave tiene un gran número de caracteres y puede dividirse en tres partes iguales (algunas veces se consideran partes de distinto tamaño), como por ejemplo 375962143 o 453620170, esta técnica consiste es defazar cada parte de los extremos de la clave sobre el centro y sumarlos entre si (en si realizar alguna operación con las partes) 375 962 143 453 620 170 3759 2143 962 620 3759 375 453 2143 143 170 Se suman las partes y se halla el módulo con respecto al tamaño de la tabla, o se utiliza el multiplicador adecuado. 962 + 375 + 143 = 1480, 620 + 453 + 170 = 1243, 3759 + 2143 = 5902 Si N=1000, por módulo le corresponde posición 480, 243 o 902 Si N=500, por multiplicador.5, les corresponde 1480*.5=740 *.5=370 1243*.5=621 *.5=310 5942*.5=2971 *.5=1485 *.5=742 *.5=371 Doblaje. Al igual que el defazamiento, debe la clave se divide en tres partes, y en esta técnica se hace un doblaje de los extremos sobre el centro, como lo dice el nombre y se suman. Ejemplo. 375 962 143 453 620 170 3759 2143 962 620 3759 573 354 3412 341 071 962 + 573 + 341 = 1876, 620 + 354 + 071 = 1045, Facultad de Ingeniería 67
3759 + 3412 = 7171 68 Si N=1000, por módulo le corresponde posición 876, 45 o 171 Si N=500, por multiplicador.5, les corresponde 1876*.5=938 *.5=469 1045*.5=522 *.5=261 7171*.5=3585 *.5=1792 *.5=896 *.5=448 En algunos casos, en un conjunto de claves, se puede llegar a dar que para por lo menos dos claves se tenga el mismo hash, entonces ocurre una colisión, el proceso de insertar la segunda (tercera,...) clave con el mismo hash, requiere la búsqueda de una nueva posición en la tabla, a este proceso se le llama rehashing. El rehash, se calcula en general por la formula polinomial 2 3 n H(k) = [ a0+a1 H(k)+ a2 H (k)+a3 h (k)+...+an H (k)] mod(n) Los coeficientes del polinomio, deben ser tales que permitan hallar todas las N posiciones de la tabla antes de tener un ciclo. Ejemplo. Sea que se tiene la siguiente tabla para asignación de valores a caracteres alfabéticos: a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 El hash se hallara al sumar los dígitos correspondientes, hallando congruencia con respecto al tamaño de la tabla que es de N=17 Clave método hash Diana (4+9+1+5+1)mod 17 3 Audrey (1+3+4+1+5+7)mod 17 4 Claudia (3+7+1+3+4+9+1)mod 17 11 Silena (1+9+7+5+5+1)mod 17 11 Patricia (3+1+2+1+9+3+9+1)mod 17 12 Paola (3+1+4+7+1)mod 17 16 Magda (6+1+7+4+1)mod 17 2 Rocío (1+4+3+9+4)mod 17 4 Martha (6+1+1+2+8+1)mod 17 2 Helena (8+5+7+5+5+1)mod 17 14 Elvira (5+7+4+9+1+1)mod 17 10 Teresa (2+5+1+5+1+1)mod 17 15 Ana (1+5+1)mod 17 7 Gina (7+9+5+1)mod 17 5 Shirley (1+8+9+1+7+5+7)mod 17 4 Myriam (6+7+1+9+1+6)mod 17 13 Luis Carlos Torres Soler
Estructuras de Datos Cristi (3+1+9+1+2+9)mod 17 8 69 Para el rehash se va a tomar la función H(k)~=[5+H(K)]mod 17. Condición principal es que debe primar el hash ante el rehashing. Búsqueda utilizando HASH BUSCAR(clave) sw=0 i <-- HASH(clave) SI uso(i) = 0 TH ESCRIBIR(no se halla la clave) MQ sw=0 SI info(i) = clave TH sw=1 SN SI link(i) = -1 TH sw=1 ESCRIBIR(no se halla la clave) SN i <-- link(i) FINBUSCAR() INSERTAR(clave) sw=0 i <-- HASH(clave) SI uso(i) = 0 TH info(i) <-- clave uso(i) <-- 1 link(i) <-- -1 EXITO SN MQ sw=0 j = REHASH(i) SI uso(j) = 0 TH link(i) <-- j info(j) <-- clave uso(j) <-- 1 link(j) <-- -1 sw=1 FININSERTAR() BORRADO(clave) sw=0 i <-- HASH(clave) Facultad de Ingeniería
SI uso(i) = 0 TH ESCRIBIR(no se halla la clave) SN SI info(i) = clave TH SI link(i) = -1 TH uso(i) <--0, EXITO SN info(i) <-- info(link(i)) link(i) <-- link(link(i)) uso(i) <-- 1 uso(link(i)) <-- 0 link(link(i)) <-- -1 FINBORRADO() 70 Ejercicios Sea que se tienen las siguientes claves e información 2 relacionada, y el hash 3 establecido, para ser involucradas en una tabla de tamaño M=13. En caso de colisión, el rehashing a utilizar 4 es: h= 2*h + 7. Clave: mary Luis olga tere josé jair pati tuto gray salo cris Info: past Pust pert mirt casi toto lima buey tria gris fuer Hash: 4 6 8 4 2 11 3 0 7 10 1 Cómo queda la tabla al involucrar esta información? Cuál es el algoritmo para asignación de hash a una clave alfanumérica? Al tener la siguiente expresión aritmética: x=y1 * c3 - ux / fw - y2 + ru / kc * rt - fw + c3 / ux + y2 Escriba claramente la lectura en preorden del árbol (generado por Usted) que la representa. Cómo se representa en una tabla el árbol anterior? Explique en forma concreta. 2 Recuerde que la información son campos adicionales en la tabla. 3 Calculado a partir de algún algoritmo especificado. 4 La falta de viabilidad para aplicarlo debe ser explicada clara y correctamente. Luis Carlos Torres Soler