Ejercicios de tablas hash, EDA, Universidad de Zaragoza Ejercicios sobre tablas hash Estructuras de Datos y algoritmos, Ingeniería Informática Universidad de Zaragoza Basados en los de [Weiss 93]: 1. Dada la entrada {4371, 1323, 6173, 4199, 4344, 9679, 1989} y una función hash h(x)=x mod 10, dar la correspondiente a) tabla hash por encadenamiento b) tabla hash por recolocación lineal (a=1) c) tabla hash por recolocación cuadrática d) tabla hash con recolocación doble vía la función h2(x)=7-(x mod 7). 2. Dar el resultado de regenerar las tablas por recolocación del ejercicio 1. 3. Un gran número de borrados en una tabla hash por recolocación puede hacer que esté bastante vacía, podemos regenerarla a una tabla de tamaño la mitad. Implementar las tablas hash por recolocación teniendo en cuenta este hecho. 4. Tenemos un diccionario de 30000 palabras que queremos guardar en una tabla hash por recolocación. Suponiendo que el tamaño medio de una palabra es siete letras y que podemos guardar palabras de x letras en x+1 bytes, ¿cuánta memoria necesitamos? 5. Queremos encontrar la primera ocurrencia de un string p1...pk en uno más largo a1...an. Para ello podemos calcular hp=h( p1...pk) y comparar hp con h(a1...ak), h(a2...ak+1), etc hasta que encontremos tal que h(ai...ai+k)=hp, y ene ese caso comparar carácter a carácter. Implementar esta estrategia de la forma más eficiente posible y calcular el coste en tiempo. Basados en los de [Franch 94]: 6. Sea h una función hash con h(sonia)=3, h(gema)=5, h(paula)=2, h(ana)=3, h(ruth)=3, h(cris)=2. Insertar estas claves en una tabla hash con recolocación lineal (a=1) en el siguiente orden: paula, ana, cris, ruth, sonia, gema. Buscar ruth. Repetir el proceso en orden sonia, ana, ruth, gema, paula, cris. Buscar ruth. Otros: 7. Se trata de buscar una estructura de datos adecuada para implementar polinomios "esparsos", es decir, polinomios en los que la mayoría de los coeficientes son 0, por ejemplo: x10000+24. En concreto, se trata de polinomios de cualquier grado, con coeficientes reales y que tienen como máximo 1000 coeficientes distintos de 0. Las operaciones que se quieren realizar son las siguientes (p es un polinomio, a es un real distinto de 0, n un entero no negativo, b es un real): añadir(p,a,n) = p+axn (suma a p el monomio axn) consultar(p,n) = b (donde b es el coeficiente de p de grado n) además de la suma y producto de polinomios. Queremos que las operaciones añadir y consultar sean lo más rápidas posible. 1 Ejercicios de tablas hash, EDA, Universidad de Zaragoza 8. La librería Universal decide crear un sistema automático que aconseje sobre libros a sus cliente. Para ello ha decidido crear una estructura de datos de libros a partir las cifras de venta y las críticas especializadas. La información que quiere guardar sobre cada libro es la siguiente: título, autor, ventas (un entero), nota de la crítica (otro entero), especialidad y comentarios. Las operaciones que pretende desarrollar, además de la consabida operación de “crear”, son: “modificar” (que dada la estructura de datos y un libro, si el libro no está en la estructura lo incluye y en otro caso cambia la antigua información por la nueva), “compra segura” (que dada la estructura de datos y un autor devuelve el libro con mejor crítica de ese autor), “listado” (que dada la estructura y una especialidad devuelve la lista de todos los libros de esa especialidad por orden de ventas). Información adicional: • “compra segura” y “listado” han de ser operaciones muy rápidas (si es posible, de coste constante). • “Modificar” no tiene por qué ser rápida. • La especialidad de un libro no cambia nunca. 9. Se trata de diseñar e implementar un TAD para gestionar los vuelos de espera de un aeropuerto que puede abrir hasta P pistas identificadas con un natural. Cada pista sirve para el despegue de aviones a varios destinos asociados a la pista. Tanto los destinos de los aviones que salen del aeropuerto como los vuelos se identifican con una cadena. También sabemos que: • Hay muchos destinos y estos se conocen a priori. • Puede haber muchos vuelos en espera. • Hay pocas pistas asociadas a cada destino. Las operaciones del TAD son las siguientes: crea: listacadenas --> aeropuerto {crea la estructura con los destinos dados} parcial abre: aeropuerto listacadenas {abre una pista y la asocia a los pistas se abren empezando por la pista i se abre la i+1. Sólo está se han abierto las P pistas.} --> aeropuerto destinos dados. Las 1 y después de la definida si aún no parcial asignaPista: aeropuerto cadena cadena --> aeropuerto {asignapista(a,v,d) asigna al vuelo v una pista válida para despegar con destino d. El vuelo queda en espera. La pista asignada es aquella que tiene menos vuelos en 2 Ejercicios de tablas hash, EDA, Universidad de Zaragoza espera (cualquiera en caso de empate) de entre las que están asociadas al destino. Sólo está definida si el vuelo no existía, el destino está en la lista de destinos y hay alguna pista asociada al destino.} parcial despega: aeropuerto natural --> aeropuerto {despega(a,n) elimina el vuelo que lleva más tiempo esperando en la pista n. Sólo está definido si n está abierta y tiene algún vuelo en espera.} parcial cuántosDelante: aeropuerto cadena --> natural {cuántosDelante(a,v) nos dice cuántos vuelos hay esperando delante de v en la misma pista. Sólo está definida si el vuelo existe.} Se pide: • Especificar algebraicamente el TAD descrito • Dar una implementación del mismo que favorezca la eficiencia de todas las operaciones y optimice el uso de memoria 3