1 2 Estructuras de datos Nivel de Abstracción Tema 8: Tabla Hash Alto Javier Miranda Bajo Estructura de datos Pila, Cola, Árbol Hash Grafo Array, Lista Enlazada, Árbol Ordenación (C) Javier Miranda 18-feb-04 (C) Javier Miranda 18-feb-04 3 4 Introducción Función HASH • Ventajas CASO 1 – Inserción muy rápida O(1) – Búsqueda muy rápida O (1) Diseñar estructura de datos que permita buscar e insertar muy rápido información de 1000 personas. Cada persona tiene una clave entre 1 y 1000. • Inconvenientes – Basadas en arrays – No es posible ordenar su contenido – No es posible recorrer en orden su contenido (C) Javier Miranda 18-feb-04 (C) Javier Miranda 18-feb-04 5 6 Función HASH Función HASH CASO 2 Solución 1 Sumar el código numérico de cada letra Necesitamos almacenar todas las palabras de un diccionario. ¿ Cómo las almacenamos para que se puedan buscar e insertar en poco tiempo ? 18-feb-04 (C) Javier Miranda Problema: La tabla seria excesivamente pequeña (no caben todas las palabras del diccionario) 18-feb-04 (C) Javier Miranda 1 7 8 Función HASH Función HASH Solución 2 Función polinómica utilizando el código numérico de cada letra (potencias de 27) Objetivo • Que la tabla sea del tamaño necesario para almacenar justo el número de elementos que queremos guardar Problema: La tabla seria excesivamente grande y con muchos huecos que no se utilizarán nunca • En la práctica veremos que es mejor que la tabla tenga espacio para el doble de elementos. (C) Javier Miranda 18-feb-04 (C) Javier Miranda 18-feb-04 9 10 Colisiones Función HASH Soluciones 1. Buscar el hueco más cercano Solución 3 Función polinómica utilizando el código numérico de cada letra (potencias de 27) + uso de la función mod para convertir el número al rango de la tabla. – Linear Probing (x+1, x+2, ..., x+n) – Quadratic Probing (x+1, x+22, ..., x+n2) – Double Hashing Salto = K – (Clave mod K) El Tamaño de la tabla debe ser un número primo Problema: COLISIONES (la función puede asignar la misma posición a varias palabras) 2. Listas dinámicas (C) Javier Miranda 18-feb-04 (C) Javier Miranda 18-feb-04 11 12 Tabla Hash Linear Probing Tabla Hash Quadratic & Double Hashing Run 18-feb-04 Run (C) Javier Miranda 18-feb-04 (C) Javier Miranda 2 13 Detalles pendientes (cuando no se utilizan listas dinámicas) • ¿Duplicados? No se recomienda si no se utilizan listas dinámicas porque obliga a recorrer siempre todo el array • Tamaño de la tabla: Si no se utilizan listas dinámicas se recomienda el doble del número de elementos para que no tarde demasiado en encontrar un hueco libre • ¿Ampliar la tabla? Habría que volver a insertar de nuevo todos los elementos porque la función hash depende del tamaño de la tabla. 18-feb-04 (C) Javier Miranda 3