Generating Random Derangementsconrado/research/talks/analco08.pdf · Generating Random Derangements Conrado Martínez 1 Alois Panholzer 2 Helmut Prodinger 3 1 Univ. Politècnica de

Post on 26-Sep-2020

23 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

Transcript

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)

top related