190 likes | 422 Views
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)
E N D
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 T Pada deszcz 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
T N T N Przykład schematu blokowego Pada deszcz Weź parasol Jest zimno Włóż płaszcz 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
cg(n) f(n) n n0 Notacja asymptotyczna O f(n) = O(g(n))
f(n) cg(n) n n0 Notacja asymptotyczna f(n) = (g(n))
c2g(n) f(n) c1g(n) n n0 Notacja asymptotyczna 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!