31.10.2014 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!