Las estructuras de datos implementan ideas de conjuntos para almacenar valores únicos, asociar claves, indexar información, representar grafos y optimizar búsquedas.
Las estructuras de datos permiten organizar información para consultarla, modificarla y recorrerla eficientemente. Muchas de ellas están basadas en ideas de teoría de conjuntos.
Un conjunto matemático se refleja en estructuras como Set, tablas hash, índices, mapas, grafos y colecciones de claves únicas.
Un arreglo almacena elementos en orden y puede contener duplicados. Un conjunto almacena valores únicos y no se centra en posiciones.
| Estructura | Orden | Duplicados | Uso típico |
|---|---|---|---|
| Array | Importa | Permite | Secuencias, listas ordenadas |
| Set | No es el criterio principal | No permite | Unicidad y pertenencia |
Set representa una colección de valores únicos.
const lenguajes = new Set(["JavaScript", "SQL", "JavaScript", "HTML"]);
console.log([...lenguajes]);
console.log(lenguajes.has("SQL"));
console.log(lenguajes.size);
La estructura elimina duplicados y permite consultar pertenencia.
Muchas implementaciones de conjuntos usan internamente tablas hash. Una tabla hash permite ubicar elementos rápidamente a partir de una clave.
El objetivo es que operaciones como agregar, buscar y eliminar sean eficientes.
Un Map asocia claves con valores. Puede interpretarse como una relación funcional donde cada clave tiene un único valor asociado.
const precios = new Map();
precios.set("teclado", 12000);
precios.set("mouse", 8000);
console.log(precios.get("teclado"));
console.log(precios.has("mouse"));
Las claves del mapa forman un conjunto de valores únicos.
Las claves de un mapa pueden verse como un conjunto.
const precios = new Map();
precios.set("teclado", 12000);
precios.set("mouse", 8000);
const productos = new Set(precios.keys());
console.log([...productos]);
Este conjunto contiene los productos que tienen precio registrado.
Un índice permite encontrar datos rápidamente. Conceptualmente, un índice puede verse como una relación entre una clave y los elementos que cumplen una propiedad.
const usuarios = [
{ id: 1, nombre: "Ana", rol: "admin" },
{ id: 2, nombre: "Luis", rol: "editor" },
{ id: 3, nombre: "Carla", rol: "admin" }
];
const idsPorRol = new Map();
for (const usuario of usuarios) {
if (!idsPorRol.has(usuario.rol)) {
idsPorRol.set(usuario.rol, new Set());
}
idsPorRol.get(usuario.rol).add(usuario.id);
}
console.log([...idsPorRol.get("admin")]);
El índice asocia cada rol con el conjunto de usuarios que lo tienen.
Un grafo puede representarse mediante un conjunto de nodos y un conjunto de aristas.
Las aristas pueden verse como pares ordenados o no ordenados, según el grafo sea dirigido o no dirigido.
Una lista de adyacencia puede usar mapas y conjuntos para representar vecinos.
const grafo = new Map();
grafo.set("A", new Set(["B", "C"]));
grafo.set("B", new Set(["C"]));
grafo.set("C", new Set());
console.log([...grafo.get("A")]);
Cada nodo se asocia con el conjunto de nodos alcanzables directamente.
Durante el recorrido de un grafo, un conjunto de visitados evita procesar el mismo nodo más de una vez.
const grafo = new Map();
grafo.set("A", new Set(["B", "C"]));
grafo.set("B", new Set(["C"]));
grafo.set("C", new Set());
function recorrer(inicio, grafo) {
const visitados = new Set();
const pila = [inicio];
while (pila.length) {
const nodo = pila.pop();
if (visitados.has(nodo)) continue;
visitados.add(nodo);
for (const vecino of grafo.get(nodo) ?? []) {
pila.push(vecino);
}
}
return visitados;
}
console.log([...recorrer("A", grafo)]);
El conjunto visitados controla pertenencia y evita ciclos infinitos.
Un conjunto puede registrar elementos ya procesados para no repetir trabajo.
const procesados = new Set();
function procesar(id) {
if (procesados.has(id)) {
return "ya procesado";
}
procesados.add(id);
return "procesado";
}
console.log(procesar(10));
console.log(procesar(10));
Esta técnica aparece en importaciones, sincronizaciones y tareas repetibles.
Algunas estructuras necesitan combinar una cola o lista ordenada con un conjunto auxiliar para consultas rápidas de pertenencia.
Combinar estructuras permite aprovechar fortalezas distintas.
Los conjuntos ayudan a normalizar datos cuando necesitamos valores únicos.
const correos = [
"ANA@correo.com",
"ana@correo.com",
"luis@correo.com"
];
const correosNormalizados = new Set(
correos.map(correo => correo.toLowerCase())
);
console.log([...correosNormalizados]);
Primero se normalizan los valores y luego se eliminan duplicados.
| Estructura | Idea de conjuntos | Uso |
|---|---|---|
| Set | Colección de valores únicos | Pertenencia y duplicados |
| Map | Relación funcional clave-valor | Índices y asociaciones |
| Grafo | Conjunto de nodos y aristas | Redes y dependencias |
| Índice invertido | Clave asociada a conjunto de documentos | Búsqueda |
| Caché de visitados | Conjunto de elementos procesados | Evitar repeticiones |
Las estructuras de datos aplican conceptos de teoría de conjuntos para representar unicidad, pertenencia, relaciones, índices y conexiones. Entender estas ideas permite elegir estructuras más adecuadas y diseñar algoritmos más claros.
En el próximo tema estudiaremos aplicaciones de conjuntos en bases de datos y SQL.