Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Documentos relacionados
Tema 2.- Ordenación (Parte I)

Tema 7: Árbol Binario

Tema 3: Listas Enlazadas

Apuntes elaborados por: Aaron Asencio, Eduardo Quevedo, Raquel López Revisado por: Javier Miranda el???

Hashing (Funciones de Dispersión)

Tema 5.- Recursividad

Indexación con lista enlazada

Tablas de Dispersión (Hashing Tables)

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Eduardo Mosqueira Rey Bertha Guijarro Berdiñas Mariano Cabrero Canosa

FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 4. Técnicas de Dispersión. Definición y Manejo.

Apuntes elaborados por: Eduardo Quevedo,Raquel López Revisado por: Javier Miranda el 25 de Mayo de 2004

Esquema básico de una Tabla de Dispersión

Tablas de dispersión (hash tables)

Tablas (Diccionarios). Modelo matemático

SEGUNDA PARTE: TIPOS COMPLEJOS

Estructura de datos y de la información Boletín de problemas - Tema 10

Estructura de datos y Algoritmos. Tema III Clasificación en memoria secundaria

1.2.4 Listas enlazadas

ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º. Nombre-Apellidos:

ARBOLES B. Lo que si es cierto es que la letra B no significa "binario", ya que:

Divisibilidad y congruencia

Estructura de Datos y de la Información

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Análisis amortizado El plan:

EJERCICIO 2 (3 PUNTOS) A) Sea el árbol binario AVL de la figura siguiente: B) Dada la estructura de la figura siguiente:

Algoritmos y Estructuras de Datos Curso 04/05. Ejercicios

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Capítulo 3. Clasificación en Memoria Secundaria

Tema 7- Modelo y Aplicación de Pila, Cola y. Tema 7- Modelo y Aplicación de. Lista Con Punto de Interés

Razón de ser Computadora Programa Programador Análisis y solución de problemas (Metodología) Algoritmo Diagrama de flujo

INTERFACES SET Y SORTEDSET DEL API DE JAVA. CLASES HASHSET Y TREESET. EJEMPLO. DIFERENCIAS ENTRE ELLAS. (CU00924C)

COMPRESIÓN DE MENSAJES

Estructuras de datos: Tablas de dispersión

LENGUAJES DE PROGRAMACIÓN. Solución al Ejercicio de Autocomprobación 1

Tema 4- Representación Enlazada

Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Tema 04: TAD Lista. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Implementación de diccionarios sobre Trie en C++

Algoritmos y Estructuras de Datos Ingeniería en Informática

Divisibilidad y congruencia

Tablas Asociativas (Hash) Tablas: filas & columnas de información Especificación algebraica

Otras estructuras de datos

Es común al crear estructuras de datos y luego trabajar sobre las mismas, tener la necesidad de realizar búsquedas en forma más frecuente que la

Programación en Visual Basic Ricardo Rodríguez García

Teorema fundamental para la resolución de ecuaciones no lineales.

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Parte I: Programación en Ada

RESPUESTAS AL EXAMEN DE FUNCIONES 22/05/2001

1 Introducción. 1.2 Estructuras de datos y Tipos de Datos Abstractos. Estructura de Datos y Algoritmos. Tema I Introducción y conceptos fundamentales

Análisis amortizado El plan:

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Estructuras Dinámicas de datos.

Arreglos y Subrangos

Arreglos y Subrangos

DEFINICIONES BÁSICAS DE LAS ESTRUCTURAS DE DATOS

Profesor: José Miguel Rubio L.

Segundo parcial de Programación 2

Matemáticas 2ºBachillerato Aplicadas a las Ciencias Sociales

Estructura de Datos. Listas Enlazadas

El TAD tabla y las tablas dispersas (o tablas hash) Lección 19

Diseño de Conjuntos y Diccionarios con Hashing

Apéndice 1: Fundamentos de lógica, teoría de conjuntos y estructuras algebraicas. . Analizando el

Tema 6. Ordenación, búsqueda e intercalación interna

Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I

Curso de Programación 1

Alonso Ramirez Manzanares Computación y Algoritmos 03.05

Lista Simple con Puntero al Principio y Puntero al Final

El nivel Interno. Índice Tema 3

Programación Web Tema 3.2 Java Script Estructura del Lenguaje. Ramón Alcarria ETSI en Topografía, Geodesia y Cartografía - UPM

Unidad 5: Estructuras Estáticas I: Tablas 1 Unidad 5 ESTRUCTURAS ESTÁTICAS I: Tablas Desarrollo de la unidad : 36 h

Estructuras dinámicas lineales (i)

Los Tipos Abstractos de Datos. Estructuras de Datos y Algoritmos 03/04

Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica

2.1 Introducción. Propiedades.

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Tabla de Símbolos. Programación II Margarita Álvarez

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Conocimientos previos

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

Tabla de Símbolos. Programación II Margarita Álvarez

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

INTERFACES MAP Y SORTEDMAP DEL API JAVA. CLASES HASHMAP Y TREEMAP. EJEMPLO. DIFERENCIAS ENTRE ELLAS. (CU00922C)

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Introducción: una simple colección

Versión Iterativa de recuperar en un. Ejercicios Tema 11. Implementa una versión del método recuperar iterativa con la siguiente especificación:

Tema 10: Árbol binario de búsqueda

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Algorítmica y Complejidad. Tema 3 Ordenación.

B) Contestar Verdadero o Falso a las siguientes preguntas, justificando la respuesta:

ALGORITMOS Y PROGRAMACIÓN I Unidad 3

Archivos Indice. Indexación y. Asociación. Conceptos Básicos Indices Ordenados Arboles. Asociación. Docente: Albert A.

Programación de sistemas Listas enlazadas

CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS

Programación en Pascal. Memoria dinámica

Transcripción:

Programación. Tema : Tablas Hash /Mayo/ Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el???? Tema : Tabla Hash Las tabla hash aparece para conseguir una búsqueda e inserción muy rápidas; para ello se hace uso de un array, con lo que volvemos a la estructura básica de almacenamiento. Sin embargo, hay una diferencia importante que es lo que hace que sea mejor que el array en cuanto a rapidez: a cada dato se le asigna, mediante una fórmula matemática denominada función hash, una posición única en la tabla, con lo que la búsqueda, la inserción y el borrado son inmediatos: O(). Como ocurre siempre, lo que ganamos por un lado, lo perdemos por otro; en el caso de la tabla hash los inconvenientes son: Al tratarse de un array, el tamaño de la tabla está limitado y debe fijarse desde el principio. Como las posiciones ocupadas no tienen por qué ser consecutivas, no se puede recorrer el contenido de una tabla hash. Como la posición de una palabra se calcula de forma matemática, los datos no pueden almacenarse ordenados. Si permitimos datos duplicados se produce lo que se denomina colisión, que consiste en que a dos palabras se les asigna la misma posición en el array. Este es un problema que trataremos de resolver. Función hash: Hasta ahora hemos dicho que a cada palabra se le asigna una determinada posición de la tabla por medio de la función hash, pero todavía no hemos definido esta función. Veamos una primera solución y sus inconvenientes, y las soluciones que nacen a partir de ésta: Solución : Proponemos como una primera función hash la suma del código ASCII de cada una de las letras de la palabra: F( Palabra) = Palabra' Last i= Palabra' First Character' Pos( Palabra( i)) Por ejemplo: F (" alfredo") = + + + + + + =

Programación. Tema : Tablas Hash /Mayo/ Colisión : Palabras idénticas. Colisión : Palabras formadas por las mismas letras pero en distinto orden. Colisión : Palabras distintas cuyas letras dan la misma suma. La suma da números muy pequeños. Solución : Suma ponderada o polinómica. Cambiamos la función hash para que el resultado sea mayor; para conseguir esto multiplicamos la posición de cada letra de la palabra por el número de letras del alfabeto () elevado al peso que tiene la letra en la palabra: F n n ( Palabra) = Polinomio( Palabra) = n. + ( n ). +... +. +. Por ejemplo: F (" alfredo") =. +. +. +. +. +. +. Los resultados de la función hash salen muy diferentes para cada palabra, con lo que éstas se guardan en posiciones muy separadas de la tabla, desperdiciando de esta forma una gran cantidad de memoria. Si introducimos una palabra muy grande, la posición resultante es demasiado elevada. Por ejemplo, si queremos insertar una palabra de letras, la posición que le corresponde viene dada por. +. +... +. +.. Solución : Para evitar que se produzcan resultados demasiado elevados, dividimos el resultado de la función de la solución anterior entre el tamaño de la tabla hash y tomamos como resultado de la nueva función hash el resto de esta división. F ( Palabra) = Polinomio( Palabra) mod Tamaño _ Tabla Se producen muchas colisiones debido a la reducción del resultado de la función hash con el mod. Solución :

Programación. Tema : Tablas Hash /Mayo/ Para arreglar el problema de las colisiones hay dos posibles opciones: Usar memoria dinámica: Cada posición de la tabla hash contiene una lista o un árbol. De esta forma, si a dos palabras les corresponde la misma posición de la tabla, lo único que hay que hacer es insertar ambas en la lista o en el árbol, según sea el caso. Si la solución anterior no es viable, hay que buscar otra manera de arreglar las colisiones. Esta solución consistiría en buscar, mediante saltos, otra posición de inserción de la palabra a partir de la posición que le corresponde según la función hash, sólo en el caso de que esta posición esté ocupada, es decir, sólo si se produce una colisión. Hay varias implementaciones de esta solución en función del salto que se utilice:. Salto = Posición + n, con n =,,... De esta forma insertaremos la nueva palabra en la posición no ocupada más próxima a partir de la posición que le correspondería en realidad. Por ejemplo: Queremos insertar, pero la posición que le corresponde (posición ) ya está ocupada, por lo que insertaremos en la posición vacía más próxima a a partir de ésta De la misma forma que antes, vamos a insertar Ahora queremos insertar, pero la posición que le corresponde (posición ) ya está ocupada.

Programación. Tema : Tablas Hash /Mayo/ Las palabras tienden a concentrarse en ciertas zonas de la tabla, dejando grandes espacios en blanco entre cada grupo de posiciones ocupadas.. Salto = Posición + n, con n =,,... De esta forma, evitamos el apelotonamiento de datos. Si queremos insertar una palabra y justo las posiciones x +, x +, x +,... están ocupadas, mientras que las que quedan en medio están vacías, va a tardar demasiado en encontrar un hueco libre en la tabla cuando en realidad se ha pasado por alto unos cuantos. Queremos insertar, pero la posición que le corresponde (posición ) ya está ocupada buscamos la posición de inserción: x + = Ya está ocupada. x + = Ya está ocupada. x + = Se sale de la tabla, con lo que contamos a partir del principio: = Ya está ocupada.... Así entraríamos en un bucle sin fin, pues las posiciones se van a repetir y, sin embargo, todavía nos quedan posiciones libres en la tabla.. Salto variable: el valor de este salto no puede ser aleatorio, ya que de ser así, una vez insertada una palabra no seríamos capaces de encontrarla en la tabla, pues no sabríamos cuánto hay que saltar a partir de su posición resultante de la función hash. Una posible solución es calcular este salto por medio de otra función hash que resulte un número más pequeño: Salto = k (( Polinomio( Palabra)) mod k) donde k es el máximo salto que permitimos (lo elegimos nosotros). Algoritmos en Ada: function Posición_Hash ( Palabra : in String; Tamaño_Tabla : in Positive) return Natural is

Programación. Tema : Tablas Hash /Mayo/ Posición : Natural := ; begin for I in Palabra Range loop Posición := (Posición + (I * Character Pos(Palabra(I) **I))) mod Tamaño_Tabla; end loop; return Posición; end Posición_Hash; function salto_hash (Palabra : in String) return Integer is begin return Character Pos (Palabra(I)) mod ; end Salto_Hash; Observaciones importantes: Se recomienda fijar el tamaño de la tabla hash como el doble del necesario para almacenar todos los elementos. Si queremos ampliar el tamaño de la tabla, como la función hash depende del tamaño de ésta, hay que recalcular las posiciones de todos lo elementos e insertarlos en estas nuevas posiciones (NO se puede copiar directamente el contenido de una tabla a otra). El tamaño de la tabla debe ser un número primo para evitar bucles infinitos como ocurría en el ejemplo del segundo tipo de salto. Se recomienda no permitir datos duplicados a no ser que vayamos a implementar la tabla hash con listas, ya que si se almacena todo en el array la gestión de la información para insertar y buscar se complica. En caso de que permitiéramos datos duplicados en una tabla implementada con saltos, necesitaríamos introducir un nuevo campo Borrado de tipo boolean en cada posición que nos diga si el dato contenido en esa posición ha sido borrado o todavía no se ha insertado nada en ella. Observación. Esto es así porque, al haber datos duplicados, el segundo elemento que insertemos se irá a colocar en una posición de la tabla que no se corresponde con el resultado de la primera función hash. En caso de que no usásemos la variable boolean, si borrásemos el elemento que había en la primera posición, cuando intentásemos buscar el segundo elemento se elevaría la excepción No_Encontrado pues la posición que le corresponde está vacía. Sin embargo, con el boolean, como al borrar el primer elemento habríamos puesto esta variable a True, al buscar el segundo elemento basta con seguir calculando saltos hasta

Programación. Tema : Tablas Hash /Mayo/ que lo encontremos, hasta que en una posición en la que debería estar el elemento el campo Borrado esté puesto a False o hasta que la posición calculada con saltos sea de nuevo igual a la posición de la que partimos. Lo vemos mejor con un ejemplo: Supongamos un array implementado con el primer tipo de salto, es decir, saltos a posiciones consecutivas: Dato : Dato : Dato : Dato : Borramos Borrado : True Dato : Dato : Dato : Dato : Dato : Dato : Dato : Dato : Dato : Si ahora quisiéramos buscar el elemento los pasos que seguiríamos serían:. Posición () = mod =. Comprobamos el campo Borrado de la posición de la tabla. Como está puesto a True, seguimos buscando.. Comprobamos el Borrado de la posición. Como está a False, miramos a ver si el dato coincide con el que estamos buscando. Como no es así, seguimos buscando..... Comprobamos el Borrado de la posición. Como está a False, miramos a ver si el dato coincide con el que estamos buscando. Como esto último se cumple, retornamos True.

Programación. Tema : Tablas Hash /Mayo/