Algorytmy i Struktury Danych.

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

Strategia "dziel i zwyciężaj"

Sortowanie przez scalanie

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Programowanie Proceduralne

Algorytm selekcji Hoare a. Łukasz Miemus

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 programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Matematyczne Podstawy Informatyki

Sortowanie danych. Jolanta Bachan. Podstawy programowania

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

Struktury Danych i Złożoność Obliczeniowa

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

Analiza algorytmów zadania podstawowe

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

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych.

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytmy i Struktury Danych.

Efektywna metoda sortowania sortowanie przez scalanie

Programowanie w VB Proste algorytmy sortowania

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

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

Teoretyczne podstawy informatyki

Wstęp do programowania

Wstęp do programowania

Algorytmy i Struktury Danych, 2. ćwiczenia

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy sortujące i wyszukujące

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

Podstawy Informatyki. Sprawność algorytmów

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

Algorytmy i Struktury Danych.

Informatyka A. Algorytmy

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

Algorytmy i Struktury Danych.

Laboratorium nr 7 Sortowanie

1. Analiza algorytmów przypomnienie

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

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

Problemy porządkowe zadania

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

Podstawy Informatyki

Algorytmy i Struktury Danych, 2. ćwiczenia

Sortowanie - wybrane algorytmy

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

Zaawansowane algorytmy i struktury danych

TEORETYCZNE PODSTAWY INFORMATYKI

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

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

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

Sortowanie. LABORKA Piotr Ciskowski

Luty 2001 Algorytmy (4) 2000/2001

Zaawansowane algorytmy i struktury danych

Programowanie dynamiczne cz. 2

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Drzewa poszukiwań binarnych

Algorytmy i Struktury Danych.

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Algorytmy i Struktury Danych.

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

Programowanie dynamiczne i algorytmy zachłanne

Sortowanie bąbelkowe

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

Teoretyczne podstawy informatyki

Zasady analizy algorytmów

Algorytmy sortujące 1

Wykład 4: Iteracja, indukcja i rekurencja

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

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

INFORMATYKA SORTOWANIE DANYCH.

Wstęp do Programowania potok funkcyjny

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

Laboratoria nr 1. Sortowanie

5. Podstawowe algorytmy i ich cechy.

Wstęp do programowania

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 5 i 6. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Porządek symetryczny: right(x)

TEORETYCZNE PODSTAWY INFORMATYKI

TEORETYCZNE PODSTAWY INFORMATYKI

Jeszcze o algorytmach

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

Wykład 2. Poprawność algorytmów

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.

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

Algorytmy i Struktury Danych

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Sortowanie przez wstawianie Insertion Sort

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

Laboratoria nr 1. Sortowanie

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

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

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

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

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

Transkrypt:

Algorytmy i Struktury Danych. Metoda Dziel i zwyciężaj. Problem Sortowania, cd. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 1 / 47

Metoda dziel i zwyciężaj Idea Metoda dziel i zwyciężaj (ang. divide and conquer) jest metoda projektowania algorytmów, w której dany problem jest dzielony na kilka mniejszych podproblemów podobnych do poczatkowego problemu. Problemy te sa rozwiazywane rekurencyjnie, a następnie rozwiazania wszystkich podproblemów sa łaczone w celu utworzenia rozwiazania całego problemu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 2 / 47

Metoda dziel i zwyciężaj W podejściu dziel i zwyciężaj każdy poziom rekursji składa się z następujacych trzech etapów: Dziel: Dzielimy problem na podproblemy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Metoda dziel i zwyciężaj W podejściu dziel i zwyciężaj każdy poziom rekursji składa się z następujacych trzech etapów: Dziel: Dzielimy problem na podproblemy. Zwyciężaj: Rozwiazujemy podproblemy rekurencyjnie, chyba że sa one małego rozmiaru i już nie wymagaja zastosowania rekursji - używamy wtedy bezpośrednich metod. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Metoda dziel i zwyciężaj W podejściu dziel i zwyciężaj każdy poziom rekursji składa się z następujacych trzech etapów: Dziel: Dzielimy problem na podproblemy. Zwyciężaj: Rozwiazujemy podproblemy rekurencyjnie, chyba że sa one małego rozmiaru i już nie wymagaja zastosowania rekursji - używamy wtedy bezpośrednich metod. Połacz: Łaczymy rozwiazania podproblemów, aby otrzymać rozwiazanie całego problemu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 3 / 47

Dziel i Zwyciężaj - przykłady zastosowań Znajdowanie największego i najmniejszego elementu zbioru. Wyszukiwanie binarne Potęgowanie liczb Sortowanie szybkie Sortowanie przez scalanie Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 4 / 47

Element minimalny i maksymalny zbioru Definicja problemu: Dane: n - liczba elementów zbioru a 1, a 2, a 3,...,a n - ciag elementów Szukane: Elementy największy i najmniejszy zbioru. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 5 / 47

Element minimalny i maksymalny zbioru Require: tablica A o rozmiarze n {A=[0,...,n-1]} Algorytm: MIN 1: min = 0; 2: for all i = 1 to n do 3: if A[i] < A[min] then 4: min = i; 5: end if 6: i = i + 1; 7: end for 8: return min; Algorytm: MAX 1: max = 0; 2: for all i = 1 to n do 3: if A[i] > A[max] then 4: max = i; 5: end if 6: i = i + 1; 7: end for 8: return max; Naiwne rozwiazanie problemu: Najpierw wyszukujemy element największy metoda bezpośrednia, a potem element najmniejszy. Złożoność obliczeniowa: O(n) Algorytm MAX : n - 1 operacji porównania Algorytm MIN : n - 1 operacji porównania Razem MAX i MIN : 2n - 2 operacji porównania Przykład: 2 5 3 1 8 9 1 5 4-16 porównań Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 6 / 47

Element minimalny i maksymalny zbioru Można spróbować usprawnić rozwiazanie naiwne, znajdujac najpierw kandydatów na Min i Max. Takie wyszukanie realizowane jest poprzez porównywanie elementów parami. Następnie stosowany jest algorytm MIN, a potem Max (lub odwrotnie), na odpowiednim zbiorze kandydatów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 7 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Na tym zbiorze stosowany jest algorytm MAX. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Na tym zbiorze stosowany jest algorytm MAX. Ostatni - nieparzysty element został dodany do obu zbiorów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Na tym zbiorze stosowany jest algorytm MAX. Ostatni - nieparzysty element został dodany do obu zbiorów. Wykorzystujemy tu własność podziału mówiac a, iż w każdym zbiorze skończonym zawsze znajduje się element największy i element najmniejszy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 8 / 47

Element minimalny i maksymalny zbioru Szacowanie: Przy rozdzielaniu elementów wykonano 4 porównania. Algorytm MIN na zbiorze {2, 1, 8, 1, 4} wykonał 4 porównania i zwrócił wartość 1. Algorytm MAX również na zbiorze {5, 3, 9, 5, 4} wykonał 4 porównania i zwrócił wartość 9. W sumie wykonano 4+4+4 = 12 porównań, co oznacza 25% wzrost wydajności w porównaniu z podejściem naiwnym (tam potrzebnych było 16 porównań)! Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 9 / 47

Element minimalny i maksymalny zbioru Require: tablica A o rozmiarze n {A = [0,...,n 1]} Algorytm: MIN-MAX 1: min = 0; max = 0; 2: for i = 0 to n 2 do 3: if A[i] < A[i + 1] then 4: if A[i] < A[min] then 5: min = i; 6: end if 7: if A[i + 1] > A[max] then 8: max = i + 1; 9: end if 10: else 11: if A[i + 1] < A[min] then 12: min = i + 1; 13: end if 14: if A[i] > A[max] then 15: max = i; 16: end if 17: end if 18: i = i + 2; 19: end for 20: if n is odd then 21: if A[n 1] < A[min] then 22: min = n 1; 23: end if 24: if A[n 1] > A[max] then 25: max = n 1; 26: end if 27: end if 28: return A[min] and A[max]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 10 / 47

Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informację o tym, że jest on uporzadkowany. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informację o tym, że jest on uporzadkowany. Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informację o tym, że jest on uporzadkowany. Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Jeśli środkowy element jest większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informację o tym, że jest on uporzadkowany. Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Jeśli środkowy element jest większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej części. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 11 / 47

Wyszukiwanie binarne - przykład Znaleźć liczbę 9 w ciagu: 3, 5, 7, 8, 9, 12, 15. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 12 / 47

Twierdzenie 1 Cormen T.H., Leiserson Ch.E., Rivest R.L. Wprowadzenie do algorytmów, Roz. 4 (str. 73) T(n) = a T(n/b)+f(n) n - rozmiar problemu; rozmiar danych wejściowych. a - liczba podproblemów w rekurencji. n/b - rozmiar każdego podproblemu; w zasadzie zakłada się, że wszystkie podproblemy sa tego samego rozmiaru. f(n) - koszt operacji poza rekurencyjnym wywołaniem zawierajacy koszt podziału probelmu na podproblemy i koszt operacji scalenia rozwiazań. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 13 / 47

Twierdzenie 1 Cormen T.H., Leiserson Ch.E., Rivest R.L. Wprowadzenie do algorytmów, Roz. 4 (str. 73) T(n) = a T(n/b)+f(n) n - rozmiar problemu; rozmiar danych wejściowych. a - liczba podproblemów w rekurencji. n/b - rozmiar każdego podproblemu; w zasadzie zakłada się, że wszystkie podproblemy sa tego samego rozmiaru. f(n) - koszt operacji poza rekurencyjnym wywołaniem zawierajacy koszt podziału probelmu na podproblemy i koszt operacji scalenia rozwiazań. A. f(n) = O(n logb(a) ǫ ) implikuje, że T(n) = Θ(n logb(a) ) dla pewnegoǫ > 0 B. f(n) = Θ(n logb(a) log2 k (n)) implikuje, że T(n) = Θ(n logb(a) log k+1 2 (n)) dla pewnego k 0. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 13 / 47

Wyszukiwanie binarne - złożoność n log b(a) = n log 2(1) = n 0 = 1 (Przypadek2) T(n) = Θ(log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 14 / 47

Wyszukiwanie binarne - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = O(log 2 (n)) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = O(log 2 (n)). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 15 / 47

Wyszukiwanie binarne - implementacja i n t binsearch ( i n t a [ ], i n t n, i n t key ) { i n t l e f t = 0, r i g h t = n 1; while ( l e f t <= r i g h t ) { i n t c u r r = ( l e f t + r i g h t ) / 2; i f ( key == a [ c u r r ] ) { r e t u r n c u r r ; } else i f ( key < a [ c u r r ] ) { r i g h t = c u r r 1; } else { l e f t = c u r r + 1; } } r e t u r n ( 1); } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 16 / 47

Wyszukiwanie binarne Uwagi o przeszukiwaniu liniowym i binarnym Niech n=20 000 Algorytm wyszukiwania liniowego czyli przegladaj acy cała tablicę element po elemencie wykona 20 000 porównań. Algorytm przeszukiwania binarnego wykona tylko log 2 (20000) = 14 porównań. Algorytm wyszukiwania binarnego wymaga jednak przekazania posortowanych danych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 17 / 47

Potęgowanie liczby Problem: Oblicz a n, dla n N. Algorytm naiwny: a n = a a... a }{{} n Złożoność: Θ(n) Algorytm dziel i zwyciężaj: { a n a n/2 a = n/2, gdy n jest parzyste a n 1/2 a n 1/2 a, gdy n jest nieparzyste Złożoność: T(n) = T(n/2)+Θ(1) θ(log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 18 / 47

Sortowanie szybkie Algorytm sortowania szybkiego (ang. quick sort) opracowany przez C.A.R. Hoarea w 1962. Algorytm QuickSortjest typowym algorytmem rekurencyjnym, pracujacym w oparciu o technikę dziel i zwyciężaj. Algorytm zakłada dekompozycję tablicy na mniejsze podtablice, które łatwiej jest posortować. Najczęściej stosowany algorytm sortujacy w praktyce. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 19 / 47

Sortowanie szybkie Idea Rozdzielić elementy danego ciagu na dwie części względem pewnego ustalonego elementu, tzw. elementu osiowego (ang. pivot), tak aby na lewo od niego znajdowały się elementy mniejsze, a na prawo elementy większe. x xx x Rekurencyjnie posortować elementy na lewo i na prawo od elementu osiowego. Połaczyć posortowane podtablice. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 20 / 47

Sortowanie szybkie - przykład 29 40 2 1 6 18 20 32 23 34 39 41 29 2 1 6 18 20 23 40 32 34 39 41 2 40 1 32 34 39 41 1 2 6 6 18 20 23 18 20 23 29 32 34 39 40 41 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 21 / 47

Sortowanie szybkie W celu podzielenia tablicy konieczne jest wykonanie dwóch operacji: znalezienie elementu osiowego i podzieleniu tablicy na dwie podtablice. przejrzeniu tablicy w celu umieszczenia jej elementów we właściwych podtablicach. Wybór dobrego elementu osiowego nie jest zadaniem łatwym (obie podtablice powinny mieć zbliżona wielkość). Najczęściej stosowane strategie wyboru elementu osiowego: wybranie pierwszego elementu tablicy. wybranie elementu znajdujacego się pośrodku tablicy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 22 / 47

Sortowanie szybkie - procedura podziału Require: tablica A[p..q] 1: PARTITION(A, p, q) 2: x = A[p]; {element osiowy = A[p]} 3: i = p; 4: for all j = p+1 to q do 5: if A[j] x then 6: i = i + 1; 7: zamien(a[i],a[j]); 8: end if 9: end for 10: zamien (A[p], A[i]); 11: return i Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 23 / 47

Sortowanie szybkie - procedura podziału, przykład 6 10 13 5 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Sortowanie szybkie - procedura podziału, przykład 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Sortowanie szybkie - procedura podziału, przykład 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Sortowanie szybkie - procedura podziału, przykład 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j 6 5 13 10 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Sortowanie szybkie - procedura podziału, przykład 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j 6 10 13 5 8 3 2 11 i j 6 5 13 10 8 3 2 11 i j 6 5 13 10 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 24 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 13 10 8 3 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 13 10 8 3 2 11 i j 6 5 3 10 8 13 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 13 10 8 3 2 11 i j 6 5 3 10 8 13 2 11 i j 6 5 3 10 8 13 2 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 13 10 8 3 2 11 i j 6 5 3 10 8 13 2 11 i j 6 5 3 10 8 13 2 11 i j 6 5 3 2 8 13 10 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 13 10 8 3 2 11 i j 6 5 3 10 8 13 2 11 i j 6 5 3 10 8 13 2 11 i j 6 5 3 2 8 13 10 11 i j 6 5 3 2 8 13 10 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 25 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 3 2 8 13 10 11 i j Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 26 / 47

Sortowanie szybkie - procedura podziału, przykład 6 5 3 2 8 13 10 11 i j 2 5 3 6 8 13 10 11 i Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 26 / 47

Sortowanie szybkie - algorytm QuickSort (A, p, r) Jeśli p = r, to koniec Jeśli p < r, to q = PARTITION(A, p, r). QuickSort(A, p, q-1). QuickSort(A, q+1, r). Wywołanie: QuickSort(A, 1, n) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 27 / 47

Sortowanie szybkie - Złożoność pesymistyczna: Najgorszy przpadek dla algorytmu sortowania szybkiego to ciag danych już uporzadkowanych w kolejności odwrotnej do pożadanej. Jeśli Split jako medianę wybiera zawsze pierwszy element, to w wyniku rozdzielenia, jedna część młodsza będzie pusta, a druga starsza będzie zawierała o jeden element mniej niż w poprzednim kroku. Koszt Operacji rozdzielania dla n elementowego ciagu wynosi n 1 porównań. T(n) = T(n 1)+cn T(n 1) = T(n 2)+c(n 1) T(n 2) = T(n 3)+c(n 2). T(2) = T(1)+c(2) T(n) = T(1)+c n i=2 i = O(n2 ) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 28 / 47

Sortowanie szybkie - Złożoność optymistyczna: Podział jest zawsze perfekcyjnie zbalansowany. Element osiowy jest zawsze po środku. T(n) QuickSort (A, p, r) Θ(1) Jeśli p = r, to koniec Jeśli p < r, to Θ(n) (1) q = PARTITION(A, p, r). 2 T(n/2) (2) rekurencyjnie posortuj A[p..q 1] i A[q + 1..r]. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Sortowanie szybkie - Złożoność optymistyczna: Podział jest zawsze perfekcyjnie zbalansowany. Element osiowy jest zawsze po środku. T(n) QuickSort (A, p, r) Θ(1) Jeśli p = r, to koniec Jeśli p < r, to Θ(n) (1) q = PARTITION(A, p, r). 2 T(n/2) (2) rekurencyjnie posortuj A[p..q 1] i A[q + 1..r]. { Θ(1) n = 1 T(n) = 2 T(n/2)+Θ(n) n > 1 Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie rekurencyjne ma następujace rozwiazanie: Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Sortowanie szybkie - Złożoność optymistyczna: Podział jest zawsze perfekcyjnie zbalansowany. Element osiowy jest zawsze po środku. T(n) QuickSort (A, p, r) Θ(1) Jeśli p = r, to koniec Jeśli p < r, to Θ(n) (1) q = PARTITION(A, p, r). 2 T(n/2) (2) rekurencyjnie posortuj A[p..q 1] i A[q + 1..r]. { Θ(1) n = 1 T(n) = 2 T(n/2)+Θ(n) n > 1 Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie rekurencyjne ma następujace rozwiazanie: n log b(a) = n log 2(2) = n 1 = n (Przypadek2) T(n) = Θ(n log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 29 / 47

Sortowanie szybkie - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = O(n 2 ) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = Θ(n log 2 (n)). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 30 / 47

Sortowanie szybkie - implementacja void q u icksort ( i n t a [ ], i n t l e f t, i n t r i g h t ) { i f ( l e f t < r i g h t ) { / / p o d z i a ł t a b l i c y i n t m = l e f t ; f o r ( i n t k = l e f t + 1 ; k <= r i g h t ; ++k ) { i f ( a [ k ] < a [ l e f t ] ) swap ( a[++m], a [ k ] ) ; } swap ( a [ l e f t ], a [m] ) ; / / Rekurencja q u icksort ( a, l e f t, m 1 ) ; q u icksort ( a, m + 1, r i g h t ) ; } } void swap ( i n t x, i n t y ) { i n t tmp = x ; x = y ; y = tmp ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 31 / 47

Sortowanie przez scalanie Jeden z pierwszych algorytmów sortowania. Autor metody: John von Neumann Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 32 / 47

Sortowanie przez scalanie Jeden z pierwszych algorytmów sortowania. Autor metody: John von Neumann Idea: Dzielimy zadanie posortowania całego ciagu na dwa podzadania: posortowania jego lewej i prawej połowy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 32 / 47

Sortowanie przez scalanie Jeden z pierwszych algorytmów sortowania. Autor metody: John von Neumann Idea: Dzielimy zadanie posortowania całego ciagu na dwa podzadania: posortowania jego lewej i prawej połowy. Gdy obie części tworza już ciagi uporzadkowane, wtedy scalamy je otrzymujac rozwiazanie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 32 / 47

Sortowanie przez scalanie - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 33 / 47

Sortowanie przez scalanie - algorytm MergeSort A[1..n] Jeśli n = 1, to koniec Jeśli n 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n]. Scal obie połowy A w jedna posortowana tablicę. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 34 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 1 8 9 12 18 20 Najmniejszy nieprzetworzony: 8 Minimum z 1 i 8 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 35 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 7 8 9 12 18 20 Najmniejszy nieprzetworzony: 8 Minimum z 7 i 8 1 7 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 36 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 11 8 9 12 18 20 Najmniejszy nieprzetworzony: 8 Minimum z 11 i 8 1 7 8 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 37 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 11 8 9 12 18 20 Najmniejszy nieprzetworzony: 9 Minimum z 11 i 9 1 7 8 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 38 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 11 8 9 12 18 20 Najmniejszy nieprzetworzony: 12 Minimum z 11 i 12 1 7 8 9 11 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 39 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 14 8 9 12 18 20 Najmniejszy nieprzetworzony: 12 Minimum z 14 i 12 1 7 8 9 11 12 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 40 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 14 8 9 12 18 20 Najmniejszy nieprzetworzony: 18 Minimum z 14 i 18 1 7 8 9 11 12 14 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 41 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: 16 8 9 12 18 20 Najmniejszy nieprzetworzony: 18 Minimum z 16 i 18 1 7 8 9 11 12 14 16 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 42 / 47

Sortowanie przez scalanie - Operacja scalania Zapamiętujemy pozycje najmniejszego elementu w każdej posortowanej połówce. Wstawiamy najmniejszy z dwóch wskazywanych elementów do tablicy pomocniczej. Operacje powtarzamy dopóty, dopóki nie posortujemy wszystkich elementów. 1 7 11 14 16 Najmniejszy nieprzetworzony: - 8 9 12 18 20 Nieprzetworzone: 18 i 20 1 7 8 9 11 12 14 16 18 20 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 43 / 47

Sortowanie przez scalanie - implementacja MergeSort ( i n t A [ ], i n t l e f t, i n t r i g h t ) { i f ( r i g h t > l e f t ) { mid = ( l e f t + r i g h t ) / 2; MergeSort (A, l e f t, mid ) ; MergeSort (A, mid +1, r i g h t ) ; merge (A, l e f t, mid, r i g h t ) } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 44 / 47

Sortowanie przez scalanie - implementacja void merge (T a, i n t l e f t, i n t mid, i n t r i g h t ) { i n t t = c a l l o c ( r i g h t +1, s i z e o f ( i n t ) ) ; i n t n = r i g h t l e f t + 1 ; i n t i = l e f t, j = mid + 1, k = 0 ; while ( i <= mid && j <= r i g h t ) { i f ( a [ i ] < a [ j ] ) t [ k ++] = a [ i + + ] ; else t [ k ++] = a [ j + + ] ; } while ( i <= mid ) { / / Dolaczanie koncowki p i e rwszej p o d t a b l i c y t [ k ++] = a [ i + + ] ; } while ( j <= r i g h t ) { / / Dolaczanie koncowki d r u g i e j p o d t a b l i c y t [ k ++] = a [ j + + ] ; } / / Kopiowanie t a b l i c y pomocniczej f o r ( k = 0 ; k < n ; ++k ) a [ l e f t + k ] = t [ k ] ; f r e e ( t ) } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 45 / 47

Sortowanie przez scalanie - Koszt algorytmu T(n) MergeSort A[1..n] Θ(1) Jeśli n = 1, to koniec 2 T(n/2) Jeśli n 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n]. Θ(n) Scal obie połowy A w jedna posortowana tablicę. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 46 / 47

Sortowanie przez scalanie - Koszt algorytmu T(n) MergeSort A[1..n] Θ(1) Jeśli n = 1, to koniec 2 T(n/2) Jeśli n 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n]. Θ(n) Scal obie połowy A w jedna posortowana tablicę. T(n) = { Θ(1) n = 1 2 T(n/2)+Θ(n) n > 1 Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie rekurencyjne ma następujace rozwiazanie: Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 46 / 47

Sortowanie przez scalanie - Koszt algorytmu T(n) MergeSort A[1..n] Θ(1) Jeśli n = 1, to koniec 2 T(n/2) Jeśli n 2, rekurencyjnie posortuj A[1..n/2] i A[n/2+1..n]. Θ(n) Scal obie połowy A w jedna posortowana tablicę. T(n) = { Θ(1) n = 1 2 T(n/2)+Θ(n) n > 1 Na podstawie Twierdzenia 1 można pokazać, że powyższe równanie rekurencyjne ma następujace rozwiazanie: n log b(a) = n log 2(2) = n 1 = n (Przypadek2) T(n) = Θ(n log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 46 / 47

Sortowanie przez scalanie - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = Θ(n log 2 (n)) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Koszt: T(n) = Θ(n log 2 (n)). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 2 47 / 47