Algorytmy definicja, cechy, złożoność. Algorytmy napotykamy wszędzie, gdziekolwiek się zwrócimy. Rządzą one wieloma codziennymi czynnościami, jak np. wymiana przedziurawionej dętki, montowanie szafy z gotowych elementów, robienie swetra na drutach, dzielenie liczb, wypełnienie formularza podatkowego. Algorytmika jest to dziedzina zajmująca się tworzeniem algorytmów. Jest to więcej niż dział informatyki. Jest ona ważna dla większości nauk matematyczno przyrodniczych, ekonomii, techniki. Algorytm jest to przepis (sposób postępowania), który ma prowadzić do rozwiązania określonego zadania. Przyjmuje się, że przepis ten jest na tyle precyzyjny, że posługiwanie się nim polega wyłącznie na automatycznym wykonywaniu zawartych w nim poleceń. Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa). Nazwa algorytm wywodzi się od nazwiska perskiego matematyka Muhammeda Alchwarizmi, który żył w IX w. i któremu przypisuje się podanie reguł dodawania, odejmowania, mnożenia i dzielenia zwykłych liczb dziesietnych. Nazwisko to, pisane po łacinie, przyjęło postać Algorismus. Stąd do słowa algorytm już tylko mały krok.
Cechy algorytmu: wykonalność polecenia zawarte w algorytmie są wykonywalne, tzn. dostępne, a pisząc algorytm wystarczy się nimi tylko posłużyć. posiadanie wejścia i wyjścia wejście oznacza zwykle pewne dane pobierane przez algorytm w celu ich przetworzenia, wyjście odnosi się do wyniku działania algorytmu. skończoność algorytm powinien zakończyć swoje działanie po skończonej liczbie kroków. określoność - każda operacja w algorytmie powinna być sformułowana tak, aby zapewnić jej jednoznaczną interpretację. Zestawienie wymienionych cech algorytmów
Podstawowe pytania pojawiające się w czasie badań nad obliczeniami: Jak dla określonego zadania znaleźć efektywny algorytm? Jeśli algorytm już znaleziono, to jak porównać go z innymi, które rozwiązują podobne zadania? Jak udowodnić poprawność algorytmu? W jakim sensie można wykazać, że pewne algorytmy są najlepszymi z możliwych? Odpowiedzi na te pytania można uzyskać dzięki dziedzinie zwanej analiza algorytmów, której zasadnicze kierunki dotyczą poprawności i złożoności obliczeniowej. Poprawność dotyczy przede wszystkim pojęć i metod związanych z dowodzeniem poprawności algorytmów, takich m.in. jak: własność stopu algorytm musi osiągnąć swój logiczny koniec i zatrzymać się częściowa poprawność program nigdy nie może zatrzymać się ze złymi wynikami metoda niezmienników niezmienniki pozostają prawdziwe bez względu na to, jak często się je osiąga przejście z jednego punktu kontrolnego do drugiego nie narusza żadnych własności niezmienników. Złożoność obliczeniowa koncentruje się na określeniu zasobów (czas obliczeń i pamięć), jakie są potrzebne do wykonania badanego algorytmu.
Złożoność obliczeniowa Oceny złożoności można dokonać według różnych kryteriów. Często stosowana jest metoda polegająca na badaniu, jak zwiększają się zasoby potrzebne do wykonania algorytmu wraz ze wzrostem rozmiaru danych wejściowych. Rozmiar danych wejściowych nazywać będziemy rozmiarem zadania, albo rozmiarem wejścia, przyjmując, że jest to konkretna liczba charakteryzująca objętość danych wejściowych. Jako przykłady rozmiarów wejścia można wymienić: wymiary macierzy w zadaniu mnożenia macierzy liczbę elementów tablicy wejściowej w algorytmach sortowania liczbę n w obliczeniach n! Złożoność czasowa algorytmu czas potrzebny na wykonanie algorytmu w funkcji rozmiaru zadania. Asymptotyczna złożoność czasowa charakter złożoności czasowej przy dążeniu do wartości granicznej wraz ze wzrostem rozmiaru zadania. Złożoność pamięciowa algorytmu pamięć potrzebna na wykonanie algorytmu w funkcji rozmiaru zadania. Asymptotyczna złożoność pamięciowa charakter złożoności pamięciowej przy dążeniu do wartości granicznej wraz ze wzrostem rozmiaru zadania.
Wprowadzenie asymptotycznej złożoności algorytmu jest szczególnie ważne, gdyż przy jej pomocy można określić rozmiar zadań, które mogą być rozwiązane za pomocą tego algorytmu. Jeśli np. algorytm przetwarza wejście o rozmiarze n w czasie cn 2, gdzie c jest pewną stałą, wówczas mówimy, że złożoność czasowa tego jest rzędu cn 2, co zapisujemy jako O(n 2 ) i czytamy duże o od n kwadrat. Pewna nieujemna funkcja f(n) jest O(g(n)), jeśli istnieje taka stała c, że 0 f(n) cg(n) dla wszystkich n oprócz pewnego, być może pustego, zbioru nieujemnych wartości n. Symbol O(g(n)) jest zaliczany do tzw. notacji asymptotycznych, używanych do opisu asymptotycznego czasu działania algorytmów. Na rysunku a) podano interpretację graficzną notacji O. Wynika z niej, że przy pomocy zapisu f(n) = O(g(n)) podaje się górne ograniczenie funkcji z dokładnością do stałego współczynnika. Bardziej precyzyjne zapis ten oznacza, że istnieją dodatnie stałe c i n o takie, że na prawo od n o wartość f(n) jest zawsze nie większa niż cg(n). Interpretacja graficzna
Na rysunkach b) i c) przedstawiono w podobny sposób notacje Θ i Ω, będące także przykładami notacji asymptotycznych. W odróżnieniu od notacji O, która ogranicza funkcję z góry, notacja Ω (rys b) ogranicza funkcję z dołu. Zapis f(n) = Ω(g(n)) oznacza, że istnieją stałe dodatnie c i n o takie, że na prawo od n o wartość funkcji f(n) jest zawsze nie mniejsza od cg(n). Przedstawiona na rys. c) notacja pozwala szacować funkcję z dołu i z góry. Pisząc zatem f(n) = Θ(g(n)) wskazujemy, że istnieją dodatnie stałe c 1, c 2 i n o takie, że na prawo od n o wartość f(n) jest zawsze nie mniejsza od c 1 g(n) i nie większa od c 2 g(n). Kolejny przykład pokazuje, że efektywne algorytmy mogą w sposób nie mniej istotny jak rozwój sprzętu wpływać na wydajność komputerów (mierzoną np. rozmiarem zadania, które mogą rozwiązywać. W dwóch pierwszych kolumnach tabeli zamieszczono pięć przykładowych algorytmów wraz z ich złożonością czasową, rozumianą tutaj jako liczba jednostek czasu potrzebnych do przetworzenia wejścia o rozmiarze n. Jeśli za jednostkę czasu przyjąć 1 milisekundę, to algorytm A 1 może w ciągu sekundy przetworzyć wejście o rozmiarze 1000, natomiast algorytm A 5 wejście o rozmiarze zaledwie 9. Algorytm A 1 A 2 A 3 A 4 A 5 Złożoność Maksymalny rozmiar zadania czasowa 1 sekunda 1 minuta 1 godzina n 1000 6 10 4 3,6 10 6 n lg n 140 4893 2,0 10 5 n 2 31 244 1897 n 3 10 39 153 2 n 9 15 21
W kolejnych kolumnach zamieszczono maksymalne rozmiary jakie mogą być przetworzone przez rozważane algorytmy, jeśli całkowity czas obliczeń przyjąć odpowiednio 1 sekundę, 1 minutę i 1 godzinę. Zakładamy, że prędkość komputerów rośnie 10-krotnie. W kolejnej tabeli pokazano, jak wzrosną rozmiary zadań, które mogą być przetworzone przez algorytmy A 1 do A 5, w wyniku takiego wzrostu szybkości komputerów. Maksymalny rozmiar zadania Algorytm Złożoność czasowa przed zwiększeniem po zwiększeniu A 1 n s 1 10s 1 A 2 n lg n s 2 ok. 10s 2, dla dużych s 2 A 3 n 2 s 3 3,16s 3 A 4 n 3 s 4 2,15s 4 A 5 2 n s 5 s 5 +3,3 Porównajmy teraz efekty zwiększenia szybkości komputerów z efektami zastosowania bardziej efektywnego algorytmu. Zwiększenie prędkości komputera dla algorytmu A 5 powoduje wzrost rozmiaru zadania tylko o 3, a algorytm A 3 ten rozmiar potraja. Zamiana algorytmu A 4 na A 3 (dla 1 minuty) pozwala rozwiązać zadanie 6-krotnie większe, natomiast zamiana A 4 na A 2 zadanie aż 125-krotnie. Powyższe zadanie pokazuje, że zastosowanie bardziej efektywnego algorytmu może znacznie przewyższyć zyski wynikające ze zwiększenia szybkości komputerów.