0

Estructuras de Datos en C# 05: Diccionarios y HashTables en C# – Búsqueda eficiente

Introducción a la clase

En esta clase exploraremos dos estructuras de datos clave para el almacenamiento y recuperación rápida de información: Diccionarios (Dictionary<TKey, TValue>) y HashTables (Hashtable) en C#. Estas estructuras permiten acceder a los datos mediante una clave, optimizando la eficiencia en comparación con listas o arrays.

¿Qué obtendrás de esta clase?

  • Comprender cómo funcionan los diccionarios y tablas hash en C#.
  • Aprender a implementar Dictionary<TKey, TValue> y Hashtable.
  • Conocer sus diferencias y ventajas en términos de rendimiento.
  • Aplicar estas estructuras en casos reales con ejemplos prácticos.

Diccionarios en C#

Un diccionario (Dictionary<TKey, TValue>) es una colección que almacena datos en pares clave-valor, lo que permite acceder rápidamente a un valor usando su clave.

Características de un Diccionario

  • Búsqueda rápida en O(1) gracias al uso de funciones hash.
  • Clave única: No permite duplicados en las claves.
  • Acceso directo a los valores sin recorrer la estructura.

Implementación de un Diccionario en C#

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<string, string> paises = new Dictionary<string, string>
        {
            { "ARG", "Argentina" },
            { "BRA", "Brasil" },
            { "USA", "Estados Unidos" }
        };

        Console.WriteLine("Ingrese el código de un país:");
        string codigo = Console.ReadLine();

        if (paises.ContainsKey(codigo))
        {
            Console.WriteLine("País: " + paises[codigo]);
        }
        else
        {
            Console.WriteLine("Código no encontrado.");
        }
    }
}

Operaciones principales en un Diccionario

OperaciónDescripciónComplejidad
Add(clave, valor)Agrega un par clave-valorO(1)
Remove(clave)Elimina un elemento por su claveO(1)
ContainsKey(clave)Verifica si una clave existeO(1)
TryGetValue(clave, out valor)Obtiene un valor sin lanzar excepciónO(1)

HashTable en C#

Una HashTable es similar a un Dictionary, pero más antigua y menos optimizada.

Características de HashTable

  • Almacena datos como pares clave-valor.
  • No es genérica, lo que implica conversiones de tipo (boxing/unboxing).
  • Puede almacenar claves de diferentes tipos, pero esto es menos seguro.

Implementación de una HashTable en C#

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Hashtable empleados = new Hashtable();

        empleados.Add(101, "Ana");
        empleados.Add(102, "Carlos");
        empleados.Add(103, "Pedro");

        Console.WriteLine("Ingrese un ID de empleado:");
        int id = Convert.ToInt32(Console.ReadLine());

        if (empleados.ContainsKey(id))
        {
            Console.WriteLine("Empleado: " + empleados[id]);
        }
        else
        {
            Console.WriteLine("ID no encontrado.");
        }
    }
}

Diferencias entre Diccionario y HashTable

CaracterísticaDiccionario (Dictionary<TKey, TValue>)HashTable
GenéricoSí (Dictionary<int, string>)No
RendimientoMás rápido y optimizadoMás lento
Seguridad de tiposEstricto (solo acepta tipos definidos)Permite cualquier tipo (requiere casting)
Uso recomendadoAplicaciones modernas en C#Código antiguo o interoperabilidad

Caso de uso real

Un sistema de autenticación de usuarios puede utilizar un diccionario para almacenar usuarios y contraseñas encriptadas.

Ejemplo en C#: Autenticación con Diccionario

using System;
using System.Collections.Generic;

class Autenticacion
{
    static void Main()
    {
        Dictionary<string, string> usuarios = new Dictionary<string, string>
        {
            { "admin", "1234" },
            { "usuario1", "abcde" }
        };

        Console.WriteLine("Ingrese usuario:");
        string usuario = Console.ReadLine();

        Console.WriteLine("Ingrese contraseña:");
        string contraseña = Console.ReadLine();

        if (usuarios.ContainsKey(usuario) && usuarios[usuario] == contraseña)
        {
            Console.WriteLine("Acceso concedido.");
        }
        else
        {
            Console.WriteLine("Usuario o contraseña incorrectos.");
        }
    }
}

Este ejemplo permite almacenar usuarios y validar credenciales rápidamente con O(1) en búsquedas.

Desafío práctico

Ejercicio:

  1. Crea un diccionario que almacene nombres de productos y sus precios. Permite al usuario buscar el precio ingresando el nombre del producto.
  2. Implementa una HashTable para almacenar códigos de empleados y sus roles en la empresa, permitiendo al usuario consultar su rol ingresando el código.

Resumen de la clase

  • Diccionarios: Estructura clave-valor con acceso en O(1).
  • HashTables: Similar a los diccionarios, pero menos eficiente y sin tipado genérico.
  • Diferencias entre ambas estructuras y cuándo usarlas.
  • Caso de uso real aplicado a sistemas de autenticación.

Próxima clase: Árboles y Grafos – Conceptos básicos y usos

En la siguiente clase aprenderemos sobre Árboles y Grafos, estructuras utilizadas para representar datos de manera jerárquica o en redes, aplicadas en sistemas como redes sociales, navegación GPS y bases de datos.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *