Loading [MathJax]/extensions/TeX/mathchoice.js

26 votos

Permutaciones alternas aleatorias

Un permutación alternada de {1, ..., n} es uno donde π(1) > π(2) < π(3) > π(4) < ... Por ejemplo: (24153) es una permutación alterna de longitud 5.

Si En es el número de permutaciones alternas de longitud n, el secx+tanx=n0Enxnn! es la función generadora exponencial.

¿Cómo se muestrea la alternancia de permutaciones uniformemente al azar? El muestreo de rechazo se volvería rápidamente ineficaz, ya que Enn!4π(2π)n decae exponencialmente en n .

21voto

David Precious Puntos 4429

Esto es muy fácil - a menudo lo enseño en mis clases de combinatoria. Empiezas con este triángulo de tipo Pascal que tienes que precalcular: http://mathworld.wolfram.com/Seidel-Entringer-ArnoldTriangle.html (lea el artículo de Arnold al que se hace referencia allí si el patrón no está claro o mi artículo de estudio con Postnikov "Increasing Trees and Alternating Permutations" - vea mi página web).

Ahora bien, tenga en cuenta que an,i el número i-ésimo de la fila n-ésima es el número de permutaciones alternas con la primera letra i (hay que alternar las direcciones). Luego se utiliza la programación dinámica o simplemente se elige la primera letra que será i con probabilidad an,ian,i+1 , lo que reduce el problema a una permutación alterna de [n1] . Me estoy saltando detalles (fáciles), pero confío en que puedas averiguar el resto a partir de aquí.

ACTUALIZACIÓN (10 de mayo de 2015):
Aparentemente, este algoritmo requiere O(n3) tiempo para calcular los números an,i que no está mal. Sin embargo, si uno sólo quiere calcular el número de permutaciones alternas, hay una manera más rápida: ver esta charla por Richard Brent y las diapositivas aquí .

10voto

anjanb Puntos 5579

Un O(nlogn) El algoritmo para muestrear uniformemente la permutación alterna es descrito por P. Marchal en *Generar permutaciones alternas en el tiempo O(nlogn) ." (por el contrario, la respuesta de Pak es O(n3), El muestreo de Boltzmann es O(n2).

7voto

Rakesh Juyal Puntos 203

Esto se trata con cierto detalle en el documento " Muestreo de Boltzmann de estructuras ordenadas ".

4voto

David Callan Puntos 31

A continuación se muestra el código de Mathematica basado en la respuesta de Igor Pak. Para obtener una permutación aleatoria hacia abajo en [n] Comienza por elegir la primera entrada p1 con la probabilidad adecuada; a continuación, elija al azar una permutación ascendente-descendente de tamaño n1 de las permutaciones arriba-abajo con la primera entrada <p1 y luego unirlos (incrementando las entradas p1 en la permutación arriba-abajo).

Para implementar este método, en realidad necesitamos un código que genere una permutación aleatoria de downup con la primera entrada un número determinado k y el código siguiente lo hace. Utiliza la operación ComplementPermutation para intercambiar permutaciones updown y downup.

(* e[n,k] es el número Entringer *)

e[0,0] = 1;
e[n_,0]/;n>=1 := 0;
e[n_,k_]/;k>n || k<0 := 0
e[n_,k_] := e[n,k] = e[n,k-1] + e[n-1,n-k]

ComplementoPermutación[perm_] := Módulo[{n=Longitud[perm]}, n+1-perm];

incrementSpecifiedAndUp[perm_,k_]:=perm/.{i_/;i>=k :> i+1};

partialSums[list_] := Drop[FoldList[Plus,0,list],1];

RandomUpDownPermFirstEntryAtMostk[n_,k_]/;k==n :=
RandomUpDownPermFirstEntryAtMostk[n,n-1];
RandomUpDownPermFirstEntryAtMostk[n_,k_]/;1<=k<n :=
ComplementoPermutación[RandomDownUpPermFirstEntryAtLeastk[n,n+1-k]]

RandomDownUpPermFirstEntryAtLeastk[1,1]={1}; RandomDownUpPermFirstEntryAtLeastk[2,2]={2,1};

RandomDownUpPermFirstEntryAtLeastk[n_,k_]/; n>=3 && 2<=k<=n := Módulo[{claves,m,i,primeraEntrada,restoDePerm},

(* elige la primera entrada utilizando la distribución Entringer *)
keys=partialSums[Table[e[n-1,j],{j,k-1,n-1}]];
m=Random[Integer,{1,Last[keys]}];
i=1;
While[Not[ m<=keys[[i]] ],i=i+1];
primeraEntrada=k-1+i;

(* elegir restOfPerm uniformemente de updowns con su primera entrada < primeraEntrada *)
restOfPerm=RandomUpDownPermFirstEntryAtMostk[n-1,k-2+i];

(* amalgamar firstEntry y restOfPerm *)
Join[{primeraEntrada},incrementSpecifiedAndUp[restoDePerm,primeraEntrada]] ]

RandomDownUpPerm[1]={1};
RandomDownUpPerm[n_]/;n>=2 := RandomDownUpPermFirstEntryAtLeastk[n,2]

Muestra de salida:
In[264]:=RandomDownUpPerm[15]
Out[264]=
{8, 2, 4, 1, 15, 6, 7, 3, 10, 9, 13, 11, 14, 5, 12}

3voto

Jason Baker Puntos 494

Una observación es que (como se menciona en Encuesta de Stanley ), las Permutaciones Alternas satisfacen una recurrencia E_{n+1}=\sum_{\textrm{odd } j \leq n}^n \binom{n}{j} E_j E_{n-j} Aquí j en el lado derecho corresponde al número de elementos que aparecen antes de 1 en la permutación.

Probablemente no sea la forma más eficiente, pero parece que se podría calcular E_k para todos k hasta n y luego construye tu permutación recursivamente eligiendo sucesivamente dónde va el elemento más pequeño y dividiendo las variables restantes en dos permutaciones alternas del tamaño adecuado en función de eso.

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