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

Podobne dokumenty
Sortowanie przez scalanie

Strategia "dziel i zwyciężaj"

Wstęp do programowania

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Analiza algorytmów zadania podstawowe

Analiza algorytmów zadania podstawowe

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytmy i Struktury Danych.

Algorytm selekcji Hoare a. Łukasz Miemus

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

Algorytmy i Struktury Danych, 2. ćwiczenia

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

Wykład 2. Poprawność algorytmów

Problemy porządkowe zadania

Teoretyczne podstawy informatyki

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Wstęp do programowania

Programowanie dynamiczne cz. 2

Programowanie w VB Proste algorytmy sortowania

TEORETYCZNE PODSTAWY INFORMATYKI

Zaawansowane algorytmy i struktury danych

Algorytmika w bioinformatyce

Rekurencja. Przygotowała: Agnieszka Reiter

Efektywna metoda sortowania sortowanie przez scalanie

TEORETYCZNE PODSTAWY INFORMATYKI

Programowanie dynamiczne i algorytmy zachłanne

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

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

Algorytmika w bioinformatyce

Zaawansowane algorytmy i struktury danych

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

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 )

TEORETYCZNE PODSTAWY INFORMATYKI

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Sortowanie w czasie liniowym

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

Teoretyczne podstawy informatyki

Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

Wstęp do programowania

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Przy pomocy indukcji udowodnimy, że nastąpi koniec świata, a warto byłoby wiedzieć kiedy, czy przed czy po egzaminie.

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

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

Sortowanie. LABORKA Piotr Ciskowski

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

Wstęp do programowania

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

Informatyka A. Algorytmy

Wykład 4: Iteracja, indukcja i rekurencja

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

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

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

Laboratoria nr 1. Sortowanie

Struktury Danych i Złożoność Obliczeniowa

5. Podstawowe algorytmy i ich cechy.

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

Algorytmy i Struktury Danych, 2. ćwiczenia

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

Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych

Wstęp do programowania

5. Rekurencja. Przykłady

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

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

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

Syllabus Wprowadzenie Poprawno

Programowanie dynamiczne

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Sortowanie przez wstawianie Insertion Sort

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

Gra logiczna dla 2 5 osób Czas rozgrywki około 45 minut Wiek od 7 lat

Algorytmy i Struktury Danych

Matematyczne Podstawy Informatyki

Algorytmy sortujące i wyszukujące

Jeszcze o algorytmach

Laboratorium nr 7 Sortowanie

Podstawy Programowania semestr drugi. Wykład dziewiąty

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

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

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

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Programowanie dynamiczne (optymalizacja dynamiczna).

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

Wstęp do programowania

Wykład 5: Iteracja, indukcja i rekurencja Sortowanie

Laboratoria nr 1. Sortowanie

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

Podstawy Informatyki. Sprawność algorytmów

KOPCE KOLEJKI PRIORYTETOWE - PRZYPOMNIENIE KOPCE WYSOKOŚĆ KOPCA KOPCE I KOLEJKI PRIORYTETOWE PROJEKTOWANIE ALGORYTMÓW I METODY SZTUCZNEJ INTELIGENCJI

Algorytmy sortujące 1

Algorytmy i struktury danych IS/IO, WIMiIP

Metody numeryczne w przykładach

Programowanie Proceduralne

Temat: Algorytmy zachłanne

Wstęp do Programowania potok funkcyjny

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

Temat 7. Najlżejsze i najcięższe algorytmy sortowania

Poprawność semantyczna

Algorytmy i Struktury Danych.

Transkrypt:

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

Wprowadzenie Technika konstrukcji algorytmów dziel i zwyciężaj. przykładowe problemy: Wypełnianie planszy Poszukiwanie (binarne) Sortowanie (sortowanie przez łączenie - merge sort). 2

Wypełnianie planszy Zadanie: dysponując klockami oraz planszą 2 n x2 n z brakującym polem: Wypełnić plansze w całości: 3

Wypełnianie planszy: przypadki trywialne (n = 1) Przypadek trywialny (n = 1): wypełniamy plansze jednym klockiem: Idea dla rozwiązania problemu doprowadzić rozmiar zadania do przypadku trywialnego, który umiemy rozwiązać 4

Wypełnianie planszy : podział zadania Oryginalną planszę dzielimy na 4 części Dostajemy problemy o rozmiarze 2 n-1 x2 n-1 Ale: trzy z nich nie są podobne do oryginalnego (plansze nie mają brakującego pola)! 5

Wypełnianie planszy : podział zadania pomysł: umieszczamy jeden klocek w środku planszy i dokonujemy podziału na 4 części Teraz otrzymujemy 4 plansze o rozmiarach 2 n-1 x2 n-1. Każda z planszy ma brakujące pole 6

Wypełnianie planszy : algorytm INPUT: n plansza 2 n x2 n, L pozycja brakującego pola. OUTPUT: wypełniona plansza Tile(n, L) if n = 1 then przypadek trywialny wypełnij jednym klockiem return umieść jeden klocek w środku planszy podziel planszę na 4 równe części Niech L1, L2, L3, L4 oznaczają pozycje 4 brakujących pól Tile(n-1, L1) Tile(n-1, L2) Tile(n-1, L3) Tile(n-1, L4) 7

Dziel i zwyciężaj Metoda konstrukcji algorytmów Dziel i zwyciężaj : Jeśli problem jest na tyle mały, że umiesz go rozwiązać - zrób to. Jeśli nie to: Podział: Podziel problem na dwa lub więcej rozdzielnych podproblemów Rozwiązanie: Wykorzystaj metodę rekurencyjnie dla rozwiązania tych podproblemów Łączenie: połącz rozwiązania podproblemów tak, aby rozwiązać oryginalny problem 8

Wypełnianie planszy : Dziel i zwyciężaj Wypełnianie jest przykładem algorytmu dziel i zwyciężaj : w wypadku trywialnym (2x2) po prostu wypełniamy planszę, lub: Dzielimy planszę na 4 mniejsze części (wprowadzając wypełnione miejsce w rogu, przez umieszczenie centralnie jednego klocka) Rozwiązujemy problem rekursywnie stosując tą samą metodę Łączymy części umieszczając klocek w środku planszy 9

Poszukiwanie binarne Odnaleźć liczbę w posortowanej tablicy: Przypadek trywialny tablica jest jednoelementowa Albo dzielimy tablice na dwie równe części i rozwiązujemy zadanie osobno dla każdej z nich INPUT: A[1..n] posortowana niemalejąco tablica liczb, s liczba. OUTPUT: indeks j taki, że A[j] = s. NIL, jeśli "j (1 j n): A[j] s Binary-search(A, p, r, s): if p = r then if A[p] = s then return p else return NIL q (p+r)/2 ret Binary-search(A, p, q, s) if ret = NIL then return Binary-search(A, q+1, r, s) else return ret 10

Rekurencja Czas działania algorytmu z odwołaniami rekursywnymi można opisać poprzez rekurencję Równanie/nierówność opisująca funkcję poprzez jej wartości dla mniejszego argumentu Przykład: poszukiwanie binarne Tn ( ) (1) if n 1 2 T( n / 2) (1) if n 1 Po rozwiązaniu daje to złożoność O(n)! taką samą jak dla metody naiwnej 11

Poszukiwanie binarne (poprawione) T(n) = (n) nie lepiej niż dla metody siłowej! Poprawa: rozwiązywać zadanie tylko dla jednej połowy tablicy INPUT: A[1..n] posortowana niemalejąco tablica liczb, s liczba. OUTPUT: indeks j taki, że A[j] = s. NIL, jeśli "j (1 j n): A[j] s Binary-search(A, p, r, s): if p = r then if A[p] = s then return p else return NIL q (p+r)/2 if A[q] s then return Binary-search(A, p, q, s) else return Binary-search(A, q+1, r, s) 12

Czas działania metody Tn ( ) (1) if n 1 T ( n / 2) (1) if n 1 T(n) = (lg n)! 13

Sortowanie przez łączenie (merge sort) Podziel: Jeśli S posiada przynajmniej dwa elementy (1 lub 0 elementów przypadek trywialny), podziel S na dwie równe (z dokładnością do 1 elementu) części S 1 i S 2. (tj. S 1 zawiera pierwsze n/2 elementów, a S 2 kolejne n/2 ). Zwyciężaj: posortuj sekwencje S 1 i S 2 stosując Merge Sort. Połącz: Połącz elementy z dwóch posortowanych sekwencji S 1 i S 2 w sekwencję S zachowaniem porządku 14

Algorytm Merge Sort Merge-Sort(A, p, r) if p < r then q (p+r)/2 Merge-Sort(A, p, q) Merge-Sort(A, q+1, r) Merge(A, p, q, r) Merge(A, p, q, r) wybieramy mniejszy z dwóch elementów na początku sekwencji A[p..q] oraz A[q+1..r] i wkładamy go do sekwencji wynikowej, przestawiamy odpowiedni znacznik. Powtarzamy to aż do wyczerpania się elementów. Rezultat kopiujemy do A[p..r]. 15

Sortowanie przez łączenie - 1 16

Sortowanie przez łączenie - 2 17

Sortowanie przez łączenie - 3 18

Sortowanie przez łączenie - 4 19

Sortowanie przez łączenie - 5 20

Sortowanie przez łączenie - 6 21

Sortowanie przez łączenie - 7 22

Sortowanie przez łączenie - 8 23

Sortowanie przez łączenie - 9 24

Sortowanie przez łączenie - 10 25

Sortowanie przez łączenie - 11 26

Sortowanie przez łączenie - 12 27

Sortowanie przez łączenie - 13 28

Sortowanie przez łączenie - 14 29

Sortowanie przez łączenie - 15 30

Sortowanie przez łączenie - 16 31

Sortowanie przez łączenie - 17 32

Sortowanie przez łączenie - 18 33

Sortowanie przez łączenie - 19 34

Sortowanie przez łączenie - 20 35

Sortowanie przez łączenie - 21 36

Sortowanie przez łączenie - 22 37

Sortowanie przez łączenie podsumowanie Sortowanie n liczb jeśli n=1 trywialne rekursywnie sortujemy 2 ciągi n/2 i n/2 liczb łączymy dwa ciągi w czasie (n) Strategia Podział problemu na mniejsze, ale analogiczne podproblemy Rekursywne rozwiązywanie podproblemów Łączenie otrzymanych rozwiązań 38

Sortowanie przez łączenie czas działania Czas działania algorytmu może być reprezentowany przez następującą zależność rekurencyjną: Tn ( ) (1) if n 1 2 T( n / 2) ( n) if n 1 Po rozwiązaniu dostajemy: T ( n) ( nlg n) 39

Wieże Hanoi Mamy 3 wieże oraz stos 64 dysków o zmniejszających się średnicach umieszczonych na pierwszej wieży Potrzebujemy przenieść wszystkie dyski na inną wieżę Zabronione jest położenie dysku większego na mniejszym W każdym kroku wolno mam przenieść tylko jeden dysk 40

Wieże Hanoi 41

Rozwiązanie rekursywne 42

Algorytm rekursywny INPUT: n ilość dysków, a, b, c wieże, wieża a zawiera wszystkie dyski. OUTPUT: a, b, c wieże, wieża b zawiera wszystkie dyski Hanoi(n, a, b, c) if n = 1 then Move(a,b); else Hanoi(n-1,a,c,b); Move(a,b); Hanoi(n-1,c,b,a); Poprawność algorytmu łatwo pokazać przez indukcję względem n. 43

Ilość kroków n M(n) Ilość kroków M(n) potrzebnych do rozwiązania problemu dla n dysków spełnia zależność rekurencyjną M(1) = 1 M(n) = 2M(n-1) + 1 1 1 2 3 3 7 4 15 5 31 44

Ilość kroków Rozwijając tę zależność dostajemy M(n) = 2M(n-1) + 1 = 2*[2*M(n-2)+1] + 1 = 2 2 * M(n-2) + 1+2 = 2 2 * [2*M(n-3)+1] + 1 + 2 = 2 3 * M(n-3) + 1+2 + 2 2 = Po k krokach M(n) = 2 k * M(n-k) + 1+2 + 2 2 + + 2 n-k-1 Dla k = n-1 M(n) = 2 n-1 * M(1) + 1+2 + 2 2 + + 2 n-2 = 1 + 2 + + 2 n-1 = 2 n -1 45