Come dimostrare la correttezza di un algoritmo shuffle?


24

Ho due modi per produrre un elenco di articoli in un ordine casuale e vorrei determinare se sono ugualmente equi (imparziali).

Il primo metodo che uso è quello di costruire l'intero elenco di elementi e quindi fare un riordino su di esso (diciamo un riordino Fisher-Yates). Il secondo metodo è più di un metodo iterativo che mantiene mescolato l'elenco ad ogni inserimento. Nello pseudo-codice la funzione di inserimento è:

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

Sono interessato a come si fa a dimostrare l'imparzialità di questo particolare rimescolamento. I vantaggi di questo algoritmo, dove viene utilizzato, sono sufficienti che, anche se leggermente ingiusto, andrebbe bene. Per decidere ho bisogno di un modo per valutarne l'equità.

La mia prima idea è che ho bisogno di calcolare le permutazioni totali possibili in questo modo rispetto alle permutazioni totali possibili per un set della lunghezza finale. Sono un po 'perplesso su come calcolare le permutazioni risultanti da questo algoritmo. Inoltre, non posso essere certo che questo sia l'approccio migliore o più semplice.


È possibile eseguire un campione statistico su un gran numero di esecuzioni dell'algoritmo e confrontarlo con il valore previsto oppure eseguire una sorta di test di casualità su di esso.
Dave Clarke,

Vuoi testare la distribuzione. È distribuito uniformemente o inclinato. Sospetto, tuttavia, che avresti bisogno di eseguirlo molte molte molte volte.
Dave Clarke,

Non sono chiaro su come lo farei. Non è la casualità dei contenuti che sto cercando, ma la casualità dell'ordine. Quale approccio può misurare la distribuzione dell'ordine?
edA-qa mort-ora-y

Ah, sciocco me, potrei usare un set di input fisso e usare la posizione finale di ogni elemento per ottenere una distribuzione. Preferirei invece più una prova logica che una simulazione.
edA-qa mort-ora-y

@ edA-qamort-ora-y: Il tuo desiderio è il mio comando. ;)
Raffaello

Risposte:


22

Innanzitutto, facciamo due ipotesi forse ovvie, ma importanti:

  1. _.random_item può scegliere l'ultima posizione.
  2. _.random_itemsceglie ogni posizione con probabilità .1n+1

Per dimostrare la correttezza del tuo algoritmo, hai bisogno di un argomento induttivo simile a quello usato qui :

  • Per la lista singleton esiste una sola possibilità, quindi viene scelta in modo uniforme.
  • Supponendo che l'elenco con elementi sia stato scelto in modo uniforme (tra tutte le permutazioni), mostra che quello con n + 1 elementi ottenuti con la tua tecnica è scelto in modo uniforme.nn+1

Da qui in poi, la prova è sbagliata. Vedi sotto per una prova corretta; Lascio questo qui perché sia ​​l'errore che i seguenti passaggi (che sono validi) potrebbero essere educativi.

È utile derivare una proprietà locale (vale a dire elemento) che deve essere trattenuta, perché discutere sull'intera permutazione è doloroso. Osserva che una permutazione viene scelta in modo uniforme se ogni elemento ha la stessa probabilità di trovarsi in ogni posizione, ad es

πPermnPr(L=π)=1n!io=1n j=1nPr(Lio=j)=1n(1)

dove e assumiamo per semplicità notazionale che inseriamo { 1 , ... , n } nell'elenco.n=|L|{1,,n}

Ora, vediamo cosa fa la tua tecnica quando inserisci l' elemento . Dobbiamo considerare tre casi (dopo lo scambio):n+1

  1. Uno degli elementi nell'elenco, non scambiato, ovvero e j { 1 , ... , n }i{1,,n}j{1,,n}
  2. Uno degli elementi nell'elenco, scambiato, ovvero e j { 1 , , n }i=n+1j{1,,n}
  3. Il nuovo elemento, ovvero e j = n + 1i{1,,n+1}j=n+1

Per ogni caso, calcoliamo la probabilità che l'elemento trovi nella posizione i ; tutti devono risultare 1ji (che è sufficiente a causa di(1)). Siapn=11n+1(1) è la probabilità che uno dei priminelementi si trovi in ​​qualsiasi posizione nella vecchia lista (ipotesi di induzione) eps=1pn=1nn la probabilità che una posizione venga scelta da(ipotesi 1, 2). Si noti che la coice dell'elenco connelementi e la selezione della posizione di swap sonoeventi indipendenti, quindi le probabilità del fattore eventi congiunti, ad esempiops=1n+1random_itemn

Pr(Li=j,i swapped)=Pr(Li=j)Pr(i swapped)=pnps

per . Ora per i calcoli.i,j{1,,n}

  1. Consideriamo solo i vecchi elementi. Un tale elemento j è nella posizione i se e solo se era lì prima dell'ultimo inserimento e i non è selezionato come posizione di swap, cioè njii

    .Pr(Li=j)=pn(1ps)=1nnn+1=1n+1

  2. Qui consideriamo che uno dei vecchi elementi viene scambiato all'ultima posizione. L'elemento avrebbe potuto trovarsi in una qualsiasi delle vecchie posizioni, quindi sommiamo tutte le probabilità che j fosse nella posizione i e i sia scelto come posizione di swap, ovverojjii

    .Pr(Ln+1=j)=i=1npnps=i=1n1n1n+1=1n+1

  3. Il nuovo elemento finisce alla posizione se e solo se i è scelto come posizione di swap, cioèii

    .Pr(Li=j)=ps=1n+1

Tutto è andato bene, la tua strategia di inserimento preserva davvero l'uniformità. Con il potere dell'induzione, ciò dimostra che il tuo algoritmo crea permutazioni uniformemente distribuite.

Un avvertimento: questa dimostrazione si interrompe se gli elementi inseriti non sono diversamente accoppiati. distinguibile, perché la prima equazione non è più valida. Ma il tuo algoritmo è ancora valido; ogni permutazione con duplicati è generata dallo stesso numero di esecuzioni casuali. È possibile provare ciò contrassegnando i duplicati (cioè rendendoli distinguibili), eseguire la prova sopra e rimuovere i segni (praticamente); l'ultimo passaggio fa collassare serie uguali di permutazioni uguali.


(1)

random_itemL(k){1,,k} aver inserito .

πPermn+1{1,,n+1}

π=(π(1),π(2),,π(i1),n+1,π(i+1),,π(n),π(i))

πPermni{1,,n+1}. By induction hypothesis, Pr(L(n)=π)=1n!. Furthermore, random_item picks position i with probability 1n+1 by assumption. As the random choices of π and i are (stochastically) independent, we get

Pr(L(n+1)=π)=Pr(L(n)=π)Pr(i swapped)=1(n+1)!

which we had to show. By the power of induction, that proves that your algorithm creates uniformly distributed permutations.


  1. For example, assign every permutation in {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)} probability 14 and all others 0. There are also examples that assign every permutation a non-zero probability.

4
'Osserva che una permutazione viene scelta in modo uniforme se ogni elemento ha la stessa probabilità di trovarsi in ogni posizione' - questo non è vero. Ad esempio, l'insieme di quattro permutazioni su quattro elementi {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} soddisfa il tuo vincolo, ma ovviamente non è l'insieme di tutte le permutazioni. Sfortunatamente devi usare le proprietà globali della tua permutazione perché nessuna condizione locale è sufficiente per determinare l'uniformità.
Steven Stadnicki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.