SlideShare una empresa de Scribd logo
1 de 8
Descargar para leer sin conexión
Tema 1. Técnicas de Implementación                                                3. Tablas de Dispersión



   3 Tablas de Dispersión
   Estructura de datos para gestionar colecciones de elementos
    • donde la búsqueda de un elemento puede hacerse en O(1) en
      un alto porcentaje de casos
      - mejora el tiempo de búsqueda en listas: O(n) (o O(log n) si la
        lista está ordenada)



   Constituyen la generalización del concepto de "array"
    • asocian cada llave (en array: cada valor del índice)
    • con su valor correspondiente (en array: elemento que ocupa la
      posición indicada por el índice)



   También llamadas tablas hash
                                              M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                     2/11/11                                      43

Tema 1. Técnicas de Implementación                                                3. Tablas de Dispersión



   Esquema básico de una Tabla de Dispersión
                                                               Valores
      Llaves
                                                                Datos de
                                                        0       Lolo
    "Pedro"                 hash("Pedro") 3
                                                        1       Vacío
                                                                                            Estructura
                                                                                            de acceso
    "Lolo"                  hash("Lolo") 0                                                  aleatorio
                                                                Datos de                    (array)
                                                        2       Pepe

    "Pepe"                 hash("Pepe") 2                       Datos de
                                                        3       Pedro

                                                                Vacío
                                                        4




   hash(): función de dispersión (también llamada “función hash”)

                                              M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                     2/11/11                                      44

Tema 1. Técnicas de Implementación                                                3. Tablas de Dispersión



   Función de dispersión

   Función que hace corresponder cada llave con un número entero
    • que es el código de dispersión (hashcode) de esa llave



   Características de una buena función de dispersión:
    • El código de dispersión debe ser un número dentro del rango
      de índices del array
      - suele utilizarse el operador módulo (% en Java) para lograrlo
    • Debe generar una dispersión uniforme de las llaves en el array
    • Debe poder computarse de manera muy eficiente


                                              M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                     2/11/11                                      45
Tema 1. Técnicas de Implementación                                                                          3. Tablas de Dispersión



   Funciones de dispersión cuando la llave es un
      número entero
   Primer método: función módulo
     hash(llave) = llave % max
    • donde max es el tamaño de la tabla

   Inconvenientes:
     -sólo se usa la parte menos significativa de la llave
     -puede producir distribuciones muy poco homogéneas
      - cuando alguna de las “terminaciones” de las llaves tiende a
        repetirse más que otras
   Ejemplo: llave=13267456, max=100


                                 13267456                                                        56
                                                                        M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                               2/11/11                                      46

Tema 1. Técnicas de Implementación                                                                          3. Tablas de Dispersión


                                                              Funciones de dispersión cuando la llave es un número entero (cont.)

   Segundo método: troceado en grupos de cifras
    • divide la llave en n grupos de cifras
    • el código de dispersión se calcula como el módulo de la suma
      de esos grupos
                                               n–1
                                          ⎛                           ⎞
                         hash ( llave ) = ⎜ ∑ ⎛ ------------ mod max⎞ ⎟ mod max
                                                    llave
                                                           -
                                          ⎝ i = 0 ⎝ max             ⎠⎠
                                                           i


      +Ventaja: utiliza todas las cifras de la llave
      -Inconveniente: es algo más costosa de calcular

   Ejemplo: llave=13267456, max=100, n=4

              13267456                                1 3 + 2 6 + 7 4 + 5 6 %100= 6 9

                                                                        M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                               2/11/11                                      47

Tema 1. Técnicas de Implementación                                                                          3. Tablas de Dispersión



   Funciones de dispersión cuando la llave es una
      cadena de caracteres
   Primer método: suma de los códigos ASCII de los caracteres
                                                     length – 1
                                                 ⎛                                 ⎞
                                hash ( llave ) = ⎜      ∑         ascii ( llave i )⎟      % max
                                                 ⎝     i=0
                                                                                   ⎠


      +Ventajas: sencilla y eficiente
      -Inconveniente: las llaves con los mismos caracteres (aunque
       estén en distinto orden) generan el mismo código de dispersión

   Ejemplo: llave="hola", max=100
     hash("hola") = (ascii(’h’) + ascii(’o’)
                    + ascii(’l’) + ascii(’a’)) % 100
         = (104 + 111 + 108 + 97) % 100 = 20

                                                                        M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                               2/11/11                                      48
Tema 1. Técnicas de Implementación                                                                             3. Tablas de Dispersión


                                                           Funciones de dispersión cuando la llave es una cadena de caracteres (cont.)

   Segundo método: suma con pesos de los códigos ASCII de los
   caracteres
    • al código ASCII de cada carácter se le suma un “peso” que
      depende de la posición que ocupa en la llave
                                                  length – 1
                                            ⎛                                            i ⎞
                           hash ( llave ) = ⎜        ∑         ascii ( ( llave i ) × peso )⎟        % max
                                            ⎝       i=0
                                                                                           ⎠

      +Ventaja: el código depende de los caracteres que forman la
       llave y también del orden que ocupan dichos caracteres
      -Inconveniente: más costosa de calcular
   Ejemplo: llave="hola", max=100, peso=37
     hash("hola") =
       (ascii(’h’)*373 + ascii(’o’)*372
      + ascii(’l’)*371 + ascii(’a’)*370) % 100
      = (104*50653 + 111*1369 + 108*37 + 97) % 100 = 64
                                                                           M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                                  2/11/11                                      49

Tema 1. Técnicas de Implementación                                                                             3. Tablas de Dispersión


                                                           Funciones de dispersión cuando la llave es una cadena de caracteres (cont.)

   Es posible simplificar el cálculo utilizando la siguiente propiedad:
                    3          2              1                 0
          A 3 X + A 2 X + A 1 X + A 0 X = ( ( ( A 3 )X + A 2 )X + A 1 )X + A 0
      • nos ahorramos calcular Xi

   Nos permite representar la función hash mediante la siguiente
   expresión recursiva:
                                              ⎧                     ascii ( llave 0 )
                           hash ( llave i ) = ⎨
                                              ⎩ ( ( ascii ( llave i – 1 ) × max ) + ascii ( llave i ) )
                                   hash ( llave ) = hash ( llave length )            mod          max


   Para cadenas largas, el resultado obtenido podría superar el valor
   máximo almacenable en un entero
    • en ese caso se podría obtener un resultado negativo
    • si esto ocurre le sumamos max para ponerlo en positivo

                                                                           M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                                  2/11/11                                      50

Tema 1. Técnicas de Implementación                                                                             3. Tablas de Dispersión


                                                           Funciones de dispersión cuando la llave es una cadena de caracteres (cont.)



   Ejemplo: cálculo de la función hash para cadenas de caracteres

               public static int hashCode(String s, int max) {
                   int cod=0;

                         for (int i=0; i<s.length(); i++) {
                             cod=(cod*37+ s.charAt(i));
                         }

                         cod = cod % max;

                         if (cod<0) {
                             cod=cod+max;
                         }

                         return cod;
              }
                                                                           M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                                  2/11/11                                      51
Tema 1. Técnicas de Implementación                                                                    3. Tablas de Dispersión



   Problema de las colisiones

                                                                                               Valores
                     Llaves
                                                                                                   Datos de
                                                                                        0          Lolo
                    "Pedro"                hash("Pedro") 3
                                                                                        1          Vacío


                    "Lolo"                 hash("Lolo") 0
                                                                                                   Datos de
                                                                                        2          Pepe

                    "Pepe"                 hash("Pepe") 2                                          Datos de
                                                                                        3          Pedro

                    "Antonio"              hash("Antonio") 3
                                                                 ¡Colisión!                        Vacío
                                                                                        4




                                                               M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                      2/11/11                                         52

Tema 1. Técnicas de Implementación                                                                    3. Tablas de Dispersión



   Métodos para la resolución de colisiones
   Métodos:
    • encadenamiento o dispersión abierta
    • por exploración o dispersión cerrada
      - exploración lineal
      - exploración cuadrática
      - otras exploraciones



   Su eficiencia depende del grado de ocupación de la tabla
    • dispersión abierta: se puede funcionar bien con una ocupación
      del 100% (pero no conviene que crezca mucho más)
    • dispersión cerrada: conviene que nunca se supere el 75% de
      ocupación

                                                               M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                      2/11/11                                         53

Tema 1. Técnicas de Implementación                                                                    3. Tablas de Dispersión



   Resolución de colisiones: dispersión abierta

                              Tabla Hash

                              0
                              1
                              2
                              3
                              4
                              5
                              6
                              7
                              8
                              9




                                                               M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                      2/11/11                                         54
Tema 1. Técnicas de Implementación                                           3. Tablas de Dispersión


                                                   Resolución de colisiones: dispersión abierta (cont.)




   Cada elemento de la tabla hash es una lista enlazada
    • Cada valor se guarda en la lista correspondiente a su código de
      dispersión



   Este método sólo es eficiente cuando la cantidad de colisiones es
   pequeña, y las listas son cortas
    • Para ello se necesita que la tabla tenga un tamaño mayor o igual
      que el número de elementos a almacenar
    • y que, además, la función hash sea muy homogénea




                                         M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                2/11/11                                       55

Tema 1. Técnicas de Implementación                                           3. Tablas de Dispersión



   Dispersión abierta: implementación de las
      operaciones
   • asignaValor: asigna una llave con un valor
      - Calcula el código de dispersión de la llave
      - Busca si ya hay un valor para esa llave en la lista
        correspondiente
      - Si le hay, sustituye el viejo valor por el nuevo
      - Si no, añade el nuevo valor a la lista, por ejemplo al principio
        (ya que es más eficiente en una lista enlazada simple)
   • elimina: elimina el valor asociado a una llave
      - Calcula el código de dispersión de la llave
      - Busca si hay un valor para esa llave en la lista
        correspondiente
      - Si le hay, le elimina de la lista
      - Si no le hay, informa de que no existe
                                         M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                2/11/11                                       56

Tema 1. Técnicas de Implementación                                           3. Tablas de Dispersión


                                        Dispersión abierta: implementación de las operaciones (cont.)




   • obtenValor: obtiene el valor asociado a una llave
      - Calcula el código de dispersión de la llave
      - Busca si hay un valor para esa llave en la lista
        correspondiente
      - Si le hay, le retorna
      - Si no, indica que no existe


   • hazNulo: elimina todas las asociaciones
      - Vacía (hace nulas) todas las listas de la tabla




                                         M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                2/11/11                                       57
Tema 1. Técnicas de Implementación                                                                       3. Tablas de Dispersión



   Resolución de colisiones: dispersión cerrada
   La tabla contiene directamente los valores asociados a las llaves

   Si se detecta una colisión, se intenta calcular un nuevo código de
   dispersión, hasta que se encuentra una posición vacía
                             hash i ( x ) = ( hash ( x ) + next ( i ) ) mod max

   La tabla debe ser bastante mayor que el número de relaciones
    • recomendado al menos el 50% de las celdas vacías
   La función next(i) es la estrategia de exploración:
    • lineal: next(i)=i
    • cuadrática: next(i)=i2
    • doble dispersión: next(i)=i*hashalt(x)


                                                                     M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                            2/11/11                                      58

Tema 1. Técnicas de Implementación                                                                       3. Tablas de Dispersión



   Exploración lineal
                                                 hashi(X)=(hash(X) + i) mod max                                  ocupado
       hash(X) 3
                                                                                                                 libre



                         0   1   2   3     4     5   6     7    8      9      10    11     12     13     14
                                                     X



      • Ocupación de la tabla: λ=celdasOcupadas/totalNumCeldas
      • Número medio de intentos para encontrar celda libre=1/(1-λ)
        - si están ocupadas la mitad de las celdas (λ=0.5) en promedio
          se necesitan 2 intentos
        - Si la ocupación es mayor, el número de intentos crece mucho
      • Si la función hash no es homogénea la eficiencia empeora
      • Tienden a formarse bloques de celdas ocupadas que degradan
        la prestaciones
                                                                     M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                            2/11/11                                      59

Tema 1. Técnicas de Implementación                                                                       3. Tablas de Dispersión



   Exploración cuadrática
                                                         hashi(X)=(hash(X) + i2) mod max                              ocupado
       hash(X) 3                           +22
                                                                                                                      libre
                                     +12

                  0      1   2   3    4     5    6    7     8    9      10     11     12     13    14    15    16
                                                      X



      • Evita en gran medida el agrupamiento de celdas ocupadas que
        ocurría con la exploración lineal
      • Es preciso que la ocupación siempre sea inferior a la mitad
      • El tamaño de la tabla debe ser un número primo
                Teorema: Dada una tabla de dispersión que utiliza exploración cuadrática, si su tamaño es un
                número primo siempre podremos insertar un nuevo elemento en la tabla si su ocupación es es-
                trictamente inferior a 0.5. Además, durante el proceso de inserción, no se visita la misma posi-
                ción más de una vez


                                                                     M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                            2/11/11                                      60
Tema 1. Técnicas de Implementación                                                                3. Tablas de Dispersión



   Exploración por doble dispersión
                         hash i ( x ) = ( hash ( x ) + i × hash alt ( x ) ) mod max

   Permite eliminar la agrupación secundaria que se produce en
   ocasiones con la exploración cuadrática

   hashalt(x) nunca debe dar cero
     - ej.: R-(x mod R), siendo R primo




                                                             M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                    2/11/11                                       61

Tema 1. Técnicas de Implementación                                                                3. Tablas de Dispersión



   Borrado con dispersión cerrada
    elimina(C)                                                                                               ocupado
     hash(C) 3
                                                                                                             libre
                 0       1   2   3   4   5   6   7   8   9     10     11    12     13     14
                                                                                                            borrado
                         A       B   C   D               E                   F




                             0   1   2   3   4   5   6   7    8     9      10     11     12      13   14
                                 A       B       D                   E                   F


   Debe usarse la técnica del “borrado perezoso”:
    • marcamos la celda como borrada (borrado≠libre)
    • al buscar, si encontramos una celda marcada como borrada
      continuamos la búsqueda
    • al añadir, puede ocuparse una celda marcada como borrada

   A veces será necesario “recrear” la tabla
                                                             M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                    2/11/11                                       62

Tema 1. Técnicas de Implementación                                                                3. Tablas de Dispersión



   Dispersión cerrada: implementación de las
      operaciones
   • asignaValor: asigna una llave con un valor
      - Calcula el código de dispersión de la llave
      - Utilizando la estrategia de exploración busca una celda libre
        o marcada como borrada
      - Asigna el valor a la celda
   • elimina: elimina el valor asociado a una llave
      - Calcula el código de dispersión de la llave
      - Utilizando la estrategia de exploración busca una celda con el
        valor de la llave buscado
              - si encuentra una celda marcada como borrada, continúa la búsqueda
          - Si la encuentra, la marca como borrada
          - Si encuentra una celda libre, informa de que no existe ningún
            elemento con esa llave en la tabla
                                                             M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                    2/11/11                                       63
Tema 1. Técnicas de Implementación                                                                   3. Tablas de Dispersión


                                                               Dispersión cerrada: implementación de las operaciones (cont.)




   • obtenValor: obtiene el valor asociado a una llave
      - Calcula el código de dispersión de la llave
      - Utilizando la estrategia de exploración busca una celda con el
        valor de la llave buscado
              - si encuentra una celda marcada como borrada, continúa la búsqueda
           - Si la encuentra, retorna el valor
           - Si encuentra una celda libre, informa de que no existe ningún
             elemento con esa llave en la tabla


   • hazNulo: elimina todas las asociaciones
      - Marca como libres todas las celdas de la tabla


                                                                 M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                        2/11/11                                      64

Tema 1. Técnicas de Implementación                                                                   3. Tablas de Dispersión



   Eficiencia de las operaciones
   Eficiencia temporal de las operaciones (tanto con dispersión
   abierta como con dispersión cerrada):

                                          Operación                               Array
                                          asignaValor                              O(≈1)
                                             elimina                               O(≈1)
                                           obtenValor                              O(≈1)
                                            hazNulo                              O(m) (1)

   (1)
         Donde m es el tamaño del array utilizado para implementar la tabla




                                                                 M. Aldea, M. González, P. Sánchez
  Estructuras de Datos                                                        2/11/11                                      65

Más contenido relacionado

Más de Whaleejaa Wha (20)

Windows 7
Windows 7Windows 7
Windows 7
 
Windows 7 avanzado
Windows 7 avanzadoWindows 7 avanzado
Windows 7 avanzado
 
Virtualizacion con vm ware
Virtualizacion con vm wareVirtualizacion con vm ware
Virtualizacion con vm ware
 
Unity
UnityUnity
Unity
 
Ubuntu
UbuntuUbuntu
Ubuntu
 
Tecnico windows
Tecnico windowsTecnico windows
Tecnico windows
 
Tecnico hardware desde cero
Tecnico hardware desde ceroTecnico hardware desde cero
Tecnico hardware desde cero
 
Soluciones pc desde cero
Soluciones pc desde ceroSoluciones pc desde cero
Soluciones pc desde cero
 
Silverlight
SilverlightSilverlight
Silverlight
 
Servicio tecnico notebooks
Servicio tecnico notebooksServicio tecnico notebooks
Servicio tecnico notebooks
 
Seguridad pc desde cero
Seguridad pc desde ceroSeguridad pc desde cero
Seguridad pc desde cero
 
Seguridad informatica
Seguridad informaticaSeguridad informatica
Seguridad informatica
 
Routers y switches cisco
Routers y switches ciscoRouters y switches cisco
Routers y switches cisco
 
Robotica
RoboticaRobotica
Robotica
 
Redes wireless
Redes wirelessRedes wireless
Redes wireless
 
Redes wifi
Redes wifiRedes wifi
Redes wifi
 
Proteus vsm
Proteus vsmProteus vsm
Proteus vsm
 
Produccion musical
Produccion musicalProduccion musical
Produccion musical
 
Php avanzado
Php avanzadoPhp avanzado
Php avanzado
 
Overclocking
OverclockingOverclocking
Overclocking
 

Funciones de Dispersión para Tablas de Dispersión

  • 1. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión 3 Tablas de Dispersión Estructura de datos para gestionar colecciones de elementos • donde la búsqueda de un elemento puede hacerse en O(1) en un alto porcentaje de casos - mejora el tiempo de búsqueda en listas: O(n) (o O(log n) si la lista está ordenada) Constituyen la generalización del concepto de "array" • asocian cada llave (en array: cada valor del índice) • con su valor correspondiente (en array: elemento que ocupa la posición indicada por el índice) También llamadas tablas hash M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 43 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Esquema básico de una Tabla de Dispersión Valores Llaves Datos de 0 Lolo "Pedro" hash("Pedro") 3 1 Vacío Estructura de acceso "Lolo" hash("Lolo") 0 aleatorio Datos de (array) 2 Pepe "Pepe" hash("Pepe") 2 Datos de 3 Pedro Vacío 4 hash(): función de dispersión (también llamada “función hash”) M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 44 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Función de dispersión Función que hace corresponder cada llave con un número entero • que es el código de dispersión (hashcode) de esa llave Características de una buena función de dispersión: • El código de dispersión debe ser un número dentro del rango de índices del array - suele utilizarse el operador módulo (% en Java) para lograrlo • Debe generar una dispersión uniforme de las llaves en el array • Debe poder computarse de manera muy eficiente M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 45
  • 2. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es un número entero Primer método: función módulo hash(llave) = llave % max • donde max es el tamaño de la tabla Inconvenientes: -sólo se usa la parte menos significativa de la llave -puede producir distribuciones muy poco homogéneas - cuando alguna de las “terminaciones” de las llaves tiende a repetirse más que otras Ejemplo: llave=13267456, max=100 13267456 56 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 46 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es un número entero (cont.) Segundo método: troceado en grupos de cifras • divide la llave en n grupos de cifras • el código de dispersión se calcula como el módulo de la suma de esos grupos n–1 ⎛ ⎞ hash ( llave ) = ⎜ ∑ ⎛ ------------ mod max⎞ ⎟ mod max llave - ⎝ i = 0 ⎝ max ⎠⎠ i +Ventaja: utiliza todas las cifras de la llave -Inconveniente: es algo más costosa de calcular Ejemplo: llave=13267456, max=100, n=4 13267456 1 3 + 2 6 + 7 4 + 5 6 %100= 6 9 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 47 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es una cadena de caracteres Primer método: suma de los códigos ASCII de los caracteres length – 1 ⎛ ⎞ hash ( llave ) = ⎜ ∑ ascii ( llave i )⎟ % max ⎝ i=0 ⎠ +Ventajas: sencilla y eficiente -Inconveniente: las llaves con los mismos caracteres (aunque estén en distinto orden) generan el mismo código de dispersión Ejemplo: llave="hola", max=100 hash("hola") = (ascii(’h’) + ascii(’o’) + ascii(’l’) + ascii(’a’)) % 100 = (104 + 111 + 108 + 97) % 100 = 20 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 48
  • 3. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es una cadena de caracteres (cont.) Segundo método: suma con pesos de los códigos ASCII de los caracteres • al código ASCII de cada carácter se le suma un “peso” que depende de la posición que ocupa en la llave length – 1 ⎛ i ⎞ hash ( llave ) = ⎜ ∑ ascii ( ( llave i ) × peso )⎟ % max ⎝ i=0 ⎠ +Ventaja: el código depende de los caracteres que forman la llave y también del orden que ocupan dichos caracteres -Inconveniente: más costosa de calcular Ejemplo: llave="hola", max=100, peso=37 hash("hola") = (ascii(’h’)*373 + ascii(’o’)*372 + ascii(’l’)*371 + ascii(’a’)*370) % 100 = (104*50653 + 111*1369 + 108*37 + 97) % 100 = 64 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 49 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es una cadena de caracteres (cont.) Es posible simplificar el cálculo utilizando la siguiente propiedad: 3 2 1 0 A 3 X + A 2 X + A 1 X + A 0 X = ( ( ( A 3 )X + A 2 )X + A 1 )X + A 0 • nos ahorramos calcular Xi Nos permite representar la función hash mediante la siguiente expresión recursiva: ⎧ ascii ( llave 0 ) hash ( llave i ) = ⎨ ⎩ ( ( ascii ( llave i – 1 ) × max ) + ascii ( llave i ) ) hash ( llave ) = hash ( llave length ) mod max Para cadenas largas, el resultado obtenido podría superar el valor máximo almacenable en un entero • en ese caso se podría obtener un resultado negativo • si esto ocurre le sumamos max para ponerlo en positivo M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 50 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Funciones de dispersión cuando la llave es una cadena de caracteres (cont.) Ejemplo: cálculo de la función hash para cadenas de caracteres public static int hashCode(String s, int max) { int cod=0; for (int i=0; i<s.length(); i++) { cod=(cod*37+ s.charAt(i)); } cod = cod % max; if (cod<0) { cod=cod+max; } return cod; } M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 51
  • 4. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Problema de las colisiones Valores Llaves Datos de 0 Lolo "Pedro" hash("Pedro") 3 1 Vacío "Lolo" hash("Lolo") 0 Datos de 2 Pepe "Pepe" hash("Pepe") 2 Datos de 3 Pedro "Antonio" hash("Antonio") 3 ¡Colisión! Vacío 4 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 52 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Métodos para la resolución de colisiones Métodos: • encadenamiento o dispersión abierta • por exploración o dispersión cerrada - exploración lineal - exploración cuadrática - otras exploraciones Su eficiencia depende del grado de ocupación de la tabla • dispersión abierta: se puede funcionar bien con una ocupación del 100% (pero no conviene que crezca mucho más) • dispersión cerrada: conviene que nunca se supere el 75% de ocupación M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 53 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Resolución de colisiones: dispersión abierta Tabla Hash 0 1 2 3 4 5 6 7 8 9 M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 54
  • 5. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Resolución de colisiones: dispersión abierta (cont.) Cada elemento de la tabla hash es una lista enlazada • Cada valor se guarda en la lista correspondiente a su código de dispersión Este método sólo es eficiente cuando la cantidad de colisiones es pequeña, y las listas son cortas • Para ello se necesita que la tabla tenga un tamaño mayor o igual que el número de elementos a almacenar • y que, además, la función hash sea muy homogénea M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 55 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Dispersión abierta: implementación de las operaciones • asignaValor: asigna una llave con un valor - Calcula el código de dispersión de la llave - Busca si ya hay un valor para esa llave en la lista correspondiente - Si le hay, sustituye el viejo valor por el nuevo - Si no, añade el nuevo valor a la lista, por ejemplo al principio (ya que es más eficiente en una lista enlazada simple) • elimina: elimina el valor asociado a una llave - Calcula el código de dispersión de la llave - Busca si hay un valor para esa llave en la lista correspondiente - Si le hay, le elimina de la lista - Si no le hay, informa de que no existe M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 56 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Dispersión abierta: implementación de las operaciones (cont.) • obtenValor: obtiene el valor asociado a una llave - Calcula el código de dispersión de la llave - Busca si hay un valor para esa llave en la lista correspondiente - Si le hay, le retorna - Si no, indica que no existe • hazNulo: elimina todas las asociaciones - Vacía (hace nulas) todas las listas de la tabla M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 57
  • 6. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Resolución de colisiones: dispersión cerrada La tabla contiene directamente los valores asociados a las llaves Si se detecta una colisión, se intenta calcular un nuevo código de dispersión, hasta que se encuentra una posición vacía hash i ( x ) = ( hash ( x ) + next ( i ) ) mod max La tabla debe ser bastante mayor que el número de relaciones • recomendado al menos el 50% de las celdas vacías La función next(i) es la estrategia de exploración: • lineal: next(i)=i • cuadrática: next(i)=i2 • doble dispersión: next(i)=i*hashalt(x) M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 58 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Exploración lineal hashi(X)=(hash(X) + i) mod max ocupado hash(X) 3 libre 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 X • Ocupación de la tabla: λ=celdasOcupadas/totalNumCeldas • Número medio de intentos para encontrar celda libre=1/(1-λ) - si están ocupadas la mitad de las celdas (λ=0.5) en promedio se necesitan 2 intentos - Si la ocupación es mayor, el número de intentos crece mucho • Si la función hash no es homogénea la eficiencia empeora • Tienden a formarse bloques de celdas ocupadas que degradan la prestaciones M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 59 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Exploración cuadrática hashi(X)=(hash(X) + i2) mod max ocupado hash(X) 3 +22 libre +12 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 X • Evita en gran medida el agrupamiento de celdas ocupadas que ocurría con la exploración lineal • Es preciso que la ocupación siempre sea inferior a la mitad • El tamaño de la tabla debe ser un número primo Teorema: Dada una tabla de dispersión que utiliza exploración cuadrática, si su tamaño es un número primo siempre podremos insertar un nuevo elemento en la tabla si su ocupación es es- trictamente inferior a 0.5. Además, durante el proceso de inserción, no se visita la misma posi- ción más de una vez M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 60
  • 7. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Exploración por doble dispersión hash i ( x ) = ( hash ( x ) + i × hash alt ( x ) ) mod max Permite eliminar la agrupación secundaria que se produce en ocasiones con la exploración cuadrática hashalt(x) nunca debe dar cero - ej.: R-(x mod R), siendo R primo M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 61 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Borrado con dispersión cerrada elimina(C) ocupado hash(C) 3 libre 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 borrado A B C D E F 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A B D E F Debe usarse la técnica del “borrado perezoso”: • marcamos la celda como borrada (borrado≠libre) • al buscar, si encontramos una celda marcada como borrada continuamos la búsqueda • al añadir, puede ocuparse una celda marcada como borrada A veces será necesario “recrear” la tabla M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 62 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Dispersión cerrada: implementación de las operaciones • asignaValor: asigna una llave con un valor - Calcula el código de dispersión de la llave - Utilizando la estrategia de exploración busca una celda libre o marcada como borrada - Asigna el valor a la celda • elimina: elimina el valor asociado a una llave - Calcula el código de dispersión de la llave - Utilizando la estrategia de exploración busca una celda con el valor de la llave buscado - si encuentra una celda marcada como borrada, continúa la búsqueda - Si la encuentra, la marca como borrada - Si encuentra una celda libre, informa de que no existe ningún elemento con esa llave en la tabla M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 63
  • 8. Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Dispersión cerrada: implementación de las operaciones (cont.) • obtenValor: obtiene el valor asociado a una llave - Calcula el código de dispersión de la llave - Utilizando la estrategia de exploración busca una celda con el valor de la llave buscado - si encuentra una celda marcada como borrada, continúa la búsqueda - Si la encuentra, retorna el valor - Si encuentra una celda libre, informa de que no existe ningún elemento con esa llave en la tabla • hazNulo: elimina todas las asociaciones - Marca como libres todas las celdas de la tabla M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 64 Tema 1. Técnicas de Implementación 3. Tablas de Dispersión Eficiencia de las operaciones Eficiencia temporal de las operaciones (tanto con dispersión abierta como con dispersión cerrada): Operación Array asignaValor O(≈1) elimina O(≈1) obtenValor O(≈1) hazNulo O(m) (1) (1) Donde m es el tamaño del array utilizado para implementar la tabla M. Aldea, M. González, P. Sánchez Estructuras de Datos 2/11/11 65