Dowód poprawno±ci algorytmu Prefer-Opposite
Grzegorz Prusak, Katarzyna Mandziuk, Krzysztof Opolski Grudzie« 2012
W pracy [1] zaprezentowany zostaª algorytm generuj¡cy ci¡g de Bruijna. Niniejszy dokument, w oparciu o niektóre argumenty autora tego tekstu, przedstawia kompletny i bardziej zrozumiaªy dowód poprawno±ci algorytmu (Twierdzenie w cz¦±ci 1).
Prezentujemy tak»e zaproponowany przez profesora Ryttera alternatywny dowód (cz¦±¢ 2), który jest du»o bardziej obrazowy i korzysta tylko z jednego lematu z cz¦-
±ci 1.
Rozwa»amy znaki ze zbioru Σ = {0, 1}; a oznacza znak przeciwny do a.
Algorytm (nieznacznie zmodykowany celem uproszczenia dowodu) ma posta¢:
1. Przyjmij w = 0n−11. 2. Wypisz w.
3. Je±li w = x1x2. . . xn i sªowo v = x2x3. . . xnxn nie zostaªo jeszcze wypisane, przyjmij w = v i przejd¹ do 2.
4. Je±li w = x1x2. . . xn i sªowo v = x2x3. . . xnxn nie zostaªo jeszcze wypisane, przyjmij w = v i przejd¹ do 2.
5. Koniec.
Przykªad 1. Dla n = 4 algorytm wypisze nast¦puj¡ce sªowa:
0 0 0 1 0 0 1 0
0 1 0 1 1 0 1 0
0 1 0 0 1 0 0 1
0 0 1 1 0 1 1 0
1 1 0 1 1 0 1 1
0 1 1 1 1 1 1 0
1 1 0 0 1 0 0 0
0 0 0 0
Jak ªatwo zauwa»y¢, pojawiªy wszystkie sªowa binarne dªugo±ci 4 z wyj¡tkiem sªowa 1111. Poka»emy, »e podobnie b¦dzie dla dowolnego n > 1, a co za tym idzie, algorytmu Prefer-Opposite mo»na u»ywa¢ do generowania ci¡gu de Bruijna rz¦du n.
1 Dowód oparty na oryginalnej pracy
Przypadek n = 2 jest prosty do zwerykowania, dalej zakªadamy n > 3. B¦dziemy korzysta¢ z nast¦puj¡cych, ªatwych do zaobserwowania wªasno±ci algorytmu:
(W1) W wypisanym ci¡gu sªowa nie powtarzaj¡ si¦ (dowód: w punktach 3. i 4. spraw- dzamy, czy kandydat na kolejne sªowo nie byª wypisany).
(W2) Sªowo w które zostaªo wypisane i jest ró»ne od 0n−11, nie stoi na pocz¡tku wy- pisanego ci¡gu, istnieje zatem sªowo wypisane bezpo±rednio przed nim (b¦dziemy je nazywa¢ poprzednikiem sªowa w).
(W3) Je±li sªowo w postaci x1x2. . . xn−2aa zostaªo wypisane, to wcze±niej zostaªo wy- pisane sªowo x1x2. . . xn−2aa(dowód: z W2 istnieje poprzednik w, skoro zostaª dla niego wykonany krok 4. algorytmu, to warunek w kroku 3. nie byª speªniony).
(W4) Wypisane sªowa s¡ kolejnymi wierzchoªkami pewnej ±cie»ki w grae de Bruijna (którego wierzchoªki s¡ sªowami binarnymi dªugo±ci n).
Lemat 1. Sªowo 1n nie zostanie wypisane.
Dowód. Fragment grafu de Bruijna obejmuj¡cy wierzchoªki s¡siaduj¡ce z 1n ma posta¢:
01n−1 1n−10
1n
Zaªó»my, »e sªowo 1n zostaªo wypisane jako k-te z kolei. Z W1 i W2 wnioskujemy, »e poprzednim wypisanym sªowem (pozycja k − 1) byªo sªowo 01n−1. Zastosowanie W3 do sªowa 1npokazuje, »e jeszcze wcze±niej (pozycja l < k − 1) pojawiªo si¦ sªowo 1n−10. Ale sªowo 1n−10ma poprzednik, jest nim 1nlub 01n−1. St¡d jedno z tych sªów wyst¦puje na pozycji l − 1, czyli pojawia si¦ wi¦cej ni» jeden raz. Uzyskana sprzeczno±¢ dowodzi, »e sªowo 1n nie mo»e zosta¢ wypisane.
Lemat 2. Je±li a = x1x2. . . xn−1c oraz b = x1x2. . . xn−1c zostaªy wypisane i s¡ ró»ne od 0n−11, to dla dowolnego s ∈ Σ zostaªo wypisane sªowo vs= sx1x2. . . xn−1 i jest ono poprzednikiem a lub poprzednikiem b.
Dowód. Z W2 sªowa a i b maj¡ poprzedniki, które z W1 s¡ ró»ne, musz¡ wi¦c mie¢
posta¢:
tx1. . . xn−1
tx1. . . xn−1
Jednym z tych sªów jest vs.
Lemat 3. Algorytm zako«czy si¦; ostatnie dwa sªowa na wyj±ciu to 10n−1 oraz 0n. Dowód. Istnieje sko«czenie wiele sªów binarnych dªugo±ci n, za± na mocy W1 ka»de sªowo jest wypisywane co najwy»ej raz. St¡d algorytm si¦ zako«czy.
Niech w = x1x2. . . xn b¦dzie ostatnim wypisanym sªowem. Zaªó»my, »e w 6= 0n. Warunki w kroku 3. i 4. algorytmu byªy dla tego sªowa faªszywe, zatem sªowa
p = x2x3. . . xn0 q = x2x3. . . xn1 pojawiªy si¦ nie pó¹niej ni» w.
Je±li w = 10n−1, to p = 0n. Wtedy sªowo p ma poprzednik; ªatwo zauwa»y¢, »e musi nim by¢ 10n−1= w. Ale sªowo w nie mo»e si¦ pojawi¢ wi¦cej ni» raz.
St¡d w 6= 10n−1. Poniewa» zaªo»yli±my, »e w 6= 0n, wynika st¡d, »e x2x3. . . xn 6=
0n−1. Tym samym q = x2x3. . . xn1 6= 0n−11; zachodzi te» p 6= 0n−11. Do sªów p i q stosuje si¦ wi¦c lemat 2, w szczególno±ci sªowo w jest poprzednikiem p lub q. Ale w nie mo»e pojawi¢ si¦ w wypisanym ci¡gu wi¦cej ni» raz.
Uzyskana sprzeczno±¢ pokazuje, »e w = 0n. Jego poprzednikiem jest 10n−1.
Lemat 4. Je±li sªowo x1x2. . . xn−2bb zostaªo wypisane, to dla dowolnego c ∈ Σ sªowo vc= cx1x2. . . xn−2b tak»e zostaªo wypisane.
Dowód. Z lematu 3 wiemy, »e sªowa 10n−1 oraz 0n zostaªy wypisane. Wystarczy wi¦c rozpatrzy¢ przypadek x1x2. . . xn−2b 6= 0n−1.
Zaªó»my, »e sªowo x1x2. . . xn−2bb si¦ pojawiªo. Wtedy z W3 wyst¡piªo tak»e sªowo x1x2. . . xn−2bb. Te dwa sªowa s¡ ró»ne od 0n−11, mo»emy wi¦c zastosowa¢ do nich lemat 2, by wywnioskowa¢, »e vc zostaªo wypisane.
Lemat 5. Sªowo w = x1x2. . . xn−10 zostaªo wypisane.
Dowód. Skoro (z lematu 3) sªowo 0n zostaªo wypisane, to na mocy lematu 4 wypisane zostaªy te» sªowa xn−10n−1, xn−2xn−10n−2, . . . , x1x2. . . xn−10 = w.
Twierdzenie. Dowolne sªowo w ∈ Σn ró»ne od 1n zostaªo wypisane dokªadnie raz.
Dowód. Niech w = x1x2. . . xn−1xn.
Z uwagi na lemat 5 wystarczy rozpatrzy¢ przypadek xn= 1.
Poniewa» w 6= 1n, to istnieje pozycja i taka, »e xi jest ostatnim wyst¡pieniem znaku 0 w w.
Z lematu 5 sªowo 1n−10zostaªo wypisane. Na mocy lematu 1 jego poprzednikiem jest 01n−1= xixi+1. . . xn−11i. Z kolei (i−1)-krotne zastosowanie lematu 4 do tego sªowa po- zwala wywnioskowa¢, »e pojawiªy si¦ te» sªowa xi−1xi. . . xn−11i−1, xi−2xi−1. . . xn−11i−2, . . . , x1x2. . . xn−11 = w.
Z poczynionych obserwacji wynika, »e wypisane przez algorytm sªowa to wierzchoªki
±cie»ki w grae de Bruijna o pocz¡tku w 0n−11 i ko«cu w 0n. cie»ka omija wierzchoªek 1n, ale wiadomo, »e po 01n−1 nast¦puje w niej 1n−10. St¡d przez drobn¡ modykacj¦
mo»na uczyni¢ j¡ scie»k¡ Hamiltona, a po poª¡czeniu 0n i 0n−11 cyklem Hamiltona w grae de Bruijna.
01n−1 1n−10
1n
01n−1 1n−10
1n
atwo teraz stwierdzi¢, »e rozwa»ana modykacja algorytmu polegaªa jedynie na przeniesieniu pierwszego wypisanego sªowa (0n) na koniec ci¡gu wyj±ciowego (kolejno±¢
pozostaªych sªów nie ulegªa zmianie - w obu wariantach sprawdzenie, czy wyst¡piªo ju»
0n jest wykonywane dopiero na samym ko«cu).
2 Interpretacja grafowa
Niech G b¦dzie skierowanym grafem eulerowskim, a T (skierowanym) ukorzeniownym drzewem rozpinaj¡cym G o nast¦puj¡cej wªasno±ci: ka»da kraw¦d¹ jest zwrócona w kie- runku korzenia.
Przyjmijmy, »e out(v) oznacza zbiór kraw¦dzi wychodz¡cych z wierzczhoªka v.
Rozwa»my nast¦puj¡cy (niedeterministyczny) algorytm (A):
V isited ← ∅
P ref ← E(G) \ E(T ) v ←korze« T
while out(v) 6⊆ V isited do C ← out(v) \ V isited if C ∩ P ref 6= ∅ then
e ←dowolny element zbioru C ∩ P ref else
e ←dowolny element zbioru C end if
wypisz e
V isited ← V isited ∪ {e}
v ←nast¦pnik kraw¦dzi e end while
Próbuje on zachªannie generowa¢ cykl Eulera, bior¡c do niego najpierw kraw¦dzie le»¡ce poza drzewem T .
Lemat 6. Dowolny przebieg algorytmu (A) wypisuje cykl Eulera grafu G.
Dowód. Zauwa»my najpierw, »e algorytm zako«czy si¦, gdy v b¦dzie korzeniem T (bo wszystkie kraw¦dzie wychodz¡ce z v nale»¡ do V isited, ale stopie« wej±ciowy v jest równy wyj±ciowemu, czyli jest to wierzchoªek, z którego algorytm ruszaª).
Poka»emy przez indukcj¦ po k - odlegªo±ci w T wierzchoªka w od korzenia T , »e wszystkie kraw¦dzie wychodz¡ce z w zostaªy odwiedzone.
Baza (k = 0): wiemy, »e algorytm zako«czyª si¦ w korzeniu, a to oznacza, »e wszystkie kraw¦dzie wychodz¡ce z korzenia zostaªy wypisane.
Krok: Niech w b¦dzie odlegªe od korzenia T o k + 1. Je±li nie wszystkie kraw¦dzie wychodz¡ce z w zostaªy odwiedzone, to nie zostaªa odwiedzona ta kraw¦d¹ wychodz¡ca z w, która le»y w T (bo algorytm najpierw wybiera spo±ród kraw¦dzi wychodz¡cych, które nie le»¡ w T ). Tym samym nie zostaªa odwiedzona pewna kraw¦d¹ wchodz¡ca do ojca w (odlegªego od korzenia o k). Ale algorytm wychodziª z ojca w tyle razy, ile do niego wchodziª, czyli istnieje kraw¦d¹ wychodz¡ca z ojca w, która nie zostaªa odwiedzona. To daje sprzeczno±¢ z zaªo»eniem indukcyjnym.
Wiadomo, »e ci¡g de Bruijna rz¦du n mo»na uto»samia¢ z cyklem Eulera w grae de Bruijna, w którym wierzchoªki s¡ sªowami dªugo±ci n − 1, za± kraw¦d¹ od sªowa x1x2. . . xn−1 do sªowa x2x3. . . xn odpowiada sªowu x1x2. . . xn−1xn(oznaczmy taki graf przez Bn).
Wiemy z cz¦±ci 1, »e algorytm Prefer-Opposite nie wypisze sªowa 1n; sugeruje to rozwa»enie grafu Bfn, który okre±limy jako Bn bez p¦tli na wierzchoªku 1n−1 (ta p¦tla odpowiada pomini¦temu sªowu).
Zdeniujemy Tn, ukorzenione drzewo rozpinaj¡ce wBfn. Niech jego korzeniem b¦dzie 0n−1, za± zbiorem kraw¦dzi
n(x1x2. . . xn−20, x2x3. . . xn−200) : x1x2. . . xn−2∈ Σn−2, x1x2. . . xn−26= 0n−2o∪
n(x1x2. . . xn−21, x2x3. . . xn−211) : x1x2. . . xn−2∈ Σn−2, x1x2. . . xn−26= 1n−2o∪ n1n−1, 1n−20o.
Przykªad 2. Drzewo T4 w grae Bf4 ma posta¢:
000
001
011
111
110 100 010
101 0001
0010
0101 1010
1001
0110
1101 0000
0100
0011
1011
0111 1110
1100 1000
Tn jest rzeczywi±cie drzewem; z ka»dego wierzchoªka oprócz 0n−1 wychodzi jedna kraw¦d¹ wskazuj¡ca na ojca. Jasne jest te», »e Bfn jest grafem eulerowskim. Ma zatem sens mówienie o uruchomieniu algorytmu (A) dla grafu i drzewa T .
Przykªad 3. Kolejne kraw¦dzie odwiedzane przez algorym (A) dla grafu Bf4 z drzewem T4 (na pocz¡tku algorytm mo»e wybra¢ spo±ród dwóch kraw¦dzi, zaªó»my »e wybraª 0001):
000
001
011
111
110 100 010
101 0001 1
0010
2
0101
3
1010
4
1001
6
0110
8
1101
9
0000 15
0100
5
0011
7
1011
10
0111
11
12 1110
1100
13
1000
14
Lemat 7. Kraw¦dzie wypisane przez taki bieg algorytmu (A) dla grafu Bfn i drzewa Tn, który najpierw wypisuje 0n−11 odpowiadaj¡ kolejnym sªowom wypisanym przez algorytm Prefer-Opposite startuj¡cy od sªowa 0n−11.
Dowód. W tym rozumowaniu uto»samiamy kraw¦dzie Bfn i sªowa które reprezentuj¡.
Algorytm (A) zaczyna w korzeniu Tn, czyli 0n−1. adna kraw¦d¹ wychodz¡ca z tego wierzchoªka nie le»y w Tn, zatem algorytm mo»e wybra¢ dowoln¡ z nich. Rozwa»amy zatem taki bieg algorytmu (A), który wybiera najpierw kraw¦d¹ 0n−11 (pierwsze sªowo wypisane przez algorytm Prefer-Opposite).
Zaªó»my teraz, »e algorytm (A) wypisaª kraw¦d¹ x1x2. . . xni »e do tej pory wszystkie wypisane przez niego kraw¦dzie pokrywaªy si¦ ze sªowami, które wypisaª algorytm Prefer- Opposite z odpowiednio dobranym sªowem startowym.
Je±li x2x3. . . xn = 1n−1 to algorytm (A) pójdzie kraw¦dzi¡ 1n−10, bo to jedyna kraw¦d¹ wychodz¡ca z 1n−1 w grae Bfn. Algorytm Prefer-Opposite, na mocy lematu 1 nie mo»e wypisa¢ 1n, wi¦c równie» wypisze 1n−10(nie zatrzyma si¦, bo przed 1n−10musi sta¢ 01n−1, zatem sªowo 1n−10 jeszcze nie wyst¡piªo).
Je±li x2x3. . . xn= 0n−1, to algorytm (A) powróciª do korzenia. Je±li jest to pierwszy powrót, to (A) przejdzie po p¦tli (wypisuj¡c 0n) i zatrzyma si¦ w korzeniu (bo wyko- rzystaª wszystkie kraw¦dzie wychodz¡ce z korzenia). Algorytm Prefer-Opposite wypisze najpierw 0n (0n−11 ju» wypisaª, nie mo»e powtórzy¢ tego sªowa), a potem zatrzyma si¦, bo wypisaª oba sªowa 0n i 0n−11.
Dalej zakªadamy, »e x2x3. . . xn6= 0n−1i x2x3. . . xn6= 1n−1. To oznacza, »e wierzcho- ªek x2x3. . . xn nie jest korzeniem Tn i ma dwie kraw¦dzie wychodz¡ce w Bfn, z których dokªadnie jedna (x2x3. . . xnxn) le»y w Tn.
Je±li kraw¦d¹ x2x3. . . xnxnnie wyst¡piªa, to algorytm (A) wypisze j¡ (bo x2x3. . . xnxn
jako jedna z co najwy»ej dwóch rozwa»anych nie le»y w Tn), podobnie algorytm Prefer- Opposite wypisze to sªowo, bo jeszcze nie wyst¡piªo i jest preferowane.
Je±li kraw¦d¹ x2x3. . . xnxn wyst¡piªa, ale kraw¦d¹ x2x3. . . xnxn nie wyst¡piªa, to algorytm (A) wypisze t¦ ostatni¡; algorytm Prefer-Opposite równie» wypisze to sªowo, bo jeszcze si¦ nie pojawiªo.
Je±li dla dowolnego c ∈ Σ kraw¦d¹ x2x3. . . xnc wyst¡piªa, to algorytm (A) si¦ za- trzyma, podobnie jak algorytm Prefer-Opposite.
Powy»sze obserwacje pokazuj¡, »e bieg obu algorytmów b¦dzie taki sam.
Poª¡czenie dwóch powy»szych lematów pokazuje, »e algorytm Prefer-Opposite wy- pisuje cykl Eulera w grae Bfn, a to jest dokªadnie teza twierdzenia z cz¦±ci 1. W tym dowodzie korzystali±my jedynie z lematu 1.
Literatura
[1] Abbas Alhakim, A Simple Combinatorial Algorithm for de Bruijn Sequences