Números de Catalan
Los números de Catalan (Catalan numbers) son una sucesión numérica que resulta útil en varios problemas combinatorios, a menudo relacionados con objetos definidos de forma recursiva.
Esta sucesión recibió su nombre del matemático belga Catalan , que vivió en el siglo XIX. (De hecho ya la conocía Euler, que vivió un siglo antes que Catalan).
Los primeros números de Catalan (empezando desde cero):
Aplicación en algunos problemas combinatorios
El número de Catalan es la solución de
- Número de secuencias de paréntesis correctas formadas por paréntesis de apertura y de cierre.
- El número de árboles binarios plenos con raíz con hojas (los vértices no están numerados). Un árbol binario con raíz es pleno si cada vértice tiene o bien dos hijos o bien ninguno.
- El número de formas de parentizar por completo factores.
- El número de triangulaciones de un polígono convexo con lados (es decir, el número de particiones del polígono en triángulos disjuntos usando las diagonales).
- El número de formas de conectar los puntos de una circunferencia para formar cuerdas disjuntas.
- El número de árboles binarios plenos no isomorfos con nodos internos (es decir, nodos que tienen al menos un hijo).
- El número de caminos monótonos en el retículo desde el punto hasta el punto en un retículo cuadrado de tamaño , que no pasan por encima de la diagonal principal (es decir, la que une con ).
- Número de permutaciones de longitud que se pueden ordenar con una pila (stack sorted) (es decir, se puede mostrar que el reordenamiento es ordenable con una pila si y solo si no existe un índice tal que ).
- El número de particiones no cruzadas de un conjunto de elementos.
- El número de formas de cubrir la escalera usando rectángulos (la escalera consiste en columnas, donde la -ésima columna tiene altura ).
Cálculos
Hay dos fórmulas para los números de Catalan: recursiva y analítica. Como creemos que todos los problemas mencionados arriba son equivalentes (tienen la misma solución), para la demostración de las fórmulas de abajo elegiremos la tarea en la que es más fácil hacerlo.
Fórmula recursiva
La fórmula de recurrencia se puede deducir fácilmente del problema de la secuencia de paréntesis correcta.
El paréntesis de apertura más a la izquierda corresponde a cierto paréntesis de cierre , que divide la secuencia en 2 partes que a su vez deben ser una secuencia de paréntesis correcta. Así, la fórmula también se divide en 2 partes. Si denotamos , entonces para fijo habrá exactamente tales secuencias de paréntesis. Sumando esto sobre todos los admisibles, obtenemos la relación de recurrencia sobre .
También se puede pensar de la siguiente manera. Por definición, denota el número de secuencias de paréntesis correctas. Ahora, la secuencia se puede dividir en 2 partes de longitud y , cada una de las cuales debe ser una secuencia de paréntesis correcta. Ejemplo:
se puede dividir en y , pero no se puede dividir en y . De nuevo, sumando sobre todos los admisibles, obtenemos la relación de recurrencia sobre .
Implementación en C++
const int MOD = ....
const int MAX = ....
int catalan[MAX];
void init() {
catalan[0] = catalan[1] = 1;
for (int i=2; i<=n; i++) {
catalan[i] = 0;
for (int j=0; j < i; j++) {
catalan[i] += (catalan[j] * catalan[i-j-1]) % MOD;
if (catalan[i] >= MOD) {
catalan[i] -= MOD;
}
}
}
}Fórmula analítica
(acá denota el coeficiente binomial habitual, es decir, el número de formas de seleccionar objetos de un conjunto de objetos).
La fórmula de arriba se puede concluir fácilmente a partir del problema de los caminos monótonos en una cuadrícula cuadrada. El número total de caminos monótonos en el retículo de tamaño está dado por .
Ahora contamos el número de caminos monótonos que cruzan la diagonal principal. Consideremos tales caminos que cruzan la diagonal principal y encontremos la primera arista que queda por encima de la diagonal. Reflejamos el camino respecto de la diagonal todo el trayecto que sigue después de esta arista. El resultado es siempre un camino monótono en la cuadrícula . Por otro lado, cualquier camino monótono en el retículo debe intersectar la diagonal. Por lo tanto, enumeramos todos los caminos monótonos que cruzan la diagonal principal en el retículo .
El número de caminos monótonos en el retículo es . Llamemos a tales caminos “caminos malos”. Como resultado, para obtener el número de caminos monótonos que no cruzan la diagonal principal, restamos los “caminos malos” de arriba, y obtenemos la fórmula: