Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


11.5. Las tablas Hash

En una "tabla hash", los elementos están formados por una pareja: una clave y un valor, como en un SortedList, pero la diferencia está en la forma en que se manejan internamente estos datos: la "tabla hash" usa una "función de dispersión" para colocar los elementos, de forma que no se pueden recorrer secuencialmente y ocupan más espacio, pero a cambio el acceso a partir de la clave es muy rápido, más que si hacemos una búsqueda secuencial (como en un array) o binaria (como en un ArrayList ordenado).

Un ejemplo de diccionario, parecido al anterior (que es más rápido de consultar para un dato concreto, pero que no se puede recorrer en orden), podría ser:

// Ejemplo_11_05a.cs
// Ejemplo de Tabla Hash: Diccionario de informática
// Introducción a C#, por Nacho Cabanes

using System;
using System.Collections;

public class Ejemplo_11_05a  
{
    public static void Main()  
    {
        // Creamos e insertamos datos
        Hashtable miDiccio = new Hashtable();
        miDiccio.Add("byte", "8 bits");
        miDiccio.Add("pc", "personal computer");
        miDiccio.Add("kilobyte", "1024 bytes");

        // Mostramos algún dato
        Console.WriteLine( "Cantidad de palabras en el diccionario: {0}",
            miDiccio.Count );
        try 
        {  
            Console.WriteLine( "El significado de PC es: {0}",
            miDiccio["pc"]);
        }
        catch (Exception) 
        {
            Console.WriteLine( "No existe esa palabra!");
        }
    }
}

que escribiría en pantalla:

Cantidad de palabras en el diccionario: 3
El significado de PC es: personal computer

Si un elemento que se busca no existe, se lanzaría una excepción, por lo que deberíamos controlarlo con un bloque try-catch. Lo mismo ocurre si intentamos introducir un dato que ya existe. Una alternativa a usar try-catch es comprobar si el dato ya existe, con el método "Contains" (o su sinónimo "ContainsKey"), como en este ejemplo:

// Ejemplo_11_05b.cs
// Ejemplo de Tabla Hash: Diccionario de informática
// Introducción a C#, por Nacho Cabanes

using System;
using System.Collections;

public class Ejemplo_11_05b
{
    public static void Main()  
    {
        // Creamos e insertamos datos
        Hashtable miDiccio = new Hashtable();
        miDiccio.Add("byte", "8 bits");
        miDiccio.Add("pc", "personal computer");
        miDiccio.Add("kilobyte", "1024 bytes");

        // Mostramos algún dato
        Console.WriteLine( "Cantidad de palabras en el diccionario: {0}",
            miDiccio.Count );
        if (miDiccio.Contains("pc"))
            Console.WriteLine( "El significado de PC es: {0}",
                miDiccio["pc"]);
        else
            Console.WriteLine( "No existe la palabra PC");
    }
}

Otras posibilidades son: borrar un elemento ("Remove"), vaciar toda la tabla ("Clear"), o ver si contiene un cierto valor ("ContainsValue", mucho más lento que buscar entre las claves con "Contains").

Una tabla hash tiene una cierta capacidad inicial, que se amplía automáticamente cuando es necesario. Como la tabla hash es mucho más rápida cuando está bastante vacía que cuando está casi llena, podemos usar un constructor alternativo, en el que se le indica la capacidad inicial que queremos, si tenemos una idea aproximada de cuántos datos vamos a guardar:

Hashtable miDiccio = new Hashtable(500);

Ejercicios propuestos:

Ejercicio propuesto 11.5.1: Crea una versión alternativa del ejercicio 11.4.2.1, pero que tenga las traducciones almacenadas en una tabla Hash.
Ejercicio propuesto 11.5.2: Crea una versión alternativa del ejercicio 11.4.2.2, pero que tenga las traducciones almacenadas en una tabla Hash.