Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych

Podobne dokumenty
Alexander Denisjuk. Matematyka Dyskretna. Skrypt przeznaczony dla studentów kierunku Informatyka Stosowana. Prywatna Wyższa Szkoła Zawodowa w Giżycku

Algorytmy i Struktury Danych

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Wstęp do programowania

Algorytmy i struktury danych. wykład 5

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Porządek symetryczny: right(x)

Algorytmy i struktury danych

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

0-0000, , , itd

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Drzewa czerwono-czarne.

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Wysokość drzewa Głębokość węzła

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Drzewa poszukiwań binarnych

Wykład 8. Drzewa AVL i 2-3-4

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Bazy danych. Andrzej Łachwa, UJ, /15

Matematyka dyskretna - 7.Drzewa

Znajdowanie skojarzeń na maszynie równoległej

Drzewa podstawowe poj

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Poprawność semantyczna

Wykład 6. Drzewa poszukiwań binarnych (BST)

Drzewa poszukiwań binarnych

Rozwiązywanie problemów metodą przeszukiwania

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy i struktury danych

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

Drzewa. Jeżeli graf G jest lasem, który ma n wierzchołków i k składowych, to G ma n k krawędzi. Własności drzew

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Algorytmy i Struktury Danych

Wykład 11. Konstrukcja drzew składniowych

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

7a. Teoria drzew - kodowanie i dekodowanie

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

E: Rekonstrukcja ewolucji. Algorytmy filogenetyczne

Wykład 3. Drzewa czerwono-czarne

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Koszt zamortyzowany. Potencjał - Fundusz Ubezpieczeń Kosztów Algorytmicznych

Czy istnieje zamknięta droga spaceru przechodząca przez wszystkie mosty w Królewcu dokładnie jeden raz?

Metoda Tablic Semantycznych

Dynamiczne drzewa. Piotr Sankowski. - p. 1/27

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Wykład 5 Listy leniwe

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >


Indukowane Reguły Decyzyjne I. Wykład 3

Ogólne wiadomości o grafach

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Minimalne drzewa rozpinające

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Algorytmy z powrotami. Algorytm minimax

Nierówność Krafta-McMillana, Kodowanie Huffmana

Algorytmy i Struktury Danych

Kompresja danych Streszczenie Studia Dzienne Wykład 10,

Kompresja bezstratna. Entropia. Kod Huffmana

Definicja pliku kratowego

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

a) 7 b) 19 c) 21 d) 34

Przykładowe B+ drzewo

gimnazjalista.fundacja2lo.pl

Data Mining Wykład 5. Indukcja drzew decyzyjnych - Indeks Gini & Zysk informacyjny. Indeks Gini. Indeks Gini - Przykład

(4) x (y z) = (x y) (x z), x (y z) = (x y) (x z), (3) x (x y) = x, x (x y) = x, (2) x 0 = x, x 1 = x

Sortowanie. Bartman Jacek Algorytmy i struktury

Tadeusz Pankowski

Algorytmy i Struktury Danych.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Matematyczne Podstawy Informatyki

Metoda podziału i ograniczeń

Drzewa AVL definicje

Zagadnienie najkrótszej drogi w sieci

Podstawy Informatyki. Wykład 6. Struktury danych

Algorytmy i struktury danych

Algorytmiczna teoria grafów

Heurystyczne metody przeszukiwania

Algorytmy z powrotami

ALGORYTMY I STRUKTURY DANYCH

Matematyka dyskretna

7. Teoria drzew - spinanie i przeszukiwanie

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Matematyczne Podstawy Informatyki

Algorytmy mrówkowe. H. Bednarz. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie Inteligentne systemy informatyczne

Generacja kodu docelowego

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

Drzewo binarne BST. LABORKA Piotr Ciskowski

Teoretyczne podstawy informatyki

Algorytm selekcji Hoare a. Łukasz Miemus

Wykład 2. Drzewa poszukiwań binarnych (BST)

Modelowanie motywów łańcuchami Markowa wyższego rzędu

Transkrypt:

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych 1 Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych Alexander Denisjuk Prywatna Wyższa Szkoła Zawodowa w Giżycku 2005 rok denisjuk@pwsz.net 1. Obejście drzewa poszukiwań (szukanie z powracaniem, backtraking) Definicje 1. Drzewem poszukiwań, o n wierzchołkach nazywa się graf pusty, jeżeli n = 0, oraz, przy n > 1, graf, mający wierzchołek W, nazywany korzeniem, oraz skończoną (być może pustą) uporządkowaną ilość poddrzew poszukiwań t 1,..., t k o n 1,..., n k wierzchołkach odpowiednio. Przy czym n 1 +... + n k + 1 = n, (v. rysunek 1). Wierzchołek, który nie ma poddrzew, nazywa się liściem. Rysunek 1. Drzewo poszukiwań Rysunek 2. Polecenie Up Rysunek 3. Polecenie Right Zadanie 2. Dane jest drzewo poszukiwań. Wydrukować wszystkie jego liście dokładnie jeden raz. Rozwiązanie. Założmy, że obejście drzewa wykonuje Robot, znajdujący się na początku w korzeniu. Użyjmy następujących poleceń: 1. Up przejście po pierwszej z wychodzących krawędzi (rysunek 2). 2. Right przejście do sąsiedniego po prawej stronie wierzchołka (rysunek 3). 3. Down zejście o jeden poziom w dól (rysunek 4). 4. IsUp ma wartość prawda, jeśli istnieje wierzchołek z góry i fałsz, jeśli z góry nie ma wierzchołka. 5. IsRight ma wartość prawda, jeśli istnieje wierzchołek z prawej strony i fałsz, jeśli z prawej strony nie ma wierzchołka. 6. IsDown ma wartość prawda, jeśli istnieje wierzchołek z dołu i fałsz, jeśli z dołu nie ma wierzchołka. Po lewej stronie Z góry W Po prawej stronie Rysunek 4. Polecenie Down Rysunek 5. Klasy liści

2 Alexander Denisjuk Niech Robot będzie w pewnym wierzchołku W. Podzielmy wszystkie liście na klasy (rysunek 5): 1. Po lewej stronie ścieżka z korzenia do liścia skręca w lewo przed wierzchołkiem W. 2. Po prawej stronie ścieżka z korzenia do liścia skręca w prawo przed wierzchołkiem W. 3. Z góry ścieżka z korzenia do liścia idzie przez wierzchołek W. W szczególności, jeżeli W jest liściem, to on należy do klasy z góry. Dla korzenia klasy po lewej stronie oraz po prawej stronie są puste. Natomiast klasa z góry zgadza się ze zbiorem wszystkich liści. Zostanie potrzebna procedura, algorytm 1. Dane: Wydrukowane są wszystkie liście po lewej stronie Wyniki: Wydrukowane są wszystkie liście po lewej stronie i z góry {Niezmiennik: Wydrukowane są wszystkie liście po lewej stronie} while IsUp do Up {Wydrukowane są wszystkie liście po lewej stronie, Robot jest w liściu} Work Program główny dany jest w algorytmie 2 Algorytm 1. Procedura Dane: Robot jest w korzeniu, liście nie wydrukowane Wyniki: Robot jest w korzeniu, liście są wydrukowane {Wydrukowane są wszystkie liście po lewej stronie} {Niezmiennik: Wydrukowane są wszystkie liście po lewej stronie i z góry} while IsDown do if IsRight then Right {Wydrukowane są wszystkie liście po lewej stronie} else {Nie ma z prawej, jest z dołu} Down {Robot jest w korzeniu, więc wydrukowane są wszystkie liście} Algorytm 2. Wydrukowanie wszystkich liści drzewa poszukiwań Zadanie 3. Wydrukować wszystkie wierzchołki drzewa poszukiwań dokładnie jeden raz. Rozwiązanie. Niech Robot będzie w pewnym wierzchołku W. Podzielmy wszystkie wierzchołki na klasy (rysunek 6): 1. Z dołu ścieżka z korzenia do wierzchołka W przechodzi przez dany wierzchołek. 2. Po lewej stronie ścieżka z korzenia do wierzchołka skręca w lewo przed wierzchołkiem W. 3. Po prawej stronie ścieżka z korzenia do wierzchołka skręca w prawo przed wierzchołkiem W. 4. Z góry ścieżka z korzenia do wierzchołka idzie przez wierzchołek W. Modyfikacja procedury pomocniczej (cf. 1) dana jest w algorytmie 3. Program główny podobny jest do algorytmu 2 i podany jest w algorytmie 4. Uwaga 4. Ilość działań w algorytmie jest O(n), gdzie n jest ilością wierzchołków. Zadanie 5. Na szachownicy n n ustawić n hetmanów w taki sposób, żeby żadne dwa hetmany nie atakowały się. Wydrukować wszystkie ustawienia. Rozwiązanie. Na każdej z n poziomnic powinien znajdować się jeden hetman. Nazwiemy k-stanem dowolne ustawienie k hetmanów na dolnych k poziomnicach. Określmy drzewo stanów (v. rysunek 7). Korzeniem będzie stan pusty. Z każdego k-stanu wychodzi n krawędzi do k + 1 stanów, odpowiadającym umieszczeniu hetmana numer k + 1 na poziomnicy k + 1. Uporządkujmy (k + 1)-stany według numeru pionownicy, w której został umieszczony (k + 1)-ty

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych 3 Po lewej stronie Z góry W Po prawej stronie Z dołu Rysunek 6. Klasy wierzchołków Dane: Wydrukowane są wszystkie wierzchołki po lewej stronie i z dołu Wyniki: Wydrukowane są wszystkie wierzchołki po lewej stronie, z dołu i z góry {Niezmiennik: Wydrukowane są wszystkie wierzchołki po lewej stronie i z dołu} while IsUp do Work Up {Wydrukowane są wszystkie wierzchołki po lewej stronie i z dołu, Robot jest w liściu} Work {Wydrukowane są wszystkie wierzchołki po lewej stronie, z dołu i z góry} Algorytm 3. Modyfikowana procedura Dane: Robot jest w korzeniu, wierzchołki nie wydrukowane Wyniki: Robot jest w korzeniu, wierzchołki są wydrukowane {Wydrukowane są wszystkie wierzchołki po lewej stronie i z dołu} {Niezmiennik: Wydrukowane są wszystkie wierzchołki po lewej stronie, z dołu i z góry} while IsDown do if IsRight then Right {Wydrukowane są wszystkie wierzchołki po lewej stronie i z dołu} else {Nie ma z prawej, jest z dołu} Down {Robot jest w korzeniu, więc wydrukowane są wszystkie wierzchołki} Algorytm 4. Wydrukowanie wszystkich wierzchołków drzewa poszukiwań hetman. Otrzymany graf będzie drzewem poszukiwań i można zastosować program obejścia drzewa 2, wybierając do druku tylko te liście, w których hetmany się nie atakują. Drzewo poszukiwania, określone w poprzednim akapicie, ma n n liści i nn+1 1 n 1 wierzchołków. W taki sposób, można spodziewać się algorytmu o skomplikowalności O(n n ). Można powiększyć efektywność algorytmu, zmniejszywszy drzewo. Zauważmy, że jeżeli w k-stanie dwa hetmany się atakują, to nie ma sensu kontynuować poszukiwanie po tej gałęzi. Nazwiemy k-stan dopuszczalnym, jeżeli hetmany się nie atakują. Rozważmy drzewo, złożone tylko z dopuszczanych stanów (v. rysunek 8). Przedstawmy stan za pomocą zmiennej k, ilości ustawionych hetmanów, oraz tablicy P i, i = 1,... n, gdzie P i jest numerem pionownicy hetmana numer i, ustanowionego w poziomnicy i. Na przykład, stanowi A na rysunku 8 odpowiada k = 3, P = (1, 4, 2, ), w korzeniu k = 0. Przy i > k wartość P i nie jest istotną.

4 Alexander Denisjuk Rysunek 7. Drzewo stanów w zadaniu o hetmanach szachowych dla n = 2 A Rysunek 8. Drzewo stanów dopuszczalnych w zadaniu o hetmanach szachowych dla n = 4 Wprowadzimy trzy tablice pomocnicze H i, i = 1,..., n, U i, i = 2,... 2n oraz V j, j = 1 n,..., n 1. H i ma wartość prawda, jeżeli na i-ej pionownicy znajduje się hetman, oraz fałsz, jeżeli i-ta pionownica jest wolna. U i ma wartość prawda, jeżeli na i-ej prawej przekątnej znajduje się hetman, oraz fałsz, jeżeli i-ta prawa przekątna jest wolna. Hetman, umieszczony na poziomnicy y i pionownicy x, znajduje się na prawej przekątnej x + y, v. rysunek 9. V i ma wartość prawda, jeżeli na i-ej lewej przekątnej znajduje się hetman, odpowiednio fałsz, jeżeli i-ta lewa przekątna

4 3 2 1 1 2 3 4 2 3 4 5 6 7 8 Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych 5 1 2 3 4 4 3 2 1 U -3-2 -1 0 1 2 3 V Rysunek 9. Prawe przekątne Rysunek 10. Lewe przekątne jest wolna. Hetman, umieszczony na poziomnicy y i pionownicy x, znajduje się na lewej przekątnej x y, v. rysunek 10. Tablice H, U i V pomogą sprawdzić dopuszczalność stanu. Na przykład, dla stanu A na rysunku 8 tablicy te równe są odpowiednio H = (prawda, prawda, fałsz, prawda), U = (prawda, fałsz, fałsz, prawda, prawda, fałsz, fałsz), V = (fałsz, fałsz, prawda, prawda, fałsz, prawda, fałsz). W korzeniu wszystkie wartości tych tablic równe są fałsz. Do rozwiązania zadania zastosujemy algorytm 2. Główny program, łącznie z działaniami wstępnymi, przedstawiony jest w algorytmie 5. Dane: n > 0 Wyniki: wydrukowane są wszystkie rozwiązania zadania o hetmanach k 0 U 2 fałsz,..., U 2n fałsz V 1 n fałsz,..., V n 1 fałsz H 1 fałsz,..., H n fałsz algorytm 2 Algorytm 5. Program główny do zadania o hetmanach Do implementacja procedur IsDown oraz Down zauważmy, że poziom Robota na drzewie określony jest poprzez wartość zmiennej k (ilości umieszczonych hetmanów). W szczególności, w korzeniu k = 0. Implementacja procedur dana jest w algorytmach 6 i 7. Wyniki: IsDown = fałsz Robot jest w korzeniu if k = 0 then IsDown fałsz else {k > 0} IsDown prawda Algorytm 6. Procedura IsDown do zadania o hetmanach Dane: Robot jest w dopuszczalnym stanienie, nie w korzeniu (k > 0) Wyniki: Robot jest w dopuszczalnym stanie o jeden poziom niżej x P k ; y k H x fałsz U x y fałsz V x+y fałsz k k 1 Algorytm 7. Procedura Down do zadania o hetmanach W procedurze IsUp trzeba dobrać pionownicę dla kolejnego hetmana. W szczególności, jeżeli k = n, i.e. wszystkie hetmany zostały umieszczone, IsUp powinno być fałsz. Jeżeli k < n, to trzeba dobrać taką wartość P k+1 między 1

6 Alexander Denisjuk Dane: Robot jest w dopuszczalnym k-stanie Wyniki: IsUp = prawda i numer pionownicy dla kolejnego hetmana zapisany jest w New lub IsUp = fałsz i nie ma możliwości umieścić kolejnego hetmana if k = n then IsUp fałsz else {k < n} IsUp fałsz y k + 1 x 1 {Niezmiennik: IsUp = fałsz i nie można umieścić hetmana w pinownicach 1,..., x 1 lub IsUp = prawda i można umieścić hetmana w pionownicy x} while x n i IsUp = fałsz do if H x = fałsz i U x y = fałsz i V x+y = fałsz then IsUp prawda else {Pionownica lub jedna z przekątnych nie jest wolna} x x + 1 if IsUp = prawda then New x Algorytm 8. Procedura IsUp do zadania o hetmanach Dane: Robot jest w dopuszczalnym k-stanie i można umieścić kolejnego hetmana w pinownicy New Wyniki: Robot jest w pierwszym dopuszczalnym (k + 1)-stanie. k k + 1 x New y k P k x H x prawda U x y prawda V x+y prawda Algorytm 9. Procedura Up do zadania o hetmanach a n, żeby odpowiednia pionownica i dwie przekątne były wolne. Jeżeli takiej wartości nie ma, IsUp powinno być fałsz. Jeżeli IsUp = fałsz, wartość P k+1 nie jest istotną. Implementacja procedury dana jest w algorytmie 8. W procedurze Up trzeba umieścić kolejnego hetmana w pionownicy P k+1, i. e., oznaczyć pionownicę i obydwie przekątne, jako zajęte i powiększyć poziom Robota w drzewie. Implementacja procedury dana jest w algorytmie 9. Procedura IsRight jest podobna do procedury IsUp. Różnica polega na tym, że dobieramy pionownicę dla hetmana w tej samej poziomnicy. Implementacja procedury dana jest w algorytmie 10. W procedurze Right trzeba zdjąć hetmana z pozycji (P k, k) i umieścić jego w pozycji (New, k). Implementacja algorytm 11. W procedurze Work trzeba sprawdzić, czy zostały umieszczone wszystkie hetmany i, jeżeli tak, to wydrukować rozwiązanie. Implementacja dana jest w algorytmie 12. Dane: Robot jest w liściu. Wyniki: Jeżeli liść odpowiada rozwiązaniu, to ono jest wydrukowane if k = n then Wydrukować P. Algorytm 12. Procedura Work do zadania o hetmanach

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych 7 Dane: Robot jest w dopuszczalnym k-stanie Wyniki: IsRight = prawda i nowy numer pionownicy dla hetmana k zapisany jest w New lub IsRight = fałsz i nie ma możliwości umieścić hetmana k w tej samej poziomnicy y k x P k + 1 {Niezmiennik: IsRight = fałsz i nie można umieścić hetmana w pionownicach P k+1,..., x 1 lub IsRight = prawda i można umieścić hetmana w pionownicy x} while x n i IsRight = fałsz do if H x = fałsz i U x y = fałsz i V x+y = fałsz then IsRight prawda else {Pionownica lub jedna z przekątnych nie jest wolna} x x + 1 if IsRight = prawda then New x Algorytm 10. Procedura IsRight do zadania o hetmanach Dane: Robot jest w dopuszczalnym k-stanie i można umieścić hetmana w pionownicy New Wyniki: Robot jest w następnym dopuszczalnym k-stanie. x P k y k H x fałsz U x y fałsz V x+y fałsz x New P k x H x prawda U x y prawda V x+y prawda Algorytm 11. Procedura Right do zadania o hetmanach