D'abord, faisons deux hypothèses peut-être évidentes mais importantes:
_.random_item
peut choisir la dernière position.
_.random_item
choisit chaque position avec probabilité .1n + 1
Afin de prouver l'exactitude de votre algorithme, vous avez besoin d'un argument inductif similaire à celui utilisé ici :
- Pour la liste singleton, il n'y a qu'une seule possibilité, elle est donc uniformément choisie.
- En supposant que la liste avec éléments a été uniformément choisie (parmi toutes les permutations), montrez que celle avec n + 1 éléments obtenue par votre technique est uniformément choisie.nn + 1
A partir de là, la preuve est fausse. Veuillez voir ci-dessous pour une preuve correcte; Je laisse cela ici parce que l'erreur et les étapes suivantes (qui sont saines) peuvent être éducatives.
Il est utile de dériver une propriété locale (c'est-à-dire au niveau des éléments) qui doit tenir, car discuter de la permutation entière est douloureux. Observez qu'une permutation est uniformément choisie si chaque élément a une probabilité égale d'être à chaque position, c'est-à-dire
∀π∈ P e r mnPr( L = π) = 1n !⟺∀i = 1n ∀j = 1nPr( Lje= j ) = 1n( 1 )
où et nous supposons par souci de simplicité de notation que nous insérons { 1 , … , n } dans la liste.n = | L |{ 1 , … , n }
Voyons maintenant ce que fait votre technique lors de l'insertion du er élément. Nous devons considérer trois cas (après l'échange):n + 1
- Un des éléments de la liste, non échangé, à savoir et j ∈ { 1 , … , n }i ∈ { 1 , … , n }j ∈ { 1 , … , n }
- Un des éléments de la liste, échangé, ie et j ∈ { 1 , … , n }i = n + 1j ∈ { 1 , … , n }
- Le nouvel élément, ie et j = n + 1i∈{1,…,n+1}j=n+1
Pour chaque cas, nous calculons la probabilité que l'élément soit en position i ; tous doivent se révéler être 1ji (ce qui est suffisant en raison de(1)). Soitpn=11n+1(1) la probabilité qu'un desnpremierséléments se trouve à n'importe quelle position dans l'ancienne liste (hypothèse d'induction), etps=1pn=1nn la probabilité que n'importe quelle position soit choisie par(hypothèses 1, 2). Notez que le choix de la liste avecnéléments et le choix de la position de swap sontdes événements indépendants, donc les probabilités d'événements conjoints facteur, par exempleps=1n + 1random_item
n
Pr(Li= j , i swapped)=Pr(Li= j)⋅Pr( j'ai troqué ) =pnps
pour . Maintenant, pour les calculs.i , j ∈ { 1 , … , n }
Nous ne considérons que les anciens éléments . Un tel élément j est en position i si et seulement s'il était là avant la dernière insertion et i n'est pas sélectionné comme position de swap, c'est-à-dire njii
.Pr(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1
Ici, nous considérons que l'un des anciens éléments est remplacé par la dernière position. L'élément aurait pu être à n'importe laquelle des anciennes positions, donc nous additionnons toutes les probabilités que j était à la position i et i est choisi comme position de swap, c'est-à-direjjii
.Pr( Ln + 1= j ) = ∑i = 1npnps= ∑i = 1n1n⋅ 1n + 1= 1n + 1
Le nouvel élément se retrouve à la position si et seulement si i est choisi comme position de swap, c'est-à-direjeje
.Pr( Lje= j ) = ps= 1n + 1
Tout s'est bien passé, votre stratégie d'insertion préserve en effet l'uniformité. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.
Un mot d'avertissement: cette preuve tombe en panne si les éléments insérés ne sont pas différents par paire resp. se distingue, car alors la toute première équation n'est plus valable. Mais votre algorithme est toujours valide; chaque permutation avec doublons est générée par le même nombre d'exécutions aléatoires. Vous pouvez le prouver en marquant les doublons (c'est-à-dire en les rendant reconnaissables), effectuer la preuve ci-dessus et supprimer les marquages (virtuellement); la dernière étape réduit les mêmes ensembles de permutations de taille égale.
( 1 )
random_item
L( k ){ 1 , … , k }
π′∈ P e r mn + 1{ 1 , … , n + 1 }
π′= ( π( 1 ) , π( 2 ) , … , π( i - 1 ) , n + 1 , π( i + 1 ) , … , π( n ) , π( i ) )
π∈ P e r mni ∈ { 1 , … , n + 1 }Pr( L( n )= π) = 1n !random_item
je1n + 1πje
Pr( L( n + 1 )= π′) = Pr( L( n )= π) ⋅ Pr( j'ai échangé ) = 1( n + 1 ) !
que nous devions montrer. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.
- { ( 1 , 2 , 3 , 4 ) , ( 2 , 3 , 4 , 1 ) , ( 3 , 4 , 1 , 2 ) , ( 4 , 1 , 2 , 3 ) }140