Algorytmy i Struktury Danych
Podstawowe informacje Prowadzący: Jan Tuziemski Email: jan.tuziemski@pg.edu.pl Konsultacje: pokój 412 GB (do ustalenia 412 GB)
Podstawowe informacje literatura K. Goczyła Struktury Danych Wydawnictwo PG T. H. Cormen, C.E. Leiseron, R.L. Rivest, C. Stein Introducton to algorithms The MIT press K. Mehlhorn, P. Sanders Algorithms and data structures Springer
Podstawowe informacje zasady zaliczenia Wykład: próg zaliczenia 56%, składowa końcowa 50% 2 Egzaminy połówkowe albo egzamin końcowy Laboratoria (min 56%): próg zaliczenia 56%, składowa końcowa 50%
Orientacyjny plan wykładu 1. Wprowadzenie do struktur danych, złożoność obliczeniowa i pamięciowa, notacja asymptotyczna. 2. Defnicja rekurencji, rozwiązywanie rekurencji metodą podstawiania. 3. Metoda rekurencji uniwersalnej. 4. Tablice nieuporządkowane i uporządkowane. 5. Tablice rozproszone, funkcje haszujące, metody rozwiązywania kolizji. 6. Tablice rozproszone, metoda adresowania otwartego
Orientacyjny plan wykładu 7. Sortowanie tablic część 1. 8. Sortowanie tablic część 2. 9. Listy jedno i dwukierunkowe. Kolejki FIFO i LIFO 10. Drzewa, podstawy. 11. Binarne drzewa wyszukiwawcze 12. Cyfrowe drzewa wyszukiwawcze
Orientacyjny plan wykładu 13. Algorytmy wyszukiwania wzorca część 1. 14. Wyszukiwanie wzorca część 2. 15. Zaliczenie przedmiotu
Defnicje pojęć Algorytm (nieformalnie) Dobrze określona procedura obliczeniowa, która na wejściu przyjmuje pewną wartość (zbiór wartości) i po przetworzeniu zwraca zbiór wartości.
Defnicje pojęć Algorytm (przykład) Problem sortowania: Wejście lista nieuporządkowana (a 1, a 2,, a n ) Wyjście: lista uporządkowana (a 1, a 2,, a n ), taka że a 1 a 2 a n
Defnicje pojęć Algorytm To sposób rozwiązania pewnego dobrze określonego problemu obliczeniowego. Na podstawie problemu określone są dane wejścia/wyjścia a algorytm opisuje konkretny sposób osiągnięcia pożądanej relacji pomiędzy tymi danymi.
Defnicje pojęć Algorytm nazywamy poprawnym jeżeli dla każdego zestawu danych zwraca poprawny wynik. Algorytm niepoprawny nie zwraca wyniku dla pewnych zestawów danych lub zwraca dla nich wynik błędny (może być to użyteczne jeżeli wielkość błędu da się kontrolować -> liczby pierwsze ).
Przykłady zastosowań algorytmów 1. Human Genome Project (projekt poznania ludzkiego genomu) identyfkacja ok. 20 tys. ludzkich genów (tworzonych z 3,3 mld par zasad) 2. Znajdowanie optymalnej drogi w sieci, przeszukiwanie zasobów 3. Algorytmy szyfrujące, podpis elektroniczny.
Przykłady zastosowań algorytmów 4. Algorytmy optymalizacyjne (optymalizacja z więzami)
Defnicje pojęć Struktury danych Zbiór elementów powiązanych ze sobą określonymi relacjami. (elementy mogą być określonego typu)
Defnicje pojęć Typ określa zbiór wartości, który może przyjmować dany element. Moc typu określa liczbę różnych wartości które może przyjmować/przechowywać dany element (związane z rozmiarem pamięci). Z typem związane są operatory, które można na nim wykonywać.
Defnicje pojęć Typ Prosty -Bitowy -Bajtowy -Całkowity -Logiczny -Znakowy - Złożony -tablica -rekord -zbiór -lista -kolejka --stos - Ewentualnie: dynamiczne/statyczne
2600 lat p.n.e Zapis darów od możnowładców Adabu dla wysokiej kapłanki https://commons.wikimedia.org/wiki/file:sumerian226th2c2adab.jpg
1600 lat p.n.e Babiloński algorytm wyszukiwania dzielników liczb oraz obliczanie pierwiastka kwadratowego
Dlaczego warto się uczyć? - Dla danego problemu może nie być opracowanego rozwiązania. Wtedy: - Warto znać zasady projektowania algorytmów - Znać metody określania ich wydajność - Nie ma optymalnej struktury danych
Dlaczego warto się uczyć? Jeżeli komputery staną się nieskończenie szybkie czy warto studiować algorytmy? Tak bo: Nawet nieskończenie szybki komputer może mieć problem z działającym w nieskończoność algorytmem Zawsze będą obowiązywały pewne zasady projektowe, np. korzystanie z najprostszej z dostępnych metod
Dlaczego warto się uczyć? W przypadku rosnącej mocy obliczeniowej czas i Pamięć są wciąż zasobami, które choć coraz tańsze, nie są darmowe. Dlatego najlepiej stosować optymalne rozwiązania.
Dlaczego warto się uczyć? Algorytmy powinny być traktowane jako technologia. Materiał z http://www.palantr.com/2011/09/how-to-rock-a n-algorithms-interview/ Jest teraz tu http://westpavilion.blogspot.com/2014/01/fw-ho w-to-rock-algorithms-interview.html
Dlaczego warto się uczyć? Przykład tablica n = 10^6 elementów Komputer A: 10^10 operacji/s (złożonych) Komputer B: 10^7 operacji/s Algorytm na komputerze A: n^2 (Inserton Sort) Algorytm na komputerze B: n log n (Merge Sort) A: 10^2 s B: ok. 2 s
Jak porównywać algorytmy? Potrzebne pojęcia: Liczebność wejścia liczba elementów do przetworzenia (liczba bitów potrzebna do reprezentacji danych) Czas wykonania algorytmów: liczba podstawowych operacji do wykonania (nie zależy od sprzętu)
Jak porównywać algorytmy? Potrzebne pojęcia: Złożoność obliczeniowa algorytmu to funkcja określająca czas potrzebny do wykonania tego algorytmu dla konkretnych danych Złożoność pamięciowa algorytmu to funkcja określająca liczbę komórek pamięci potrzebną do wykonania algorytmu dla konkretnych danych (liczbę typów prostych)
Jak porównywać algorytmy? Uwaga: dla pewnych specyfcznych danych algorytm może wykonywać się bardzo szybko a dla innych bardzo wolno. Dlatego wyróżnia się: Złożoność optymistyczną dla danych sprzyjających Złożoność pesymistyczną dla danych niesprzyjających Złożoność średnią uśrednioną po wszystkich typach danych
Jak porównywać algorytmy? Potrzebne pojęcia: Rozmiar problemu wielkość danych na jakich operuje algorytm. Przykład: http://bigocheatsheet.com/
Jak porównywać algorytmy? Dokładne obliczanie złożoności obliczeniowej jak i pamięciowej może być skomplikowane. Rozwiązanie: pominięcie małych rozmiarów wejść (podejście asymptotyczne).
Notacja asymptotyczna Używana do określania złożoności algorytmów. Założenia: rozpatrujemy funkcje zdefniowane na zbiorze N = {0,1,2, }.
Notacja asymptotyczna symbol O Dla funkcji f(n) zachodzi f(n) = O(g(n)) jeżeli istnieją stałe dodatnie c,r c>0,r>0; takie że f(n) r*g(n) dla wszystkich n>c. Uwaga: O(g(n)) defniuje zbiór, ale używamy znaku = zamiast
Notacja asymptotyczna symbol Ω Dla funkcji f(n) zachodzi f(n) = Ω(g(n)) jeżeli istnieją stałe dodatnie c,r c>0,r>0; takie że f(n) r*g(n) dla wszystkich n>c. Uwaga: Ω(g(n)) defniuje zbiór, ale używamy znaku = zamiast
Notacja asymptotyczna symbol Θ Dla funkcji f(n) zachodzi f(n) = Θ(g(n)) jeżeli jednocześnie f(n) = O(g(n)) i f(n) = Ω(g(n)). Uwaga: Θ(g(n)) defniuje zbiór, ale używamy znaku = zamiast
Notacja asymptotyczna Dla dużych n zazwyczaj dominuje człon wiodący, człony niższych rzędów można pominąć.
Notacja asymptotyczna Dla funkcji f(n) zachodzi f(n) g(n) jeżeli f(n)/g(n) 1 lim n
Notacja asymptotyczna - własności Zwrotność f(n) = Θ(f(n)) Tak samo dla O i Ω
Notacja asymptotyczna - własności Symetryczność f(n) = Θ(g(n)) g(n) = Θ(f(n)) Inaczej dla O i Ω
Notacja asymptotyczna - własności f(n) = O(g(n)) g(n) =? (f(n))
Notacja asymptotyczna - własności f(n) = O(g(n)) g(n) = Ω (f(n))
Notacja asymptotyczna - intuicja f(n) = O(g(n)) f(n) = Ω(g(n)) f(n) = Θ(g(n)) a b a b a = b Ale uwaga! Dla liczb (rzeczywistych) mamy a < b albo (alternatywa wykluczająca) a=b albo a> b Dla funkcji niekoniecznie np. f(n) = n, g(n) n^(1+ sin(n))
Klasyfkacja funkcji pod względem tępa wzrostu Θ(1) Θ(log n) Θ(n^r) gdzie 0<r<1 Θ(n) Θ(nlogn) Θ(n^r) 1<r<2 Θ(n^k) Θ(r^n) r>1 stała logarytmiczna subliniowa liniowa liniowo-logarytmiczna subkwadratowa wielomianowa wykładnicza
Podsumowanie 1. Warto się uczyć 2. Czas wykonania algorytmu to liczba podstawowych operacji dla zadanej wielkości danych wejściowych n Przy pomocy notacji asymptotycznej O, Ω,Θ można opisać własności funkcji.