È noto che questo algoritmo 'ingenuo' per mescolare un array scambiando ogni elemento con un altro scelto casualmente non funziona correttamente:
for (i=0..n-1)
swap(A[i], A[random(n)]);
In particolare, poiché a ciascuna delle iterazioni viene fatta una delle scelte (con probabilità uniforme), ci sono possibili "percorsi" attraverso il calcolo; perché il numero di possibili permutazioninon si divide uniformemente nel numero di percorsi , è impossibile per questo algoritmo produrre ciascuno deipermutazioni con uguale probabilità. (Invece, si dovrebbe usare il cosiddetto shuffle Fischer-Yates , che essenzialmente cambia la chiamata per scegliere un numero casuale da [0..n) con una chiamata per scegliere un numero casuale da [i..n); questo è discutibile per la mia domanda.)n
Quello che mi chiedo è: quanto può essere brutto l'ingenuo shuffle? Più specificamente, lasciando che sia l'insieme di tutte le permutazioni e sia il numero di percorsi attraverso l'algoritmo ingenuo che produce la permutazione risultante , qual è il comportamento asintotico del funzioniP ( n )
M ( n ) = n !n n maxρ∈P(n)C(ρ)
e
m ( n ) = n !n n minρ∈P(n)C(ρ)
Il fattore principale è "normalizzare" questi valori: se l'ingenuo shuffle è "asintoticamente buono", allora
lim n → ∞ M(n)= lim n → ∞ m(n)=1
Ho il sospetto (basato su alcune simulazioni al computer che ho visto) che i valori effettivi siano delimitati da 1, ma è noto anche se lim M ( n )