Tema 45: Combinatoria aplicada a estructuras de datos

Contar organizaciones posibles de datos para comprender su diseño, sus restricciones y el costo de procesarlas.

1. Combinatoria y estructuras de datos

Una estructura de datos organiza elementos siguiendo reglas determinadas. La combinatoria permite contar cuántas organizaciones distintas pueden formarse y estudiar qué ocurre cuando se agregan restricciones.

Ese conteo aparece al analizar memoria, recorridos, índices, configuraciones y operaciones posibles.

2. Secuencias ordenadas

Si n elementos distintos se colocan en una secuencia, existen n! ordenamientos posibles. El orden importa porque cambiar dos posiciones produce una secuencia diferente.

Con los elementos A, B y C se pueden formar: ABC, ACB, BAC, BCA, CAB y CBA.

Total: 3! = 6.

3. Listas con elementos repetidos

Cuando algunos valores se repiten, varias permutaciones dejan de ser distinguibles. Si hay n elementos y repeticiones de tamaños r1, r2, ..., el número de secuencias diferentes es:

n! / (r1! r2! ...)

Este conteo es útil para analizar listas con categorías o valores duplicados.

4. Pilas y colas

En una pila, los elementos se retiran en el orden inverso al de inserción. En una cola, se retiran en el mismo orden en que llegaron.

La combinatoria ayuda a contar secuencias de operaciones válidas, especialmente cuando se mezclan inserciones y extracciones bajo una regla de disponibilidad.

5. Secuencias de operaciones válidas

Una secuencia de operaciones de pila puede representarse con un símbolo de inserción y otro de extracción. Nunca puede haber más extracciones que inserciones en un prefijo, y al final ambas cantidades deben coincidir.

Por esa condición de balance, la cantidad de secuencias válidas está relacionada con los números de Catalan.

6. Árboles binarios

Los árboles binarios organizan cada nodo con hasta dos descendientes. Para una cantidad fija de nodos, pueden existir muchas formas estructurales distintas.

El número de árboles binarios completos con n nodos internos es Cn, un número de Catalan. La raíz separa el árbol en un subárbol izquierdo y uno derecho.

function catalan(n) {
  const valores = [1];
  for (let tam = 1; tam <= n; tam++) {
    valores[tam] = 0;
    for (let izquierda = 0; izquierda < tam; izquierda++) {
      valores[tam] += valores[izquierda] * valores[tam - 1 - izquierda];
    }
  }
  return valores[n];
}

console.log("Árboles con 3 nodos internos:", catalan(3)); // 5

7. Árboles de búsqueda

Al insertar claves distintas en un árbol de búsqueda, el orden de inserción puede producir estructuras diferentes. Para n claves, el número de formas estructurales posibles está relacionado con los números de Catalan.

La forma del árbol influye en la altura y, por tanto, en el costo de buscar, insertar o eliminar elementos.

8. Montículos y restricciones de orden

Un montículo es un árbol que cumple una relación de prioridad entre padres e hijos. No todas las permutaciones de valores son válidas; la propiedad de orden filtra las configuraciones posibles.

Contar estas configuraciones permite estudiar cuántos estados puede alcanzar una estructura durante un algoritmo.

9. Tablas y asignación de posiciones

Una tabla con n posiciones y valores elegidos de un conjunto de tamaño k puede tener kn configuraciones si se permite repetir valores. Si no se permite repetir, el número es una variación:

V(k, n) = k(k - 1)(k - 2) ... (k - n + 1)

10. Conjuntos y subconjuntos

Una estructura que representa una colección puede tener cualquier subconjunto de un universo de n elementos. Por eso existen 2n configuraciones posibles, incluyendo el conjunto vacío y el conjunto completo.

Si se fija el tamaño de la colección en k, el conteo se reduce a C(n, k).

11. Grafos almacenados como estructuras

Un grafo con n vértices puede tener diferentes conjuntos de aristas. En un grafo simple no dirigido, cada par de vértices puede estar conectado o no:

2C(n, 2) grafos simples distintos sobre n vértices etiquetados.

Esta cantidad explica por qué enumerar todos los grafos se vuelve costoso incluso con pocos vértices.

12. Recorridos y representaciones

Una misma estructura puede recorrerse de diferentes maneras. En árboles aparecen recorridos en preorden, inorden y postorden; en grafos, recorridos en anchura o profundidad.

El conteo permite distinguir entre las formas de recorrer una estructura y las configuraciones estructurales que pueden existir.

13. Ejemplo: configuraciones de una estructura

La siguiente función calcula cuántas formas existen de elegir y ordenar k elementos de un conjunto de n elementos. Es el conteo de variaciones sin repetición.

function variaciones(n, k) {
  if (k > n || k < 0) return 0;
  let resultado = 1;
  for (let i = 0; i < k; i++) {
    resultado *= n - i;
  }
  return resultado;
}

console.log(variaciones(5, 3)); // 60

14. Simulación: configuraciones según la estructura

Selecciona una cantidad de elementos y compara el número de secuencias ordenadas, subconjuntos y árboles binarios asociados.

Configura n y pulsa «Comparar configuraciones».
Estructura o colecciónCantidad de configuraciones

15. Elegir una representación

El conteo no reemplaza el diseño de una estructura de datos, pero permite conocer sus posibilidades y límites. Una representación adecuada debe facilitar las operaciones más importantes y evitar guardar información innecesaria.

Una estructura con muchas configuraciones posibles puede requerir índices, invariantes o restricciones para mantenerse eficiente y consistente.

16. Resumen

La combinatoria se aplica a listas, pilas, colas, árboles, conjuntos, tablas y grafos. Permutaciones, subconjuntos, variaciones y números de Catalan permiten contar configuraciones y secuencias válidas. Estos conteos ayudan a analizar memoria, recorridos, operaciones y complejidad algorítmica.