Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Ciągi de Bruijna generowanie, własności Jakub Radoszewski.

Podobne prezentacje


Prezentacja na temat: "Ciągi de Bruijna generowanie, własności Jakub Radoszewski."— Zapis prezentacji:

1 Ciągi de Bruijna generowanie, własności Jakub Radoszewski

2 Ciąg de Bruijna rzędu n cykliczne słowo zerojedynkowe długości 2 n, w którym każde podsłowo długości n występuje dokładnie raz np (rząd 4)

3 Zastosowania szybkie generowanie słów zerojedynkowych długości n – liczb od 0 do 2 n -1 lub podzbiorów zbioru n-elementowego zastosowania w: elektronice, sieciach komputerowych, biologii obliczeniowej, kryptografii Ciekawe same w sobie: czy istnieją ciągi dowolnych rzędów?

4 Graf de Bruijna G n rzędu n 2 n-1 wierzchołków – słowa binarne (n-1)-literowe krawędzie: a 1 a 2 …a n-1 a 2 …a n-1 0 (etykieta: 0) i a 1 a 2 …a n-1a 2 …a n-1 1 (etykieta: 1) cykle Eulera w grafach de Bruijna odpowiadają ciągom de Bruijna!

5 Ciekawostka: inny rysunek G 4 en.wikipedia.org Ilustracja G 4 przypominająca tzw. układy dynamiczne (na podstawie en.wikipedia.org)

6 Eulerowskość G n do wierzchołka a 1 a 2 …a n-1 wchodzą dwie krawędzie: 0a 1 …a n-2 a 1 …a n-2 a n-1 1a 1 …a n-2 a 1 …a n-2 a n-1 indeg[v] = outdeg[v] silnie spójny (jak dojść z 110 do 011?) eulerowski na mocy kryterium (dowód kryterium potem)

7 Cykl Eulera ciągiem de Bruijna n kolejnych liter cyklu jednoznacznie wyznacza krawędź grafu przykład: A zatem żadne podsłowo długości n nie powtarza się więcej niż raz!

8 Cykle Eulera Warunki konieczne i dostateczne: graf skierowany: silnie spójny, indeg[v] = outdeg[v] graf nieskierowany: spójny, 2 | deg[v] Algorytm (graf skierowany): idź, aż się zacyklisz (dlaczego to się zawsze uda?); dobuduj rekurencyjnie cykle w pozostałych silnie spójnych składowych; podoklejaj te cykle do początkowego.

9 Przykład

10 Przykład cd. Zaczynamy z wierzchołka 0 i znajdujemy jakiś cykl.

11 Przykład cd. Usuwamy znaleziony cykl.

12 Przykład cd. Znajdujemy rekurencyjnie cykle Eulera w silnie spójnych składowych pozostałej części grafu.

13 Przykład cd. Doklejamy cykle, uzyskując cykl Eulera:

14 Jak to elegancko zapisać? void euler(int v) { while (v ma nieodwiedzonego sąsiada) { w = sąsiad(v); // usuwamy w euler(w); pisz_na_koniec_wyniku(v); } Wywołanie: euler(0). Dla przykładu: Wynik: 0, 1, 4, 5, 1, 2, 6, 7, 8, 2, 3.

15 Algorytm Forda Zaleta: łatwiejszy w zapisie Wada: pozwala na wygenerowanie jedynie pewnej klasy ciągów de Bruijna u = 11…1; while (true) { v = u 2 u 3 …u n ; if (było[v0]) u = v1; else u = v0; if (było[u]) break; pisz(u n ); } Ciąg wygenerowany dla n=4: X. Nie działa, gdy zaczynamy od samych zer: X. Skąd się ten dziwny algorytm w ogóle wziął?...

16 Skierowane drzewo rozpinające analogia do wersji nieskierowanej Jeżeli G ma n wierzchołków, to skierowane drzewo rozpinające T ukorzenione w v 0 spełnia: T zawiera v-1 krawędzi; z każdego wierzchołka v v 0 wychodzi dokładnie jedna krawędź z T; z v 0 nie wychodzi żadna krawędź z T; z każdego wierzchołka v da się dojść do v 0 za pomocą krawędzi z T.

17 Przykład Przykładowy graf z zaznaczonym skierowanym drzewem rozpinającym, ukorzenionym w wierzchołku 0.

18 Drzewa a cykle Startujemy z v 0. Dokładamy kolejne krawędzie, stosując kryterium: krawędzie z T są zabronione, czyli używane najpóźniej, jak tylko się da. Pytania na boku: Czy w każdym grafie eulerowskim istnieje skierowane drzewo rozpinające? Jak takie drzewo wyznaczyć?

19 Przykład

20 Przykład cd.

21

22

23

24

25

26

27

28

29 Znaleźliśmy cykl Eulera!!!

30 Dlaczego to działa? Ścieżka musi skończyć się w v 0 (dlaczego?). Wystarczy pokazać, że wszystkie krawędzie z T leżą na ścieżce. Na końcu wszystkie krawędzie wchodzące do v 0 muszą być wykorzystane (bo indeg[v 0 ]=outdeg[v 0 ]), więc także te z T (3 0 z rys.). 3 0 zostaje wykorzystana jako ostatnia wychodząca z 3. W momencie jej użycia, wszystkie krawędzie wchodzące do 3 muszą być wykorzystane, w tym te z T (5 3 i 1 3 z rys.) itd. Na koniec dochodzimy do liści T. No to OK.

31 Drzewa a ciągi de Bruijna Podgraf jedynkowy grafu G 5 – drzewo z pętlą.

32 Otrzymujemy algorytm Forda! Usuwamy pętlę – otrzymujemy skierowane drzewo rozpinające T. Za pomocą T otrzymujemy dokładnie algorytm Forda!

33 Ciekawostki Ciąg wygenerowany przez algorytm T jest najmniejszy alfabetycznie wśród ciągów de Bruijna danego rzędu. Związek między cyklami Eulera a skierowanymi drzewami rozpinającymi może być wykorzystany do zliczenia cykli Eulera w danym grafie. Tak wyprowadza się wzór na liczbę ciągów de Bruijna rzędu n: 2 2^(n-1). Opisane metody są bardzo pamięciożerne. Znanych jest wiele innych metod generowania ciągów de Bruijna, w tym takie, które potrzebują zaledwie O(n) pamięci. O różnych takich ciekawych metodach oraz rozmaitych własnościach ciągów de Bruijna można poczytać... w mojej pracy magisterskiej (uwaga: praca jest sztywna i nudna)www.mimuw.edu.pl/~jrad/mgr.pdf


Pobierz ppt "Ciągi de Bruijna generowanie, własności Jakub Radoszewski."

Podobne prezentacje


Reklamy Google