Asignar elementos a posiciones diferenciadas convierte cada elección en una decisión ordenada y permite aplicar principios de conteo y variaciones.
Muchos problemas informáticos consisten en asignar objetos a lugares: tareas a turnos, personas a cargos, recursos a servidores o valores a campos.
La pregunta clave es si las posiciones tienen identidad. Si cambiar los elementos de lugar produce una asignación diferente, el orden importa y debemos contar las posiciones una por una.
Una posición es diferenciada cuando tiene un nombre o función propia. Por ejemplo, presidente, secretario y tesorero son posiciones distintas.
Cuando las posiciones son distintas, una asignación es una secuencia ordenada de elementos.
Si hay n elementos y k posiciones, y cada elemento puede ocupar como máximo una posición, la cantidad de asignaciones es:
La primera posición tiene n opciones, la segunda n-1 y así sucesivamente.
De 8 personas se deben asignar 3 cargos diferentes:
La asignación de una persona a un cargo reduce las opciones para los cargos siguientes porque no se permite repetir personas.
Selecciona la cantidad de elementos y posiciones. La simulación genera asignaciones sin repetir y muestra el total calculado.
Si un elemento puede ocupar varias posiciones, cada posición mantiene las mismas n opciones. La cantidad es:
Por ejemplo, asignar uno de 4 estados a cada uno de 3 campos permite 43 = 64 configuraciones si los estados pueden repetirse.
La función genera asignaciones a posiciones diferenciadas sin reutilizar el elemento seleccionado.
function asignar(elementos, posiciones, inicio = 0, actual = [], resultados = []) {
if (actual.length === posiciones) {
resultados.push([...actual]);
return resultados;
}
elementos.forEach((elemento, indice) => {
if (actual.includes(elemento)) return;
asignar(elementos, posiciones, indice + 1, [...actual, elemento], resultados);
});
return resultados;
}
console.log(asignar(["A", "B", "C"], 2));
En este ejemplo, el parámetro inicio no se necesita para recorrer combinaciones; las posiciones pueden recibir cualquier elemento que todavía no haya sido utilizado.
Si primero elegimos k elementos de un conjunto de n y luego los asignamos a k posiciones, podemos separar el conteo en dos etapas:
La primera etapa selecciona el grupo y la segunda decide qué elemento ocupa cada posición.
En una asignación real, no todos los elementos pueden ocupar todas las posiciones. Puede haber capacidades, permisos o incompatibilidades.
Si las opciones dependen de decisiones anteriores, conviene usar un árbol de casos, separar situaciones o generar solo asignaciones válidas.
Si las posiciones no se distinguen, cambiar dos elementos de lugar no produce una asignación nueva. En ese caso el problema se parece a una combinación o a una distribución de objetos.
Contar posiciones y asignaciones requiere determinar si cada lugar tiene una identidad y si los elementos pueden repetirse. Una vez definido el modelo, las variaciones, combinaciones y principios de conteo permiten calcular las asignaciones posibles.
En el próximo tema estudiaremos el conteo de cadenas y secuencias, donde las posiciones representan lugares dentro de una sucesión.