Práctica de Laboratorio 1

Anuncio
Instituto Tecnológico y de Estudios Superiores de Monterrey
Práctica de Laboratorio 1
Optimización en el procesamiento de datos: Tabla Hash
Marco teórico
Existen muchas formas de almacenar datos en una computadora: a la forma de almacenar
estos datos en memoria comúnmente se les llama estructura de datos. Sin embargo, el
compromiso que existe entre la necesidad en velocidad de acceso a los datos, velocidad de
almacenamiento, ahorro de recursos y escalabilidad de la estructura, comúnmente nos hace
decidir por una estructura en específico; la realidad es que no se puede tener todo a la vez.
En redes, en especial cuando se trata del procesamiento de paquetes, lo que se desea es que
el sistema pueda procesar a la mayor velocidad posible. En muchas ocasiones, nuestras
aplicaciones requieren acceder a los datos utilizando como clave para el acceso parte de
esos mismos datos. Esta necesidad de acceso asociativo es una situación muy común en el
mundo real. Además de esto, es bien sabido que el acceso a memoria es algo que limita la
velocidad de cómputo de la mayoría de las computadoras.
Ante esta situación, existe una estructura de datos que minimiza los accesos a memoria y de
esta forma –si es bien diseñada- permite que la velocidad de acceso a los datos sea mínima,
logrando el acometido que se tiene en redes con relación al procesamiento de paquetes. A
esta estructura de datos se le conoce como tabla de dispersión de datos, o más comúnmente
tabla hash, de la analogía con el significado estándar (en inglés) de dicha palabra en el
mundo real: picar y mezclar.
Una tabla hash consiste básicamente en aplicar una función a una llave (algún dato que
permita indexar los registros de la tabla, puede ser una cadena de caracteres o un número
real), el valor que te regresa la función es un apuntador a una tabla, la cual contiene los
registros de datos. La idea es que cuando se quiera hacer una búsqueda del dato,
simplemente se aplique la función de hash y se pueda obtener directamente el apuntador al
registro asociado, sin necesidad de hacer una búsqueda exhaustiva como es el caso de
muchas otras estructuras de datos. Debe de ser claro, de esta forma, que el tiempo de acceso
va a depender solamente de la complejidad de la función hash, por lo que este tiempo va a
ser un valor constante, independiente (por lo menos idealmente) del número de registros de
la tabla.
Sin embargo, las cosas no son tan sencillas, ya que en la práctica no se puede generar una
función hash que genere un apuntador único para cada llave, por lo que cuando dos llaves
diferentes generan un mismo apuntador, existe una colisión. Existen muchos métodos para
tratar las colisiones; sin embargo el que se sugiere en el libro y el que se sugiere aquí es el
de doble hash con direccionamiento abierto. Doble hash se refiere a aplicar una nueva
función hash cuando ha sucedido una colisión para poder crear un apuntador diferente;
direccionamiento abierto se refiere a hacer solamente uso del arreglo de memoria
reservado, y no hacer uso de listas o alguna otra estructura de datos para extender el
arreglo.
Como desventaja de las funciones hash se tiene el hecho de que la necesidad de tener los
datos dispersos en la tabla comúnmente tiene como consecuencia que se desperdicien
recursos de memoria; por su puesto, esto es una desventaja mínima teniendo en cuenta las
grandes ventajas que posee.
Objetivo
Aprender sobre un concepto que está enfocado a optimizar el procesamiento de datos y por
consiguiente, el procesamiento de paquetes en redes. En específico, el objetivo es
implementar una tabla de hash desde cero.
Descripción
Se pide un programa donde se implemente una tabla de hash en memoria dinámica. La
tabla de hash debe de tener la capacidad de inserción y búsquedas de datos. Se sugiere el
uso del algoritmo que se encuentra en el libro de texto (hash doble con direccionamiento
abierto), pero cualquier otro algoritmo de hash que sirva para el mismo propósito estará
bien. Se pide además que la tabla de hash tenga un propósito específico: sirva para procesar
direcciones MAC; es decir, el programa deberá de tener la capacidad de insertar y buscar
direcciones MAC en la tabla de hash.
Nota: Esta tabla de hash se usará en prácticas posteriores con algunas modificaciones, por
lo que es muy importante la realización de la práctica y el total entendimiento de la misma.
Ing. Jorge A. Bustamante Horta
Ing. Octaviano Flores González
Ing. Roberto De León
Descargar