57 votos

¿Cómo aparecen aquí los números catalanes?

El Números catalanes tienen fama de aparecer en todas partes, pero la ocurrencia descrita a continuación, en el análisis de un algoritmo (incorrecto), sigue siendo un misterio para mí, y tengo curiosidad por encontrar una explicación.


Para situaciones en las que un algoritmo de ordenación en tiempo cuadrático es suficientemente rápido, suelo utilizar lo siguiente:

//Given array a[1], ... a[n]
for i = 1 to n:
    for j = i+1 to n:
        if a[i] > a[j]:
            swap(a[i],a[j])

Se parece a la ordenación por burbujas, pero se acerca más a la ordenación por selección. Es fácil ver por qué funciona: en cada iteración del bucle exterior, a[i] se establece como el elemento más pequeño de a[i…n] .

En un concurso de programación hace muchos años, uno de los problemas se reducía esencialmente a la ordenación:

Dada una lista de valores distintos $W_1, W_2, \dots, W_n$ , encontrar los índices cuando se ordena en orden ascendente. En otras palabras, encontrar la permutación $(S_1, S_2, \dots, S_n)$ para lo cual $W_{S_1} < W_{S_2} < \dots < W_{S_n}$ .

Se trata simplemente de operar sobre los índices y no sobre el array directamente, por lo que el código correcto sería:

//Given arrays S[1], ..., S[n] (initially S[i]=i i) and W[1], ..., W[n]
for i = 1 to n:
    for j = i+1 to n:
        if W[S[i]] > W[S[j]]:
            swap(S[i],S[j])

Pero en el fragor del concurso, en su lugar codifiqué un programa que lo hacía, incorrectamente:

for i = 1 to n:
    for j = i+1 to n:
        if W[i] > W[j]:
            swap(S[i],S[j])

Me di cuenta del error una vez finalizado el concurso, y más tarde, mientras esperaba los resultados, con desesperado optimismo intenté calcular las probabilidades de que, para algunas entradas, mi programa diera accidentalmente la respuesta correcta de todos modos. En concreto, conté el número de permutaciones de una lista arbitraria $W_1, \dots, W_n$ con valores distintos (ya que sólo su pedir no sus valores reales) para los que el algoritmo incorrecto anterior da la respuesta correcta, para cada n:

n       Number of "lucky" permutations
0       1
1       1
2       2
3       5
4       14
5       42
6       132
7       429
8       1430
9       4862
10      16796
11      58786
12      208012

¡Estos son los números catalanes! ¿Pero por qué? He intentado probarlo de vez en cuando en mi tiempo libre, pero nunca lo he conseguido.


Lo que he probado:

  • El (pseudo)algoritmo puede representarse en una notación más formal como el producto de todas las inversiones en una permutación. Es decir, queremos demostrar que el número de permutaciones $\sigma \in S_n$ tal que $$\prod_{i=1}^{n}\prod_{\substack{j \in \left\{i+1,i+2,\ldots,n\right\}; \\ \sigma_i > \sigma_j}}(i,j) = \sigma^{-1}$$ (con la convención de que la multiplicación se hace de izquierda a derecha) es $C_n$ . Este cambio de notación no simplifica el problema.

  • He hojeado brevemente La famosa lista de problemas catalanes de Stanley pero esto no parece estar (directamente) en la lista. :-)

  • Algunos experimentos informáticos sugieren que las permutaciones afortunadas son las que evitan el patrón 312, cuyo número parece ser el de los números catalanes. Pero no tengo ni idea de cómo probar esto, y puede que no sea el mejor enfoque...

22voto

John Fouhy Puntos 759

Tus sospechas son correctas. Demostremos que una permutación es afortunada si evita el patrón 312.

Para una inyección $W$ de $\{1,\ldots,k\}$ a $\{n-k+1,\ldots,n\}$ , dejemos que $N(W)$ denotan el resultado de eliminar $W(1)$ y aumentando todos los elementos por debajo de $W(1)$ por $1$ . Por ejemplo, $N(32514) = N(3524)$ .

Lema 1. Si $W$ evita $312$ entonces también lo hace $N(W)$ .

Prueba. Está claro que el orden relativo de los elementos en $N(W)$ es el mismo que los elementos correspondientes en $W$ .

Lema 2. Supongamos que $W$ evita $312$ . Después de ejecutar una ronda del algoritmo, $S(1)$ contiene el índice del elemento mínimo en $W$ y $W \circ S = N(W)$ .

Prueba. El lema está claro si $W(1)$ es el elemento mínimo. En caso contrario, ya que $W$ evita $312$ todos los elementos de abajo $W(1)$ forman una secuencia decreciente $W(1) = W(i_1) > \cdots > W(i_k)$ . El algoritmo pone la mínima $W(i_k)$ en $S(1)$ y pone $W(i_t)$ en $W(i_{t+1})$ .

Teorema 1. Si $W$ evita $312$ entonces $W$ tiene suerte.

Prueba. Aplique el lema 2 repetidamente. El lema 1 asegura que la inyección siempre evita $312$ .

Para la otra dirección, hay que tener un poco más de cuidado.

Lema 3. Si $W$ contiene un patrón $312$ en el que $3$ no se corresponde con $W(1)$ entonces $N(W)$ contiene un patrón $312$ .

Prueba. El patrón sobrevive en $N(W)$ ya que se mantienen todas las posiciones relativas.

Lema 4. Si $W$ no contiene un patrón $312$ en el que $3$ corresponde a $W(1)$ y $1$ corresponde al mínimo de $W$ después de ejecutar una ronda del algoritmo, $S(1)$ contiene el índice del elemento mínimo, y $W \circ S = N(W)$ .

Prueba. Se deduce directamente de la prueba del lema 2.

Por lo tanto, debemos esperar problemas si hay $i<j$ tal que $W(1) > W(j) > W(i)$ . Sin embargo, si $W(i)$ no es el elemento mínimo, el problema no será inmediato.

Enumerar los elementos que son más pequeños que $W(1)$ como $W(t_1),\ldots,W(t_k)$ y supongamos que $W(t_r) < W(t_{r+1}) > \cdots > W(t_k)$ . Una ronda del algoritmo pone $t_r$ en el lugar de $t_{r+1}$ . Las siguientes rondas mantienen el orden relativo de los elementos en las posiciones $t_{r+1},\ldots,t_k$ y así, en el resultado final, la posición que debería haber contenido $t_{r+1}$ contendrá $t_r$ .

Ejemplo: $W = 632541$ . El resultado final es $S = 652134$ que corresponde a la permutación $143625$ . Podemos ver que $S(1)$ es correcto ya que $W$ satisface las condiciones del lema 4. Tenemos $t_r = 3$ y $W(t_r) = 2, W(t_{r+1}) = 5$ . Vemos que efectivamente $W(S(5)) = 2$ en lugar de $5$ .

Teorema 2. Si $W$ contiene $312$ entonces $W$ tiene mala suerte.

Prueba. En la línea de la discusión anterior.

0 votos

Wow, genial, ¡gracias! Una cosa que no entiendo: si W contiene un 312 tal que el 3 corresponde a W(1), entonces veo el error en S al final. Pero en el otro caso - W contiene un 312, pero no tal que 3 corresponde a W(1) - entonces no estoy seguro de cómo va la prueba: ¿es cierto que después de 1 ronda, $W \circ S = N(W)$ ?

0 votos

Debería ser cierto, lo he añadido al enunciado del lema 4.

0 votos

Perdón por haberme olvidado de marcar esto como aceptado. :-) Lo he hecho ahora mismo. Gracias de nuevo por la gran respuesta.

8voto

Shay Levy Puntos 609

Creo que tu programa está haciendo algo muy parecido a una simple ordenación por pila. Encontré este documento en línea http://www.combinatorics.org/Volume_9/PDF/v9i2a1.pdf que explica tanto la ordenación básica de la pila como algunas variaciones. En el caso de la ordenación básica de la pila, Donald Knuth ha demostrado que el número de permutaciones ordenables de longitud n es $C_n$ (esta es la proposición 1.3 en el documento vinculado).

Tu método no replica exactamente la ordenación por pila, pero creo que producirá una versión desplazada cíclicamente de lo que producirá el algoritmo de ordenación por pila. Voy a editar mi respuesta si me doy cuenta de algunos detalles más.

1 votos

Gracias sí, vi en Wikipedia que Knuth había demostrado que $C_n$ es el número de permutaciones apilables, y esas son precisamente las permutaciones que evitan 231 (así es como me di cuenta de que las permutaciones afortunadas evitan 312). Pero no había mirado la clasificación por pila en detalle; +1 por la referencia.

0 votos

Sería genial ver una conexión con la clasificación de pilas. También pensaré en esto. :-)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X