Algorytmy i Struktury Danych

Podobne dokumenty
Algorytmy i Struktury Danych

Projektowanie i analiza algorytmów

Projektowanie i Analiza Algorytmów

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Projektowanie i analiza algorytmów

Zaawansowane algorytmy i struktury danych

Matematyczne Podstawy Informatyki

Teoretyczne podstawy informatyki

Wstęp do programowania

Rekurencja (rekursja)

Sylabus modułu: Matematyczne podstawy informatyki (kod modułu:03-mo2n-12-mpln)

koordynator modułu dr hab. Michał Baczyński rok akademicki 2012/2013

TEORETYCZNE PODSTAWY INFORMATYKI

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

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

Strategia "dziel i zwyciężaj"

ALGORYTMY I STRUKTURY DANYCH

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

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Rekurencja. Przygotowała: Agnieszka Reiter

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych.

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

Technologie informacyjne Wykład VII-IX

Zaawansowane algorytmy i struktury danych

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

Sortowanie przez scalanie

Poprawność semantyczna

Matematyka dyskretna dla informatyków

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

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

Rozdział 4. Algorytmy sortowania 73 Rozdział 5. Typy i struktury danych 89 Rozdział 6. Derekursywacja i optymalizacja algorytmów 147

Wstęp do programowania

Podstawy programowania. Podstawy C# Przykłady algorytmów

TEORETYCZNE PODSTAWY INFORMATYKI

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Zał nr 4 do ZW. Dla grupy kursów zaznaczyć kurs końcowy. Liczba punktów ECTS charakterze praktycznym (P)

Programowanie komputerowe. Zajęcia 3

O rekurencji i nie tylko

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Technologie Informacyjne

Algorytmika i pseudoprogramowanie

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

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

KARTA MODUŁU KSZTAŁCENIA

Teoretyczne podstawy informatyki

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

Algorytmy i struktury danych.

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

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne

Paradygmaty programowania

Wykład 1 Wprowadzenie do algorytmów. Zawartość wykładu 1. Wstęp do algorytmów i struktur danych 2. Algorytmy z rozgałęzieniami.

Sortowanie - wybrane algorytmy

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Algorytmy i struktury danych. Wykład 4

Wykład 4: Iteracja, indukcja i rekurencja

Metody numeryczne w przykładach

5. Podstawowe algorytmy i ich cechy.

Analiza algorytmów zadania podstawowe

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

Obrazy rekurencyjne. Zastosowanie rekurencji w algorytmice. AUTOR: Martin Śniegoń

Podstawy Programowania 2 Rekurencja, metoda dziel i zwyciężaj. Plan. Rekurencja Wstęp. Rekurencja Wstęp. Notatki. Notatki. Notatki.

5. Rekurencja. Przykłady

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

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

Programowanie dynamiczne cz. 2

6. Pętle while. Przykłady

Metody Programowania

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Anatomia definicji rekursywnej. Anatomia definicji rekursywnej. int silnia(intn){ if(n==0) return 1; else return n*silnia(n-1); }

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

Algorytm i złożoność obliczeniowa algorytmu

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

Testy jednostkowe Wybrane problemy testowania metod rekurencyjnych

Metody numeryczne I. Janusz Szwabiński. Metody numeryczne I (C) 2004 Janusz Szwabiński p.1/61

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

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

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

Informatyka A. Algorytmy

Logika i teoria mnogości Wykład 14

Zaliczenie. Egzamin. lub. Wykład. Zaliczenie. Ćwiczenie. 3 zadania. Projekty. Ocena. Na ocenę

TEORETYCZNE PODSTAWY INFORMATYKI

Projektowanie algorytmów rekurencyjnych

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Laboratorium nr 1. i 2.

KARTA PRZEDMIOTU. Algorytmy i struktury danych, C4

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

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

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Metody numeryczne. Janusz Szwabiński. nm_slides.tex Metody numeryczne Janusz Szwabiński 2/10/ :02 p.

Transkrypt:

POLITECHNIKA KRAKOWSKA WYDZIAŁ INŻYNIERII ELEKTRYCZNEJ i KOMPUTEROWEJ Katedra Automatyki i Technik Informacyjnych Algorytmy i Struktury Danych www.pk.edu.pl/~zk/aisd_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl

Wykład 4: R e k u r s j a 1. Pojęcie rekursji. 2. Rekursja liniowa i drzewiasta. 3. Rekurencyjne wyznaczanie wartości ciągów: silnia, liczby Fibonacciego, współczynniki dwumienne 4. Inne algorytmy rekurencyjne: wieże Hanoi, sortowanie MergeSort i QuickSort trawersowanie drzew binarnych 5. Analiza zalet i wad rekursji. 6. Eliminacja rekursji: iteracja, zastosowanie stosu. 7. Rozwiązywanie rekurencji: metoda podstawiania, metoda iteracyjna, metoda rekurencji uniwersalnej.

Pojęcie rekursji Rekursja jest silnym narzędziem w definicjach matematycznych. Potęga rekursji uwidacznia się w możliwości definiowania nieskończonego zbioru obiektów (liczb naturalnych, drzew, krzywych Hilberta, krzywych Sierpińskiego) za pomocą skończonego wyrażenia. (Wirth 1980) W informatyce rekursja jest techniką programowania, w której procedura lub funkcja wywołuje samą siebie (przykład: wybór maksimum zbioru).

Rekursja liniowa Rekursyjną funkcją liniową nazywamy rekursję, która wykonuje tylko jedno wywołanie rekurencyjne samej siebie. Uwaga 1: nie wystarczy, że wywołanie występuje w jednym miejscu funkcji, bo może być np. wewnątrz pętli. Uwaga 2: wywołanie może następować w dwóch miejscach funkcji, np. w instrukcji warunkowej if else, a być wykonywane tylko jeden raz. Uwaga 3: drzewo rekursji dla rekursyjnej funkcji liniowej ma bardzo prostą postać łańcucha, w którym każdy wierzchołek posiada jednego potomka; przykładem jest tu funkcja obliczająca wartość silni.

Rekursja drzewiasta Rekursyjną funkcją drzewiastą nazywamy rekursję, która wykonuje więcej niż jedno wywołanie rekurencyjne samej siebie. Uwaga 1: najbardziej znane są fukcje z dwoma wywołaniami samych siebie (tzw. rekursja podwójna). Uwaga 2: podwójna rekursja jest czasem optymalna (z dokładnością do stałej); przykłady: trawersowanie drzewa w czasie zależnym od jego rozmiaru, rozwiązanie problemu wież Hanoi w czasie wykładniczym odpowiadającym naturze problemu. Uwaga 3: funkcja rekurencyjna może zostać zastąpiona przez równoważną jej z punktu widzenia złożoności funkcję iteracyjną (przy wykorzystaniu stosu i pewnego schematu konwersji); rozwiązania iteracyjne można tworzyć bezpośrednio bez definiowania rekursji i posługiwania się schematem.

Ciągi liczbowe definicje rekurencyjne

Silnia (ang. Factorial) Ciągi liczbowe: silnia n!=n (n-1) 2 1= n (n-1)! 1!=1 2!=2 3!=6 4!=24 5!=120 6!=720... Formuła Stirlinga : n! (n/e)^n (2πn)^(1/2) Program rekurencyjny: unsigned long silnia(int x) { if (x==0) return 1; else return x * silnia(x-1); }

Wykonanie silnia(3) rekursja liniowa unsigned long silnia(int x) { if (x==0) return 1; else return x * silnia(x-1); }

Ciągi liczbowe: liczby Fibonacciego Liczby Fibonacciego można obliczyć ze wzorów: F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2), dla n>2. Sekwencja liczb Fibonacciego to: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 377, 610, 987, 1597, 2584, Dla dużych wartości n zachodzi F(n)/F(n-1) 1.618. Jest to tzw. złoty podział, stosowany jako miara klasycznych proporcji w architekturze. Program rekurencyjny: unsigned long f(int x) { if (x<2) return 1; else return (f(x-1) + f(x-2)); }

Ciągi liczbowe: współczynniki dwumienne Współczynnik dwumienny C(n,k) liczba wszystkich kombinacji k-elementowych zbioru n-elementowego: C(n,k)=0, C(n,k)=1, C(n,k)=C(n-1,k)+C(n-1,k-1), dla k >n; dla k=0 i dla k=n; dla 0<k<n. Liczby C(n,k) tworzą tzw. trójkąt Pascala. Program rekurencyjny: unsigned long C(int x, int y) { if (y>x) return 0; else if (y==0 (y==x) return 1; else if (y>0)&&(y<x) return (C(x-1,y) + C(x-1,y-1)); }

Wieże Hanoi 1

Wieże Hanoi 2

Sortowanie przez scalanie (MergeSort) 1

Sortowanie przez scalanie (MergeSort) 2

Sortowanie przez scalanie (MergeSort) 3

Sortowanie szybkie (QuickSort) 1

Sortowanie szybkie (QuickSort) 2

Sortowanie szybkie (QuickSort) 3

Sortowanie szybkie (QuickSort) 4

Sortowanie szybkie (QuickSort) 5

Trawersowanie drzew binarnych porządki: preorder, inorder oraz postorder

Zalety rekursji 1. Ogólna metoda rozwiązywania rozmaitych problemów. 2. Często jest to metoda wynikająca z rekurencyjnego zdefiniowania rozwiazania problemu ( dziel i zwyciężaj ). 3. Zapis algorytmu (programu rekurencyjnego) jest bardzo zwięzły. 4. Niejawne wykorzystywanie stosu jest bardzo wygodne dla programisty. 5. Istnieją metody wyznaczania złożoności obliczeniowej funkcji rekurencyjnych.

1. Metoda nie jest uniwersalna. Wady rekursji 2. Często nie jest łatwo znaleźć rozwiązanie rekurencyjne. 3. Rekursja drzewiasta wymaga często znacznej ilości pamięci na przechowanie stanu obliczeń w momencie każdego wywołania funkcji. 4. Rekursja drzewiasta wymaga często wielokrotnego obliczania tych samych wartości, które ulegają zatarciu, stąd wykładnicza złożoność czasowa tej metody. 5. Program rekurencyjny korzysta w sposób niejawny ze stosu, co może prowadzić do błędu wykonania programu polegającego na przepełnieniu stosu (stack overflow). 6. Niektóre języki programowania (FORTRAN) zabraniały stosowania rekursji. 7. Wyznaczenie złożoności obliczeniowej funkcji rekurencyjnej może być bardzo żmudne.

Analiza złożoności rekursji w strukturach drzewiastych liczby Fibonacciego Drzewo binarne pokazuje wykonanie algorytmu rekursyjnego. Obliczając funkcję f(5) otrzymujemy drzewo wywołań rekurencyjnych w algorytmie trawersowane w porządku preorder. Krawędzie skierowane w dół odpowiadają argumentowi funkcji f, a skierowane w górę zwróconej wartości funkcji. Obserwujemy wielokrotne wywołania z tym samym argumentem. Liczba liści drzewa odpowiada sumie liczby wywołań f(1) i f(2) z wartościami 1, czyli f(n). Stąd f(n)=1+1+...+1. Rekursja dekomponuje f(n) na funkcje zwracające 1 a następnie sumuje te jedynki wykonując f(n)-1 operacji +, z których każda jest wykonywana w odrębnym wywołaniu! Liczba wszystkich wywołań f jest równa 2f(n)-1.

Analiza złożoności rekursji w strukturach drzewiastych liczby Fibonacciego Twierdzenie Funkcja f(n) rośnie wykładniczo z n. Dowód. Zaobserwujmy, że f(n) = f(n-1) + f(n-2) = f(n-2)+f(n-3)+f(n-2) = 2f(n-2)+f(n-3) > > 2f(n-2). Stąd f(n) > 2f(n-2) > 2(2f(n-2-2) = 4f(n-4) > 4(2f(n-4-2) = 8f(n-6) > > (2^k) f(n-2k), dla n-2k>0. Jeśli n jest parzyste zatrzymujemy się dla n-2k=2; w przeciwnym wypadku - dla n-2k=1. W obu przypadkach k=(n-1)/2 (wynik dzielenia jest liczbą całkowitą zaokrągloną w dół). Ponieważ f(1)=f(2)=1, otrzymujemy : f(n) > 2^(n-1)/2 (po prawej stronie nierówności jest funkcja wykładnicza). c.b.d.o.

Analiza złożoności rekursji w strukturach drzewiastych współczynniki dwumienne Drzewo binarne pokazuje wykonanie algorytmu rekursyjnego. Obliczając funkcję C(4,2) otrzymujemy drzewo wywołań rekurencyjnych w algorytmie trawersowane w porządku preorder. Krawędzie skierowane w dół odpowiadają argumentowi funkcji C, a skierowane w górę zwróconej wartości funkcji. Obserwujemy wielokrotne wywołania z tym samym argumentem. Liczba liści drzewa odpowiada sumie liczby wywołań C z wartościami 1, czyli C(n,k). Stąd mamy C(n,k)=1+1+...+1. Rekursja dekomponuje C(n,k) na funkcje zwracające 1 a następnie sumuje te jedynki wykonując C(n)-1 operacji +, z których każda jest wykonywana w odrębnym wywołaniu! Liczba wszystkich wywołań C jest równa 2C(n)-1.

Eliminacja rekursji schemat iteracyjny

Eliminacja rekursji wykorzystanie stosu 1. Jednym ze sposobów eliminacji rekursji jest jawne wykorzystanie w programie struktury stosu do przechowywania stanu obliczeń. 2. Stos musi mieć odpowiedni rozmiar odpowiadający rozmiarowi problemu. Tu również może nastąpić błąd przepełnienia stosu. 3. Niklaus Wirth w swoje klasycznej ksiażce Algorytmy + struktury danych = programy podał nierekurencyjną wersję sortowania szybkiego z jawnym stosem (program 2.11).

Złożoność obliczeniowa algorytmów rekurencyjnych rozwiązywanie rekurencji

Metoda podstawiania

Metoda iteracyjna

Kontrukcja drzewa rekursji dla równania rekurencyjnego T(n)=2T(n/2)+n^2

Kontrukcja drzewa rekursji dla równania rekurencyjnego T(n)=T(n/3)+T(2n/3)+n

Kontrukcja drzewa rekursji dla równania rekurencyjnego T(n)=aT(n/b)+f(n)

Metoda rekurencji uniwersalnej 1

Metoda rekurencji uniwersalnej 2

Źródła wzorów, przykładów i rysunków : 1. Cormen T.H., Leiserson C.E., Rievest R.L. : Wprowadzenie do algorytmów, WNT 1999 2. Kubale M. : Introduction to computational complexity and algorithmic graph coloring, GTN 1998 3. Sedgewick R. : Algorithms in C, Addison-Wesley 1990 4. Stojmenovič I. : Recursive algorithms in computer science courses: Fibonacci numbers and binomial coefficients, IEEE Trans. Education 43 (3), 2000, 273-276. 5. Wirth N. : Algotytmy + struktury danych = programy, WNT 1980