13.07.2015 Views

Tablas de Dispersión

Tablas de Dispersión

Tablas de Dispersión

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Algoritmos y Lenguaje <strong>de</strong> Programación,Sección 1<strong>Tablas</strong> <strong>de</strong> <strong>Dispersión</strong><strong>Tablas</strong> <strong>de</strong> <strong>Dispersión</strong>Mario Medina C.mariomedina@u<strong>de</strong>c.cl• Conocidas también como <strong>Tablas</strong> HashNombre en ingles: Hash Tables• Dos partes:Tabla <strong>de</strong> dispersión <strong>de</strong> n entradasUna función <strong>de</strong> dispersión que transforma datos<strong>de</strong> entrada en una clave Clave es índice en tabla <strong>de</strong> dispersión Rango <strong>de</strong> entradas >> Rango <strong>de</strong> clavesEjemplo: clasificador <strong>de</strong> correos• Recibe una carta para<strong>de</strong>stinatario “Juan Pérez” y laclasifica en la letra PEntrada: “Pérez”Función <strong>de</strong> dispersión: convierteapellido en inicialQué pasa si dos apellidoscomienzan con la misma letra? Se almacenan en el mismocasillero Colisión!Almacenamiento en tabla <strong>de</strong>dispersiónFunciones <strong>de</strong> dispersiónOperaciones básicas• Se busca transformar una clave k a unaposición x en la tabla <strong>de</strong> tamaño mH(k) = x, 0 < x < m• <strong>Dispersión</strong> uniformeDadas n claves, cada casilla en la tabla <strong>de</strong>berecibir aproximadamente n/m claves No siempre es posible Escoger bien cómo transformar la clave!• Insertar(clave, elemento)Aplica función <strong>de</strong> dispersión a la clave Retorna índice <strong>de</strong> posición en tablaUsar índice para almacenar el elemento en dichaposición <strong>de</strong>l tablaSi posición está ocupada, resolver la colisión Definir dón<strong>de</strong> almacenar el elemento©Mario Medina C. 1


Algoritmos y Lenguaje <strong>de</strong> Programación,Sección 1Operaciones básicasBúsqueda en tablas <strong>de</strong> dispersión• Buscar(clave)Aplica función <strong>de</strong> dispersión a la clave Retorna índice <strong>de</strong> posición en tablaUsar índice para obtener elemento almacenadoen dicha posición <strong>de</strong>l tablaSi elemento no es el buscado, seguir buscando Dón<strong>de</strong> buscar? Depen<strong>de</strong> <strong>de</strong>l tipo <strong>de</strong> tabla Si no encuentra el elemento, éste no está en la tabla• Generación <strong>de</strong> la clave es O(1)Función simple y conocida• Búsqueda en una tabla dado el índice es O(1)Excepto si hay colisiones• Desempeño baja si hay muchas colisionesPeor caso: todos los datos en colisiónComportamiento es O(n)Resolución <strong>de</strong> colisiones• <strong>Tablas</strong> enca<strong>de</strong>nadasDatos en colisión se almacenan en listasenca<strong>de</strong>nadas Una lista por casilla• Direccionamiento abiertoDatos en colisión se almacenan en la mismatabla<strong>Tablas</strong> enca<strong>de</strong>nadas• Vector <strong>de</strong> listas enca<strong>de</strong>nadas• Una lista por casillaEn caso <strong>de</strong> colisión, nuevo elemento se agrega ala lista <strong>de</strong> la casilla correspondiente• <strong>Dispersión</strong> no uniforme: algunas listas pue<strong>de</strong>ncrecer muchoTiempo <strong>de</strong> acceso a elementos aumentaFactor <strong>de</strong> carga α: razón entre elementos aalmacenar n y número <strong>de</strong> casillas m Número esperado <strong>de</strong> elementos por listaEjemplo <strong>de</strong> tabla enca<strong>de</strong>nadaEligir una función <strong>de</strong> dispersión• Objetivo: aproximar dispersión uniforme• Método <strong>de</strong> la división enterah(k) = k mod m• Escoger m tal que no sea potencia <strong>de</strong> 2• Escoger m como un número primo©Mario Medina C. 2


Algoritmos y Lenguaje <strong>de</strong> Programación,Sección 1Eligir una función <strong>de</strong> dispersión• Método <strong>de</strong> la multiplicaciónMultiplicar k for un factor A, 0 < A < 1Tomar la parte fraccionaria <strong>de</strong>l resultadoMultiplicar ésta por mEscoger en máximo entero inferiorh ( k)= ⎣m(kAmod1)⎦• Valor típico <strong>de</strong> A: 0.618Función <strong>de</strong> dispersión para ristrasunsigned int hashpjw(const void *key) {const char *ptr = key;unsigned int tmp, val = 0;while (*ptr != ‘\0’) {val = (val


Algoritmos y Lenguaje <strong>de</strong> Programación,Sección 1Comparación <strong>de</strong> los dos métodosAplicaciones• <strong>Tablas</strong> enca<strong>de</strong>nadasRequiere memoria adicional a la tablaBúsqueda promedio: 1 + α /2 – 1/2MPeor caso: lista enca<strong>de</strong>nada O(N)• Direccionamiento directoRequiere funciones <strong>de</strong> hashing adicionalesBúsqueda promedio: (2 - α )/(2 - 2α )Peor caso: recorrer toda la tabla O(N)• Bases <strong>de</strong> datos• <strong>Tablas</strong> <strong>de</strong> símbolos para compiladores• Vectores asociativos• Diccionarios <strong>de</strong> datos• Criptografía• Firmas digitales©Mario Medina C. 4

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

Saved successfully!

Ooh no, something went wrong!