Upload
others
View
23
Download
0
Embed Size (px)
Citation preview
Generating Random Derangements
Conrado Martínez1 Alois Panholzer2 Helmut Prodinger3
1Univ. Politècnica de Catalunya, Spain
2Tech. Univ. Wien, Austria
3Univ. Stellenbosch, South Africa
Derangements
Le Problème des Derangements:
�A number of gentlemen, say n, surrender their top hats in the
cloakroom and proceed to the evening's enjoyment. After wining
and dining (and wining some more), they stumble back to the
cloakroom and confusedly take the �rst top-hat they see. What is
the probability that no gentleman gets his own hat?�
Derangements
I A derangement is a permutation without �xed points: �(i) 6= i
for any i , 1 � i � n
I The number Dn of derangements of size n is
Dn = n! �
�1
0!�
1
1!+
1
2!�
1
3!+ � � �+
(�1)n
n!
�=
�n! + 1
e
�:
I As n!1, Dn=n! � 1=e � 0:36788.
Derangements
I A derangement is a permutation without �xed points: �(i) 6= i
for any i , 1 � i � n
I The number Dn of derangements of size n is
Dn = n! �
�1
0!�
1
1!+
1
2!�
1
3!+ � � �+
(�1)n
n!
�=
�n! + 1
e
�:
I As n!1, Dn=n! � 1=e � 0:36788.
Derangements
I A derangement is a permutation without �xed points: �(i) 6= i
for any i , 1 � i � n
I The number Dn of derangements of size n is
Dn = n! �
�1
0!�
1
1!+
1
2!�
1
3!+ � � �+
(�1)n
n!
�=
�n! + 1
e
�:
I As n!1, Dn=n! � 1=e � 0:36788.
Break #1: Fisher-Yates' shu�e
procedure RandomPermutation(n)
for i 1 to n do A[i ] i
for i n downto 1 do
j Uniform(1; i)A[i ]$ A[j ]
return A
Break #2: Sattolo's algorithm
procedure RandomCyclicPermutation(n)
for i 1 to n do A[i ] i
for i n downto 1 do
j Uniform(1; i � 1)A[i ]$ A[j ]
return A
A recurrence for the number of derangements
D0 = 1;D1 = 0
Dn = (n � 1)Dn�1 + (n � 1)Dn�2
A recurrence for the number of derangements
D0 = 1;D1 = 0
Dn = (n � 1)Dn�1 + (n � 1)Dn�2
Choice #1: n belongs to a cycle of length > 2.
The derangement of size n is built by constructing a derangement
of size n � 1 and then n is inserted into any of the cycles (of length
� 2); there are (n � 1) possible ways to do that
A recurrence for the number of derangements
D0 = 1;D1 = 0
Dn = (n � 1)Dn�1 + (n � 1)Dn�2
Choice #2: n belongs to a cycle of length 2.
The derangement of size n is built by constructing a cycle of size 2
with n and some j , 1 � j � n � 1; then we build a derangement of
size n � 2 with the remaining elements
The rejection method
Require: n 6= 1
procedure RandomDerangement(n)
repeat
A RandomPermutation(n)until Is-Derangement(A) return A
P[A is a derangement] �1
e
E[# of calls to Random] = e � n + O(1)
The rejection method
Require: n 6= 1
procedure RandomDerangement(n)
repeat
A RandomPermutation(n)until Is-Derangement(A) return A
P[A is a derangement] �1
e
E[# of calls to Random] = e � n + O(1)
The recursive method
C f1; 2; : : : ; ngRandomDerangement-Rec(n;C )
Require: n 6= 1
procedure RandomDerangement-Rec(n, C )
if n � 1 then return
j a random element from C
p Uniform(0; 1)if p < (n � 1)Dn�2=Dn then
RandomDerangement-Rec(n � 2;C n fj ; ng)�(n) j ;�(j) n
else
RandomDerangement-Rec(n � 1;C n fng)�(n) �(j);�(j) n
Our algorithm
Require: n 6= 1
procedure RandomDerangement(n)
for i 1 to n do A[i ] i ;mark[i ] false
i n; u n
while u � 2 do
if :mark[i ] thenj pick a random unmarked element in A[1::i � 1]
A[i ]$ A[j ]
if j shall be marked � close the cycle then
mark[j ] true; u u � 1
u u � 1
i i � 1
return A
Our algorithm
Require: n 6= 1
procedure RandomDerangement(n)
for i 1 to n do A[i ] i ;mark[i ] false
i n; u n
while u � 2 do
if :mark[i ] thenrepeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)Du�2=Du
mark[j ] true; u u � 1
u u � 1
i i � 1
return A
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 2 3 4 5 6 7 8
"
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 2 3 4 8 6 7 5
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 2 3 4 8 6 7 5
"
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 3 4 8 6 2 5
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 3 4 8 6 2 5
"
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 3 4 6 8 2 5
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 3 4 6 8 2 5
"
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 6 4 3 8 2 5
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
1 7 6 4 3 8 2 5
"
Our algorithm
procedure RandomDerangement(n)for i 1 to n do A[i ] i ;mark[i ] falsei n; u n
while u � 2 doif :mark[i ] then
repeat j Random(1; i � 1)until :mark[j ]A[i ]$ A[j ]p Uniform(0; 1)if p < (u � 1)D
u�2=Du thenmark[j ] true; u u � 1
u u � 1i i � 1
return A
4 7 6 1 3 8 2 5
The analysis
I # of marked elements = # of cycles (Cn)
I # of iterations = # of calls to Uniform = n � Cn
I G = # of calls to Random
I Gi = # of calls to Random at iteration i
I
E[cost] = n � E[Cn] + E[G ]
= n � E[Cn] +X
1<i�n
E[Gi ]
The analysis
I # of marked elements = # of cycles (Cn)
I # of iterations = # of calls to Uniform = n � Cn
I G = # of calls to Random
I Gi = # of calls to Random at iteration i
I
E[cost] = n � E[Cn] + E[G ]
= n � E[Cn] +X
1<i�n
E[Gi ]
The analysis
I # of marked elements = # of cycles (Cn)
I # of iterations = # of calls to Uniform = n � Cn
I G = # of calls to Random
I Gi = # of calls to Random at iteration i
I
E[cost] = n � E[Cn] + E[G ]
= n � E[Cn] +X
1<i�n
E[Gi ]
The analysis
I # of marked elements = # of cycles (Cn)
I # of iterations = # of calls to Uniform = n � Cn
I G = # of calls to Random
I Gi = # of calls to Random at iteration i
I
E[cost] = n � E[Cn] + E[G ]
= n � E[Cn] +X
1<i�n
E[Gi ]
The analysis
I # of marked elements = # of cycles (Cn)
I # of iterations = # of calls to Uniform = n � Cn
I G = # of calls to Random
I Gi = # of calls to Random at iteration i
I
E[cost] = n � E[Cn] + E[G ]
= n � E[Cn] +X
1<i�n
E[Gi ]
The analysis
The computation of E[Cn] can be done via standard generating
function techniques:
C (z ; v) =XA2D
z jAj
jAj!v# cycles(A)
= exp
�v
�log
1
1� z� z
��= e�vz 1
(1� z)v
E
hvCn
i=
n!
Dn
[zn]C (z ; v) =e1�v
(v � 1)!nv�1(1+ O(n�1+�))
E[Cn] = log n + O(1); V[Cn] = log n + O(1)
Cn � log nplog n
! N (0; 1)
The analysis
The computation of E[Cn] can be done via standard generating
function techniques:
C (z ; v) =XA2D
z jAj
jAj!v# cycles(A)
= exp
�v
�log
1
1� z� z
��= e�vz 1
(1� z)v
E
hvCn
i=
n!
Dn
[zn]C (z ; v) =e1�v
(v � 1)!nv�1(1+ O(n�1+�))
E[Cn] = log n + O(1); V[Cn] = log n + O(1)
Cn � log nplog n
! N (0; 1)
The analysis
The computation of E[Cn] can be done via standard generating
function techniques:
C (z ; v) =XA2D
z jAj
jAj!v# cycles(A)
= exp
�v
�log
1
1� z� z
��= e�vz 1
(1� z)v
E
hvCn
i=
n!
Dn
[zn]C (z ; v) =e1�v
(v � 1)!nv�1(1+ O(n�1+�))
E[Cn] = log n + O(1); V[Cn] = log n + O(1)
Cn � log nplog n
! N (0; 1)
The analysis
The computation of E[Cn] can be done via standard generating
function techniques:
C (z ; v) =XA2D
z jAj
jAj!v# cycles(A)
= exp
�v
�log
1
1� z� z
��= e�vz 1
(1� z)v
E
hvCn
i=
n!
Dn
[zn]C (z ; v) =e1�v
(v � 1)!nv�1(1+ O(n�1+�))
E[Cn] = log n + O(1); V[Cn] = log n + O(1)
Cn � log nplog n
! N (0; 1)
The analysis
The computation of E[Cn] can be done via standard generating
function techniques:
C (z ; v) =XA2D
z jAj
jAj!v# cycles(A)
= exp
�v
�log
1
1� z� z
��= e�vz 1
(1� z)v
E
hvCn
i=
n!
Dn
[zn]C (z ; v) =e1�v
(v � 1)!nv�1(1+ O(n�1+�))
E[Cn] = log n + O(1); V[Cn] = log n + O(1)
Cn � log nplog n
! N (0; 1)
The analysis
I Mi indicator variable for the event �A[i ] gets marked�
I Mi = 1 =) Gi = 0
I
E[G ] =X
1<i�n
E[Gi jMi = 0] � P[Mi = 0]
The analysis
I Mi indicator variable for the event �A[i ] gets marked�
I Mi = 1 =) Gi = 0
I
E[G ] =X
1<i�n
E[Gi jMi = 0] � P[Mi = 0]
The analysis
I Mi indicator variable for the event �A[i ] gets marked�
I Mi = 1 =) Gi = 0
I
E[G ] =X
1<i�n
E[Gi jMi = 0] � P[Mi = 0]
The analysis
I Ui = # of unmarked elements in A[1::i ];Un = n
I Bi+1 = # of marked elements in A[1::i ];Bn+1 = 0
I Ui + Bi+1 = i
I If A[i ] is not marked then Gi is geometrically distributed with
probability of success
(Ui � 1)=(i � 1) = (i � 1� Bi+1)=(i � 1); hence
E[Gi jMi = 0] = E
�i � 1
i � 1� Bi+1jMi = 0
�
The analysis
I Ui = # of unmarked elements in A[1::i ];Un = n
I Bi+1 = # of marked elements in A[1::i ];Bn+1 = 0
I Ui + Bi+1 = i
I If A[i ] is not marked then Gi is geometrically distributed with
probability of success
(Ui � 1)=(i � 1) = (i � 1� Bi+1)=(i � 1); hence
E[Gi jMi = 0] = E
�i � 1
i � 1� Bi+1jMi = 0
�
The analysis
I Ui = # of unmarked elements in A[1::i ];Un = n
I Bi+1 = # of marked elements in A[1::i ];Bn+1 = 0
I Ui + Bi+1 = i
I If A[i ] is not marked then Gi is geometrically distributed with
probability of success
(Ui � 1)=(i � 1) = (i � 1� Bi+1)=(i � 1); hence
E[Gi jMi = 0] = E
�i � 1
i � 1� Bi+1jMi = 0
�
The analysis
I Ui = # of unmarked elements in A[1::i ];Un = n
I Bi+1 = # of marked elements in A[1::i ];Bn+1 = 0
I Ui + Bi+1 = i
I If A[i ] is not marked then Gi is geometrically distributed with
probability of success
(Ui � 1)=(i � 1) = (i � 1� Bi+1)=(i � 1); hence
E[Gi jMi = 0] = E
�i � 1
i � 1� Bi+1jMi = 0
�
The analysis
I Bi+1 � Cn
I 0 � Bi+1 � i
I Ui 6= 1 and Bi+1 6= 1 for all 1 � i � n
I If Mi = 0 then Bi+1 < i � 1
The analysis
I Bi+1 � Cn
I 0 � Bi+1 � i
I Ui 6= 1 and Bi+1 6= 1 for all 1 � i � n
I If Mi = 0 then Bi+1 < i � 1
The analysis
I Bi+1 � Cn
I 0 � Bi+1 � i
I Ui 6= 1 and Bi+1 6= 1 for all 1 � i � n
I If Mi = 0 then Bi+1 < i � 1
The analysis
I Bi+1 � Cn
I 0 � Bi+1 � i
I Ui 6= 1 and Bi+1 6= 1 for all 1 � i � n
I If Mi = 0 then Bi+1 < i � 1
The analysis
E[G ] =X
1<i�n
E
�i � 1
i � 1� Bi+1jMi = 0
�� P[Mi = 0]
�X
1<i�n
E
�min
�i � 1;
i � 1
i � 1� Cn
��
�X
1�k�bn=2c
P[Cn = k]
0@k+1X
i=1
(i � 1) +
bn=2cXi=k+2
i � 1
i � 1� k
1A
= n � 1� E[Cn] +1
2E
�C 2n
�+ O(E[Cn log(n � Cn)])
= n + O(E�C 2n
�) + O(log n � E[Cn]) = n + O(log2 n)
The analysis
E[G ] =X
1<i�n
E
�i � 1
i � 1� Bi+1jMi = 0
�� P[Mi = 0]
�X
1<i�n
E
�min
�i � 1;
i � 1
i � 1� Cn
��
�X
1�k�bn=2c
P[Cn = k]
0@k+1X
i=1
(i � 1) +
bn=2cXi=k+2
i � 1
i � 1� k
1A
= n � 1� E[Cn] +1
2E
�C 2n
�+ O(E[Cn log(n � Cn)])
= n + O(E�C 2n
�) + O(log n � E[Cn]) = n + O(log2 n)
The analysis
E[G ] =X
1<i�n
E
�i � 1
i � 1� Bi+1jMi = 0
�� P[Mi = 0]
�X
1<i�n
E
�min
�i � 1;
i � 1
i � 1� Cn
��
�X
1�k�bn=2c
P[Cn = k]
0@k+1X
i=1
(i � 1) +
bn=2cXi=k+2
i � 1
i � 1� k
1A
= n � 1� E[Cn] +1
2E
�C 2n
�+ O(E[Cn log(n � Cn)])
= n + O(E�C 2n
�) + O(log n � E[Cn]) = n + O(log2 n)
The analysis
E[G ] =X
1<i�n
E
�i � 1
i � 1� Bi+1jMi = 0
�� P[Mi = 0]
�X
1<i�n
E
�min
�i � 1;
i � 1
i � 1� Cn
��
�X
1�k�bn=2c
P[Cn = k]
0@k+1X
i=1
(i � 1) +
bn=2cXi=k+2
i � 1
i � 1� k
1A
= n � 1� E[Cn] +1
2E
�C 2n
�+ O(E[Cn log(n � Cn)])
= n + O(E�C 2n
�) + O(log n � E[Cn]) = n + O(log2 n)
The analysis
E[G ] =X
1<i�n
E
�i � 1
i � 1� Bi+1jMi = 0
�� P[Mi = 0]
�X
1<i�n
E
�min
�i � 1;
i � 1
i � 1� Cn
��
�X
1�k�bn=2c
P[Cn = k]
0@k+1X
i=1
(i � 1) +
bn=2cXi=k+2
i � 1
i � 1� k
1A
= n � 1� E[Cn] +1
2E
�C 2n
�+ O(E[Cn log(n � Cn)])
= n + O(E�C 2n
�) + O(log n � E[Cn]) = n + O(log2 n)
The analysis
Since we also have E[G ] � n � E[Cn], we have �nally
E[cost] = n � E[Cn] + E[G ] = 2n + O(log2 n)