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

Podobne dokumenty
Algorytmy i Struktury Danych.

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Strategia "dziel i zwyciężaj"

Sortowanie przez scalanie

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

Analiza algorytmów zadania podstawowe

Programowanie w VB Proste algorytmy sortowania

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 )

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Struktury Danych i Złożoność Obliczeniowa

Wstęp do programowania

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

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

Algorytmy i struktury danych

TEORETYCZNE PODSTAWY INFORMATYKI

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych, 2. ćwiczenia

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

Teoretyczne podstawy informatyki

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

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy i Struktury Danych

Efektywna metoda sortowania sortowanie przez scalanie

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

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

Technologie informacyjne Wykład VII-IX

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

Informatyka A. Algorytmy

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

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

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Jeszcze o algorytmach

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

Zaawansowane algorytmy i struktury danych

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

Sortowanie - wybrane algorytmy

2:8,7 3:9,4 / \ / \ / \ / \ 4:7,3 5:8 6:9,2 7:4

Wstęp do programowania

Zaawansowane algorytmy i struktury danych

Algorytmy i Struktury Danych.

TEORETYCZNE PODSTAWY INFORMATYKI

Programowanie Współbieżne. Algorytmy

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Algorytmy i struktury danych

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

Sortowanie. Bartman Jacek Algorytmy i struktury

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

Poszukiwanie liniowe wśród liczb naturalnych

Programowanie Proceduralne

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

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

Sortowanie. LABORKA Piotr Ciskowski

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

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

Programowanie Równoległe i Rozproszone. Algorytm Kung a. Algorytm Kung a. Programowanie Równoległe i Rozproszone Wykład 8. Przygotował: Lucjan Stapp

Wstęp do programowania

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

Programowanie dynamiczne cz. 2

TEORETYCZNE PODSTAWY INFORMATYKI

Wykład 4: Iteracja, indukcja i rekurencja

ALGORYTMY POSZUKIWANIA I PORZĄDKOWANIA ELEMENTY JĘZYKA PROGRAMOWANIA

Porządek symetryczny: right(x)

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

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

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

Wstęp do Programowania potok funkcyjny

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

Sortowanie topologiczne skierowanych grafów acyklicznych

Algorytm selekcji Hoare a. Łukasz Miemus

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytmy i Struktury Danych. (c) Marcin Sydow. Introduction. QuickSort. Sortowanie 2. Limit. CountSort. RadixSort. Summary

Podstawy Informatyki. Sprawność algorytmów

Dynamiczne struktury danych

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Wprowadzenie do programowania

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

Programowanie dynamiczne i algorytmy zachłanne

Wstęp do Programowania potok funkcyjny

Algorytmy sortujące i wyszukujące

Wstęp do programowania

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Składnia funkcji i Rekurencja w języku Haskell

Problemy porządkowe zadania

Matematyczne Podstawy Informatyki

EGZAMIN MATURALNY OD ROKU SZKOLNEGO

Źródła. N.Wirth Algorithms and Data Structures, 1985 D.E.Knuth The Art of Computer Programming. Vol. 3, 1973

Teoretyczne podstawy informatyki

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

Technologie Informatyczne Wykład VII

Algorytmika i pseudoprogramowanie

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

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

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

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

Laboratorium nr 7 Sortowanie

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

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

Transkrypt:

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

Divide et impera Starożytni Rzymianie znali tę zasadę Łatwiej się rządzi, jeśli poddani są podzieleni Nie chodziło im jednak bynajmniej o podziały administracyjne Chodziło o to, zeby skłócić poddanych!... my zrobimy to bardziej humanitarnie. 2

Zasada dziel i rządź w programowaniu Chodzi o to, żeby po pierwsze umieć rozwiązać problem dla małych danych... a po drugie, żeby mając duże dane tak je podzielic, aby problem sprowadzić do kilku mniejszych podproblemów, a potem scalić wyniki. Idealnie nadaje się do tego mechanizm rekursji, ale można sie często bez niej obyć. 3

Znajdowanie minimum i maksimum w tablicy Jak znaleźć jednocześnie dwie wartości: największą i najmniejszą w tablicy? Rozwiązanie: podzielmy tablicę na dwie połówki rozwiążmy problem maksimum-minimum w każdej z nich, otrzymując pary (minl,maxl),(minp,maxp) wynik, to para(min(minl,minp), max(maxl,maxp)) Czy coś zyskaliśmy? 4

Analiza złożoności Gdybyśmy te dwie wartości znajdowali po kolei, wykonalibyśmy 2n-2 porównania. Oznaczmy przez T(n) liczbę porównań wykonywanych przez nasz algorytm dla n danych T(1)=0 T(n)=2T(n/2)+2 Rozwiązanie tego układu jest dość proste. Można przez indukcję pokazać, że dla n=2 k T(n)=(3/2)n-2 5

Twierdzenie Pohla Problemu min-max nie da się rozwiązać taniej niż za pomocą (3/2)n -2 porównań. Dowód (bardzo ciekawy) w książce L.Banachowski, A.Kreczmar Elementy Analizy Algorytmów. 6

Twierdzenie Pohla Problemu min-max nie da się rozwiązać taniej niż za pomocą (3/2)n -2 porównań. Dowód (bardzo ciekawy) w książce L.Banachowski, A.Kreczmar Elementy Analizy Algorytmów. 7

Podział (1 ; n-1) Bardzo typowy schemat metody Dziel i Rządź, to podzielenie zadania rozmiaru n na dwie nierówne części: rozmiaru 1 i n-1. Jeśli potrafimy przejść od n-1 do n (dodając jedną daną) w fazie scalania, to schemat się bardzo upraszcza: Jeśli n=1, to wykonaj działania kończące Jesli n>1, to wykonaj rekurencyjnie zadanie dla n-1 danych, a potem scal wynik z wynikiem dla 1- elementowej danej 8

Sortowanie Sortowanie n elementów: Jeśli jest jedna dana, to nic nie rób Jeśli jest n>1 danych, to posortuj n-1 elementów i scal wynik z ostatnią daną Scalanie polega tu na wstawieniu do posortowanej n-1-elementowej tablicy jednego elementu tak, aby nie zaburzyć porządku. 9

Sortowanie przez proste wstawianie procedure InsertionSort(var T:tab;k:Integer); var j:integer; begin {sortujemy T[1..k]} if k>1 then begin InsertionSort(T, k-1); j:=k-1; v:=t[k]; while (j>0) and (T[j]>k) do begin T[j+1]:=T[j]; j:=j-1 T[j+1]:=v 10

Sortowanie przez proste wstawianie iteracyjnie procedure InsertionSort(var T:tab;k:Integer); var j,k:integer; begin for k:=2 to n do begin j:=k-1; v:=t[k]; while (j>0) and T[j]>k do begin T[j+1]:=T[j]; j:=j-1 T[j+1]:=v 11

Sortowanie przez proste wstawianie iteracyjnie procedure InsertionSort(var T:tab;k:Integer); var j,k:integer; begin for k:=1 to n do begin j:=k-1; v:=t[k]; while (j>0) and T[j]>k do begin T[j+1]:=T[j]; j:=j-1 T[j]:=v 12

Analiza kosztu Mamy tu prostą sytuację: T(1)=0 T(n)=T(n-1)+n-1 To równanie rekurencyjne daje nam rozwiązanie T(n)=(n-1)+(n-2)+...+1, czyli T(n)=n(n-1)/2 13

Sortowanie przez scalanie Jeśli jednak dokonamy podziału na połowy, to możemy otrzymać znacznie ciekawszy algorytm. Wystarczy posortować połówki, a potem je scalić (koszt scalenia liniowy) 14

Mergesort procedure mergesort(var T:Tab;l,p:Integer); var s:integer; begin if l<p then begin s:=(l+p) div 2; Mergesort(T,l,s); Mergesort(T,s+1,p); scal(t,l,s,p);{scalamy T[l..s] z T[s+1..p]} 15

scal procedure scal(var T:Tab;l,s,p:Integer); var k1,k2,k:integer; A:tab; begin k:=l; k1:=l; k2:=s+1; while (k1<=s) and (k2<=p) do begin if T[k1]<T[k2] then begin A[k]:=T[k1]; k1:=k1+1 end else begin A[k]:=T[k2]; k2:=k2+1 k:=k+1; for k1:=k1 to s do begin T[k]:=T[k1]; k1:=k1+1 for k2:=k2 to s do begin T[k]:=T[k1]; k1:=k1+1 T:=A 16

Analiza kosztu Mergesort Liczba porównań dla danych rozmiaru n, to T(n): T(1)=0 T(n)=2T(n/2)+n Rozwiązanie tego równania, to funkcja T(n)=n logn 17

Quicksort Algorytm Quicksort też jest szczególnym przypadkiem zasady Dziel i Rządź. Tu wybieramy jakiś element (np. A[1]) i względem niego dokonujemy podziału na elementy mniejsze lub równe jemu oraz większe (lub równe). Ten podział realizujemy np. algorytmem flagi polskiej. Faza rządzenia, to tylko odpowiednie wywołanie rekursji. 18