¿Qué es una tabla hash?

 https://www.youtube.com/watch?v=Vhh3zsEO1Vw&list=PLgnN9Nj_TpSQ5XE8k5yLaiUk34tsvd_1k&index=1

¿Qué es una tabla hash?

Imagina que tienes un diccionario real. Para buscar una palabra, no revisas página por página, sino que vas directamente a la sección que corresponde a la primera letra. Las tablas hash funcionan de manera similar.

Conceptos básicos

1. Clave-Valor

Cada elemento en una tabla hash tiene:

  • Clave (key): Identificador único

  • Valor (value): Dato asociado a la clave

python
# En Python, usamos diccionarios para implementar tablas hash
mi_diccionario = {
    "nombre": "Ana",
    "edad": 25,
    "ciudad": "Madrid"
}

2. Función Hash

Es una función que convierte una clave en un índice numérico:

python
# Ejemplo simple de función hash
def hash_simple(clave, tamaño_tabla):
    return len(clave) % tamaño_tabla

# Probemos la función
print(hash_simple("nombre", 10))  # Output: 6
print(hash_simple("edad", 10))    # Output: 4

Operaciones básicas

1. Crear una tabla hash

python
# Método 1: Directamente
persona = {"nombre": "Carlos", "edad": 30}

# Método 2: Con dict()
persona = dict(nombre="Carlos", edad=30)

# Método 3: Desde una lista de tuplas
datos = [("nombre", "Carlos"), ("edad", 30)]
persona = dict(datos)

2. Agregar elementos

python
inventario = {}
inventario["manzanas"] = 10
inventario["naranjas"] = 5
inventario["plátanos"] = 8

print(inventario)  # {'manzanas': 10, 'naranjas': 5, 'plátanos': 8}

3. Acceder a elementos

python
print(inventario["manzanas"])  # 10

# Método seguro (evita errores si la clave no existe)
print(inventario.get("uvas", 0))  # 0 (valor por defecto)

4. Modificar elementos

python
inventario["manzanas"] = 15
print(inventario["manzanas"])  # 15

5. Eliminar elementos

python
del inventario["naranjas"]
print(inventario)  # {'manzanas': 15, 'plátanos': 8}

# O usando pop()
cantidad = inventario.pop("plátanos")
print(f"Se removieron {cantidad} plátanos")

Ejemplo práctico: Agenda telefónica

python
# Crear agenda
agenda = {}

# Agregar contactos
agenda["Ana"] = "123-456-789"
agenda["Carlos"] = "987-654-321"
agenda["Maria"] = "555-123-456"

# Buscar un número
nombre = "Ana"
if nombre in agenda:
    print(f"El número de {nombre} es: {agenda[nombre]}")
else:
    print(f"{nombre} no está en la agenda")

# Mostrar todos los contactos
print("\nTodos los contactos:")
for nombre, telefono in agenda.items():
    print(f"{nombre}: {telefono}")

# Actualizar un número
agenda["Ana"] = "111-222-333"
print(f"\nNuevo número de Ana: {agenda['Ana']}")

Manejo de colisiones

A veces dos claves diferentes pueden generar el mismo índice hash. Python maneja esto automáticamente, pero es importante entender el concepto:

python
# Ejemplo simplificado de colisión
class TablaHashSimple:
    def __init__(self, tamaño=10):
        self.tamaño = tamaño
        self.tabla = [[] for _ in range(tamaño)]  # Lista de listas
    
    def hash(self, clave):
        return hash(clave) % self.tamaño
    
    def agregar(self, clave, valor):
        indice = self.hash(clave)
        # Buscar si la clave ya existe
        for i, (k, v) in enumerate(self.tabla[indice]):
            if k == clave:
                self.tabla[indice][i] = (clave, valor)
                return
        # Si no existe, agregar
        self.tabla[indice].append((clave, valor))
    
    def obtener(self, clave):
        indice = self.hash(clave)
        for k, v in self.tabla[indice]:
            if k == clave:
                return v
        return None

# Probemos nuestra tabla hash simple
mi_tabla = TablaHashSimple()
mi_tabla.agregar("fruta", "manzana")
mi_tabla.agregar("color", "rojo")

print(mi_tabla.obtener("fruta"))  # manzana
print(mi_tabla.obtener("color"))  # rojo

Ventajas de las tablas hash

  1. Acceso rápido: O(1) en promedio

  2. Flexibilidad: Pueden almacenar diferentes tipos de datos

  3. Fáciles de usar: Sintaxis simple en Python

Desventajas

  1. No mantienen orden (aunque Python 3.7+ sí mantiene el orden de inserción)

  2. Pueden tener colisiones

  3. No son eficientes para recorrer en orden

Ejercicio para practicar

Crea un sistema de calificaciones de estudiantes:

python
# Tu código aquí
calificaciones = {}

# Agregar calificaciones
calificaciones["Ana"] = 8.5
calificaciones["Carlos"] = 7.8
calificaciones["Maria"] = 9.2

# Calcular promedio
def calcular_promedio(calificaciones_dict):
    if not calificaciones_dict:
        return 0
    return sum(calificaciones_dict.values()) / len(calificaciones_dict)

print(f"Promedio: {calcular_promedio(calificaciones):.2f}")

# Encontrar la calificación más alta
estudiante_max = max(calificaciones, key=calificaciones.get)
print(f"Mejor estudiante: {estudiante_max} con {calificaciones[estudiante_max]}")

Comentarios

Entradas populares de este blog

¿Qué es un Closure?

Calculadora de edad

Funciones en Python: con y sin paréntesis