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