Efektywna metoda sortowania sortowanie przez scalanie

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

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

Sortowanie przez scalanie

Strategia "dziel i zwyciężaj"

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 INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Teoretyczne podstawy informatyki

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 )

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Algorytmy i Struktury Danych.

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy i struktury danych Matematyka III sem.

Podstawy Informatyki. Sprawność algorytmów

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

Wyszukiwanie. Wyszukiwanie binarne

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

Wstęp do programowania

Algorytmy i struktury danych

Matematyczne Podstawy Informatyki

Zaawansowane algorytmy i struktury danych

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

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

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

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy sortujące i wyszukujące

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

Analiza algorytmów zadania podstawowe

Jeszcze o algorytmach

Programowanie w VB Proste algorytmy sortowania

Zasady analizy algorytmów

Algorytmy i struktury danych

Sortowanie - wybrane algorytmy

Sortowanie przez wstawianie Insertion Sort

TEORETYCZNE PODSTAWY INFORMATYKI

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

Informatyka 1. Złożoność obliczeniowa

Efektywność algorytmów

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

Metody numeryczne w przykładach

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

Programowanie dynamiczne i algorytmy zachłanne

INFORMATYKA SORTOWANIE DANYCH.

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

Sortowanie Shella Shell Sort

Sortowanie. LABORKA Piotr Ciskowski

Algorytmy i struktury danych

Podstawy Programowania. Złożoność obliczeniowa

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

Struktury Danych i Złożoność Obliczeniowa

Podstawy Programowania

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

Sortowanie. Bartman Jacek Algorytmy i struktury

Zadanie projektowe 1: Struktury danych i złożoność obliczeniowa

Informatyka A. Algorytmy

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

Problemy porządkowe zadania

Ćwiczenie 3 Programowanie dynamiczne

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

[12] Metody projektowania algorytmów (dziel i rządź, programowanie dynamiczne i algorytmy zachłanne).

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Podstawy Programowania. Złożoność obliczeniowa

Wykład 2. Poprawność algorytmów

Transformata Fouriera. Sylwia Kołoda Magdalena Pacek Krzysztof Kolago

TEORETYCZNE PODSTAWY INFORMATYKI

Wykład 4: Iteracja, indukcja i rekurencja

Sortowanie w czasie liniowym

Programowanie dynamiczne cz. 2

5. Podstawowe algorytmy i ich cechy.

1. Analiza algorytmów przypomnienie

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

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytmy sortujące 1

Technologie informacyjne Wykład VII-IX

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

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

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

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

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

Zaawansowane algorytmy i struktury danych

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Krzysztof Jakubczyk. Zadanie 2

Podstawy Programowania

Laboratoria nr 1. Sortowanie

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

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

Wstęp do programowania

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

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

i = n = n 1 + n 2 1 i 2 n 1. n(n + 1)(2n + 1) n (n + 1) =

Algorytmy i Struktury Danych.

Wprowadzenie do złożoności obliczeniowej

Metody numeryczne. dr Artur Woike. Ćwiczenia nr 2. Rozwiązywanie równań nieliniowych metody połowienia, regula falsi i siecznych.

Teoretyczne podstawy informatyki

Analiza algorytmów zadania podstawowe

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

I. Podstawy języka C powtórka

Transkrypt:

Efektywna metoda sortowania sortowanie przez scalanie Rekurencja Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Metoda dziel i zwycięŝaj Dzielimy problem na kilka mniejszych podproblemów podobnych do problemu wyjściowego i rozwiązujemy je rekurencyjnie. Na koniec rozwiązania są łączone w celu utworzenia rozwiązania całego problemu.

Dziel: Dzielimy problem na podproblemy ZwycięŜaj: Rozwiązujemy podproblemy rekurencyjnie, o ile nie są zbyt małego rozmiaru. W takim przypadku uŝywamy metod bezpośrednich. Połącz: Łączymy rozwiązania podproblemów, aby otrzymać rozwiązanie całego problemu. Metoda dziel i zwycięŝaj dla sortowania przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi, po n/2 elementów kaŝdy. ZwycięŜaj: Sortujemy otrzymane podciągi, uŝywając rekurencyjnie sortowania przez scalanie. Połącz: Łączymy posortowane podciągi w jeden posortowany ciąg.

Procedura scalania Mamy dwa posortowane podciągi, chcemy je połączyć w jeden posortowany ciąg. W tym celu cyklicznie bierzemy mniejszą z liczb znajdujących się na początku obu podciągów i wstawiamy ją do ciągu posortowanego. Operacja ta odbywa się w czasie Θ(n). Pseudokod mergesort(t,p,r) jeŝeli p<r q = zaokrągl_w_dół( (p+r)/2 ) mergesort(t,p,q) mergesort(t,q+1,r) merge(t,p,q,r)

Początkowe wywołanie procedury: mergesort(t,1,n) Analiza algorytmu Dla tablicy jednoelementowej sortowanie działa oczywiście w czasie stałym Θ(1). ZałóŜmy, Ŝe n>1. Niech F(n) będzie czasem potrzebnym na rozwiązanie problemu o rozmiarze n. Dla sortowania przez scalanie: F(n) = Θ(1) + 2 F(n/2) + Θ(n) = (dziel) (zwycięŝaj) (połącz) = 2 F(n/2) + Θ(n) = Θ(n log 2 n) Przypomnienie: sortowanie przez wstawianie działa w czasie Θ(n 2 ).

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie ZałóŜmy, Ŝe moŝemy wykonać dane zadanie przy uŝyciu dwóch algorytmów: jednego o złoŝoności czasowej Θ(n 2 ), a drugiego o złoŝoności Θ(n log 2 n) na przykład sortowanie n-elementowej tablicy metodą przez wstawianie i scalanie. Sortowanie przez wstawianie wykonajmy na szybkim komputerze (mała stała przed Θ) a sortowanie przez scalanie na bardzo wolnym (duŝa stała przed Θ).

Niech np. F wst (n) = 0.01 n 2, natomiast F sc (n) = 100 n log 2 n. 4. µ 10 7 8. µ 10 8 3. µ 10 7 6. µ 10 8 2. µ 10 7 4. µ 10 8 1. µ 10 7 2. µ 10 8 5000 10 000 15 000 20 000 25 000 30000 50 000 100000 150 000 200 000 250 000 300 000 Wniosek: szybszy algorytm wygrywa dla odpowiednio duŝego rozmiaru problemu, mimo iŝ został uruchomiony na 10 000 razy wolniejszym komputerze!

Rozsądny a nierozsądny czas działania Liczba operacji potrzebna do rozwiązania problemu o danej złoŝoności obliczeniowej złoŝoność / n 10 50 100 300 1 000 log n 3 5 6 8 10 n 10 50 100 300 1 000 n log n 33 282 665 2 469 9 966 n 2 100 2 500 10 000 90 000 1 000 000 n 3 1 000 125 000 1 000 000 27 000 000 1 000 000 000 2 n 1 024 liczba 16-cyfr. liczba 31-cyfr. liczba 91-cyfr. liczba 302-cyfr. n! 3 600 000 liczba liczba liczba niewyobraŝalnie n n 65-cyfr. 10 000 000 000 liczba 85-cyfr. 161-cyfr. liczba 201-cyfr. 623-cyfr. liczba 744-cyfr. duŝa niewyobraŝalnie duŝa Dla porównania: liczba protonów we Wszechświecie liczba 126- cyfrowa; liczba mikrosek. od wielkiego wybuchu liczba 24-cyfrowa

Maksymalny rozmiar problemu moŝliwego do rozwiązania w danym czasie (przy załoŝeniu 1 000 000 operacji na sekundę) złoŝoność / czas 1 s 1 min 1 godz 1 rok log n 2 1 000 000 2 60 000 000 2 36 000 000 000 2 n 10 6 6 x 10 7 3.6 x 10 9 3 x 10 13 n log n 62 746 2.8 x 10 6 1.3 x 10 8 8 x 10 11 n 2 1 000 7 746 60 000 5.6 x 10 6 2 n 19 25 31 44 n! 9 11 12 16 300 000 000 000 000 Wniosek: algorytmy o rozsądnym czasie wykonania to algorytmy o co najwyŝej wielomianowej złoŝoności obliczeniowej.

Sortowanie szybkie quicksort (szczegółowo omówione na tablicy ) W metodzie tej dzieli się tablicę na dwie części (np. ze względu na pierwszy jej element), a następnie sortuje rekurencyjnie kaŝdą z nich. Szkielet kodu procedury sortującej: procedure qsort(d,g) jeŝeli fragment tablicy składa się z co najmniej 2 elementów, to: podziel elementy tablicy np. ze względu na wartość T[d] // w wyniku podziału wartość T[d] powinna znaleźć się // na właściwym miejscu s wewnątrz tablicy // oraz powinien spełniony być warunek: // T[d]... T[s-1] <= T[s] <= T[s+1]... T[g] qsort(d, s-1) // posortuj dolną część tablicy qsort(s+1, g) // posortuj górną część tablicy

Przykładowy szkielet kodu rozdzielającego elementy tablicy: element_graniczny = T[d] // rozdzielamy względem pierwszego elementu srodek = d pętla od i = d+1 do i = g jeŝeli element T[i] < element_graniczny srodek = srodek+1 zamień T[srodek] z T[i] zamień T[d] z T[srodek] Optymalizacja 1. Udoskonalenie metody znajdowania elementu środkowego, według którego rozdzielane są elementy tablicy (naleŝy najpierw zastanowić się, kiedy przyjęta wyŝej metoda rozdzielania względem pierwszego elementu tablicy jest mało efektywna?); 2. Poszukanie efektywniejszych metod rozdzielania elementów tablicy lub usprawnienie zaproponowaną wyŝej

3. Zoptymalizowanie kodu programu (np. rozwijanie kodu funkcji wewnątrz pętli zamiast jej wywołań); 4. Zastosowanie sortowania przez wstawianie dla wstępnie posortowanych metodą szybką małych fragmentów tablic. Bisekcja (szczegółowo omówiona na tablicy ) Metoda słuŝy do wyznaczenia miejsca zerowego danej funkcji i polega na cyklicznym połowieniu zadanego z góry przedziału (w którym znajduje się pierwiastek) aŝ do osiągnięcia zadanej dokładności.