Raport z projektu. Przedmiot: Algorytmy i struktury danych 1 Projekt: Wieża Hanoi Autor: Wojciech Topolski

Podobne dokumenty
Algorytmy. wer Wojciech Myszka 30 listopada 2008

Metody algortmiczne (Algorytmy Część IV)

Rekurencja. Przygotowała: Agnieszka Reiter

Jak tworzymy algorytmy? Wersja: 3

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

Wstęp do programowania

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

O rekurencji i nie tylko

Wykład 3. Metoda dziel i zwyciężaj

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Algorytm selekcji Hoare a. Łukasz Miemus

Matematyka dyskretna. Andrzej Łachwa, UJ, a/15

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

Strategia "dziel i zwyciężaj"

Poprawność semantyczna

Rekurencja. Przykład. Rozważmy ciąg

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

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Podstawy Informatyki. Metalurgia, I rok. Wykład 5 Rekurencja

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

Analiza algorytmów zadania podstawowe

2.7. Zakręt za zakrętem

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Zaawansowane algorytmy i struktury danych

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Złożoność obliczeniowa zadania, zestaw 2

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

ALGORYTMY I STRUKTURY DANYCH

Laboratorium nr 1. i 2.

Laboratorium nr 7 Sortowanie

Programowanie dynamiczne

5. Rekurencja. Przykłady

Zaawansowane algorytmy i struktury danych

Podział sieci na podsieci wytłumaczenie

Algorytmy z powrotami. Algorytm minimax

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Poprawność algorytmów

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

1.1. Uzupełnij poniższą tabelę: i wynik(i)

Metoda bisekcji (inaczej połowienia przedziału lub równych podziałów)

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Algorytmy i struktury danych. Wykład 4

Część I. Uwaga: Akceptowane są wszystkie odpowiedzi merytorycznie poprawne i spełniające warunki zadania. Zadanie 1.1. (0 3)

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Programowanie w VB Proste algorytmy sortowania

Rekurencja. Matematyka dyskretna

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Algorytmy w teorii liczb

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

wagi cyfry pozycje

Sortowanie. LABORKA Piotr Ciskowski

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Rekurencja (rekursja)

Wybrane algorytmy tablicowe

Algorytm. a programowanie -

Liczby całkowite i rzeczywiste

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Przez F(C) oznaczamy figurę narysowaną w kartezjańskim układzie współrzędnych, która ograniczona jest przez:

Metody rozwiązywania równań nieliniowych

Struktury Danych i Złożoność Obliczeniowa

7. Pętle for. Przykłady

TEORETYCZNE PODSTAWY INFORMATYKI

Kontrola przebiegu programu

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Lista 4. Kamil Matuszewski 22 marca 2016

Sortowanie przez wstawianie Insertion Sort

Złożoność algorytmów. Wstęp do Informatyki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Algorytmika w bioinformatyce

INFORMATYKA DANE.

Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne

Wykład 5. Metoda eliminacji Gaussa

Algorytmy i Struktury Danych.

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Konstrukcje warunkowe Pętle

ZADANIE 1. Ważenie (14 pkt)

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Algorytm i złożoność obliczeniowa algorytmu

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ Arkusz I. Czas pracy: 60 minut Liczba punktów do uzyskania: 15

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Wykład 6. Wyszukiwanie wzorca w tekście

Algorytmy i Struktury Danych.

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Algorytmy sortujące i wyszukujące

EGZAMIN MATURALNY W ROKU SZKOLNYM 2017/2018 INFORMATYKA

Sortowanie zewnętrzne

Transkrypt:

Raport z projektu Przedmiot: Algorytmy i struktury danych 1 Projekt: Wieża Hanoi Autor: Wojciech Topolski

Problem wieży Hanoi W wielkiej świątyni Benares w Hanoi, pod kopułą, która zaznacza środek świata, znajduje się płytka z brązu, na której umocowane są trzy diamentowe igły, wysokie na łokieć i cienkie jak talia osy. Na jednej z tych igieł, w momencie stworzenia świata, Bóg umieścił 64 krążki ze szczerego złota. Największy z nich leży na płytce z brązu, a pozostałe jeden na drugim, idąc malejąco od największego do najmniejszego. Jest to wieża Brahma. Bez przerwy we dnie i w nocy kapłani przekładają krążki z jednej diamentowej igły na drugą, przestrzegając niewzruszonych praw Brahma. Prawa te chcą, aby kapłan na służbie brał tylko jeden krążek na raz i aby umieszczał go na jednej z igieł w ten sposób, by nigdy nie znalazł się pod nim krążek mniejszy. Wówczas, gdy 64 krążki zostaną przełożone z igły, na której umieścił je Bóg w momencie stworzenia świata, na jedną z dwóch pozostałych igieł, wieża, świątynia, bramini rozsypią się w proch i w jednym oka mgnieniu nastąpi koniec świata. Dla 3 krążków problem można rozwiązać stosując prosty algorytm rekurencyjny, lub iteracyjny. Algorytm rekurencyjny jest postaci: void Hanoi(int n, int d) if (n == 0) return; Hanoi(n 1, -d); Przenies(n, d); Hanoi(n 1, -d); // Przenoszenie n-tego krazka od d pozycji Można jednak rozwiązać ten problem za pomocą algorytmu iteracyjnego. Aby to osiągnąć należy zauważyć, że krążki są przemieszczane sposób ustalony za pomocą następującego wzoru: np. n-ty krążek zaczyna z pozycji 1 słupka i jest przenoszony co 2 n 2 n 1 o x= 1 n 1, gdzie jeśli x = 1 to przenosimy krążek na słupek po prawej stronie, natomiast jeśli x = -1 to przenosimy krążek na słupek po lewej stronie. Możemy to rozpisać: Krążek nr. 1 przemieszcza się co 2^1 przeniesienie 1, 3, 5, 7, 9,..., 2^k 2^(1 1) zaczynając od 2^0 Krążek nr. 2 przemieszcza się co 2^2 przeniesienie 2, 6, 10, 14,..., 2^k 2^(2 1) zaczynając od 2^1 Krążek nr. 3 przemieszcza się co 2^3 przeniesienie 4, 12, 20, 28,..., 2^k 2^(3 1) zaczynając od 2^2... Krążek nr. n przemieszcza się co 2^n przeniesienie 2^n 2^(n 1) zaczynając od 2^(n 1) int ilosc_przeniesien = potega(ilosc_do_przelozenia) - 1; for (int j = 1; j <= ilosc_przeniesien; j++) // Sprawdzam ktory krazek mam przesunac // k to jest krazek do przeniesienia int k = 0; while (true) int z = potega(k); int y = z * 2; // Na podstawie numeru przeniesienia obliczam ktory krazek ma zosrac // przeniesiony. Robie to za pomoca wzory j - 2^k % 2^(k+1) == 0 // gdzie z = 2^k, y = 2^(k+1) if (((j - z) % y) == 0) // Przesuwam krazek krazek[k] += ((k + 1) % 2)? 2 : 1; krazek[k] = krazek[k] % 3; break; k++;

Testy dla n krążków i k słupków Ilość kr. 3 słupki 4 słupki 5 słupków 6 słupków 7 słupków 8 słupków 9 słupków 1 1 1 1 1 1 1 1 2 3 3 3 3 3 3 3 3 7 7 5 5 5 5 5 4 15 15 9 7 7 7 7 5 31 31 15 11 9 9 9 6 63 63 27 17 13 11 11 7 127 127 49 27 19 15 13 8 255 255 93 47 29 21 17 9 513 513 179 85 47 31 23 10 1023 1023 351 159 83 49 33 11 2047 2047 693 307 153 83 51 12 4095 4095 1377 601 291 151 83 13 8191 8191 2743 1187 565 285 151 14 16383 16383 5475 2359 1113 551 283 15 32767 32767 10937 4701 2207 1081 545 Ilość przeniesień Ilość przeniesień 35000 32500 30000 27500 25000 22500 20000 17500 15000 12500 10000 7500 5000 2500 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ilość krążków 3 słupki 4 słupki 5 słupków 6 słupków 7 słupków 8 słupków 9 słupków

Rozwiązywanie problemu Aby przenieść n-krążkową wieżę z jednego słupka na inny, należy podzielić słupki na 3 bazowe i k 3 słupki pomocnicze. Z n krążkowej kupki zdejmujemy n (k 3) krążki na inny słupek pomocniczy, a pozostałe krążki rozkładamy na słupki pomocnicze tak aby na każdym leżał tylko jeden krążek. Następnie składamy krążki z słupków pomocniczych na słupek docelowy, który jest wybrany ze słupków pomocniczych. Krok ten powtarzamy, aż n-krążkowa wieża nie zostanie przeniesiona na słupek docelowy. Analiza algorytmu dla 3 słupków Wieżę Hanoi z n krążkami oznaczmy przez h n. Z przeprowadzonych testów można zauważyć, że: h 1 =2 1 1 ;h 2 =2 2 1 ;h 3 =2 3 1 ;..., gdzie potęga jest równa indeksowi liczby h. Na tej podstawie można przypuszczać, że h n =2 n 1 dla dowolnej liczby krążków n. Z rekurencyjnego algorytmu rozwiązywania łamigłówki wieża Hanoi wynika następująca zależność rekurencyjna = między liczbami: h 1 dla n=1 n 2 h n 1 1 dla n 1 Powyższą zależność możemy sprawdzić indukcyjnie. Wiemy, że: h 1 =2 1 1 =1, załóżmy że h n =2 n 1, a zatem h n 1 =2 h n 1 =2 2 n 1 1 =2 n 1 1 Udowodniliśmy zatem, że złożoność algorytmu wynosi O 2 n. Analiza algorytmu dla 4 słupków Choć dla 4 słupków algorytm zachowuje się inaczej niż dla 3 to złożoność obliczeniowa jest identyczna z tą dla 3 słupków. Wynika to z tego, iż dla np. n krążków pierwszym krokiem dla przeniesienia ich na inny słupek jest przeniesienie n 1 krążków metodą wieży Hanoi dla 3 słupków, a następnie n-tego krążka. Krok ten powtarza się dopóki cała kupka nie zostanie przeniesiona. Dla przykładu przeniosę kupkę n = 5 31 =h 5 = h 4 1 h 3 1 h 2 1 h 1 1 h 1 = 15 1 7 1 3 1 1 1 1 =31 Analiza algorytmu dla 5 słupków Analizując wyniki algorytmu dla 5 słupków dochodzimy do wzoru rekurencyjnego w postaci: = 2 n 1 dla n=1..3 h n 2 h n 1 n 2 dla n=2 k 3, k Z 2 h n 1 n 3 dla n=2 k 2, k Z Niestety nie udało mi się uprościć tej funkcji rekurencyjnej, ale pomimo tego można na zauważyć złożoność algorytmu dla 5 słupków. Dla przykładu: h 6 =2 h 5 n 3 =2 2 h 4 n 2 n 3 =2 2 2 h 3 n 3 n 2 n 3 = =2 2 2 2 3 1 n 3 n 2 n 3 =2 2 2 2 3 2 n 3 n 2 n 3 = =2 2 2 2 3 n 1 n 2 n 3 =2 2 3 3 2 n 2 n 2 n 3 = =2 2 3 3 3 n 4 n 3 =2 4 3 6 n 8 n 3 =3 2 4 7 n 11 Obcinając końcówkę możemy uogólnić wzór i podpierając się notacją, O złożoność algorytmu wyznaczamy przez O 3 2 n =3 O 2 n

Wnioski Właściwy algorytm wież Hanoi, a więc dla 3 słupków jest algorytmem optymalnym i ma złożoność O 2 n. Wraz z dokładaniem słupków wydajność wzrasta, a ilość przełożeń potrzebnych do wykonania algorytmu maleje. Niestety prezentowane rozwiązanie nie należy do optymalnych, należy jednak zwrócić uwagę, iż nie znaleziono dotychczas algorytmu, który dokonał by przełożenia wszystkich krążków w minimalnej liczbie ruchów. Akceptowane będą wszystkie rozwiązania, które dadzą wynik nie gorszy od naszego i będą miały nie gorszą złożoność.