¿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
# 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:
# 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
# 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
inventario = {} inventario["manzanas"] = 10 inventario["naranjas"] = 5 inventario["plátanos"] = 8 print(inventario) # {'manzanas': 10, 'naranjas': 5, 'plátanos': 8}
3. Acceder a elementos
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
inventario["manzanas"] = 15 print(inventario["manzanas"]) # 15
5. Eliminar elementos
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
# 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:
# 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
Acceso rápido: O(1) en promedio
Flexibilidad: Pueden almacenar diferentes tipos de datos
Fáciles de usar: Sintaxis simple en Python
Desventajas
No mantienen orden (aunque Python 3.7+ sí mantiene el orden de inserción)
Pueden tener colisiones
No son eficientes para recorrer en orden
Ejercicio para practicar
Crea un sistema de calificaciones de estudiantes:
# 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
Publicar un comentario