Algorytmy i struktury danych (C) 2003 – 2008 by Kazimierz Jakubczyk
Literatura Banachowski L., Diks K., Rytter W.: Algorytmy i struktury danych, WNT, Warszawa 2003 (wyd. 4, pseudo Pascal) Cormen T.H., Leiserson Ch.E., Rivest R.L.: Wprowadzenie do algorytmów, WNT, Warszawa 2000 (wyd. 3, pseudo Pascal) Wirth N.: Algorytmy + struktury danych = programy, WNT, Warszawa 2002 (wyd. 6, język Pascal)
Literatura - cd. Knuth D.E.: Sztuka programowania , WNT, Warszawa 2002 (3 tomy – Algorytmy podstawowe , Sortowanie i wyszukiwanie , Algorytmy seminumeryczne , asembler) Aho A. V., Hopcroft J. E., Ullman J. D.: Algorytmy i struktury danych, Helion, Gliwice 2003 (język Pascal) Aho A.V., Hopcroft J.E., Ullman J.D.: Projektowanie i analiza algorytmów , Helion, Gliwice 2003 (pseudo Pascal)
Literatura - cd. Drozdek A.: C++. Algorytmy i struktury danych, Helion, Gliwice 2004 Neapolitan R., Naimipour K.: Podstawy algorytmów z przykładami w C++, Helion, Gliwice 2004 Wróblewski P.: Algorytmy, struktury danych i techniki programowania, Helion, Gliwice 2003 (wyd. 3, język C++)
Literatura - cd. Harel D., Feldman Y.: Rzecz o istocie informatyki. Algorytmika, WNT, Warszawa 2008 (wyd. 4) Sysło M.M.: Algorytmy, WSiP, Warszawa 2002 (wyd. 3, opisy w postaci listy kroków, niekiedy Pascal) Jakubczyk K.: Wprowadzenie do algorytmów i struktur danych, Wydawnictwo Politechniki Radomskiej, Radom 2005, 2007 (pseudo Pascal, Delphi)
Definicje algorytmu Ściśle określona procedura obliczeniowa, która dla właściwych danych wejściowych „produkuje” żądane dane wyjściowe zwane wynikiem działania algorytmu Ciąg kroków obliczeniowych prowadzących do przekształcenia danych wejściowych w wyjściowe Sposób rozwiązania konkretnego problemu obliczeniowego Przepis opisujący krok po kroku postępowanie prowadzące do rozwiązania postawionego problemu
Cechy algorytmu Skończoność – algorytm powinien się zawsze zatrzymać po skończonej liczbie kroków Dobre zdefiniowanie – każdy krok algorytmu powinien być opisany precyzyjnie Dane wejściowe – algorytm ma zero lub więcej danych wejściowych (dane) Dane wyjściowe – algorytm generuje jedną lub więcej danych wyjściowych (wynik) Efektywne zdefiniowanie – operacje zawarte w algorytmie powinny być na tyle proste, aby można je było wykonać dokładnie i w skończonym czasie
Poprawność algorytmu Algorytm jest poprawny, gdy dla każdego egzemplarza problemu zatrzymuje się i daje dobry wynik, czyli gdy wykonuje postawione przed nim zadanie Algorytm niepoprawny może się nigdy nie zatrzymać albo po zatrzymaniu dać zły wynik Algorytmy numeryczne – problem poprawności numerycznej rozwiązania (błędy zaokrągleń działań na liczbach rzeczywistych)
Metody zapisu algorytmów Opis słowny Lista kroków Tablica decyzyjna Schemat blokowy (sieć działań) Pseudojęzyk Program komputerowy
Przykład tablicy decyzyjnej Możliwe Istniejące Pada deszcz T T N N Warunki Jest zimno T N T N Weź parasol x x Operacje x x Włóż płaszcz Wyjdź z domu x x x x
Przykład schematu blokowego Pada deszcz T Weź parasol N Jest zimno T Włóż płaszcz N Wyjdź z domu
Analiza algorytmów Czy dany problem może być rozwiązany na komputerze w dostępnym czasie i pamięci? Który ze znanych algorytmów należy zastosować w danych okolicznościach? Czy istnieje lepszy algorytm od rozważa-nego? A może jest on optymalny? Jak uzasadnić, że stosując dany algorytm, rozwiąże się zamierzone zadanie?
Złożoność obliczeniowa Złożoność obliczeniowa algorytmu – ilość zasobów komputerowych potrzebnych do jego wykonania Zasoby komputerowe – czas wykonania i wielkość zajmowanej pamięci, zależne od rozmiaru danych n Złożoność czasowa Złożoność pamięciowa
Rodaje złożoności Złożoność pesymistycna – wielkość zasobów komputerowych przy „najgorszych” danych wejściowych (worst case) Złożoność oczekiwana (średnia) – wielkość zasobów komputerowych przy „typowych” danych wejściowych (avarage case) Operacje dominujące – charakterystyczne dla danego algorytmu operacje (zwykle wykonywane wielokrotnie w zależności od rozmiaru danych wejściowych n) takie, że całość pracy wykonanej przez ten algorytm jest w przybliżeniu proporcjonalna do liczby wykonań tych operacji
Notacja asymptotyczna O c g(n) f(n) n n0 f(n) = O(g(n))
Notacja asymptotyczna c g(n) f(n) n n0 f(n) = (g(n))
Notacja asymptotyczna c2 g(n) c1 g(n) f(n) n n0 f(n) = (g(n))
Typowe złożoności czasowe log n – logarytmiczna n – liniowa n log n – liniowo-logarytmiczna n2 – kwadratowa (wielomianowa stopnia 2) n3 – sześcienna (wielomianowa stopnia 3) 2n – wykładnicza 2n n! – wykładnicza n!
No to do analizy algorytmów!