Algorytmy – definicja, cechy, złożoność.
Transkrypt
Algorytmy – definicja, cechy, złożoność.
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 cn2, gdzie c jest pewną stałą, wówczas mówimy, że złożoność czasowa tego jest rzędu cn2, co zapisujemy jako O(n2) 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 no takie, że na prawo od no 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 no takie, że na prawo od no 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 c1, c2 i no takie, że na prawo od no wartość f(n) jest zawsze nie mniejsza od c1g(n) i nie większa od c2g(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 A1 może w ciągu sekundy przetworzyć wejście o rozmiarze 1000, natomiast algorytm A5 wejście o rozmiarze zaledwie 9. Algorytm A1 A2 A3 A4 A5 Złożoność czasowa n n lg n n2 n3 2n Maksymalny rozmiar zadania 1 sekunda 1 minuta 1 godzina 1000 6·104 3,6·106 140 4893 2,0·105 1897 31 244 153 10 39 21 9 15 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 A1 do A5, w wyniku takiego wzrostu szybkości komputerów. Algorytm A1 A2 A3 A4 A5 Maksymalny rozmiar zadania Złożoność czasowa przed zwiększeniem po zwiększeniu 10s1 n s1 ok. 10s2, dla dużych s2 s2 n lg n 3,16s3 s3 n2 2,15s4 n3 s4 n s5+3,3 2 s5 Porównajmy teraz efekty zwiększenia szybkości komputerów z efektami zastosowania bardziej efektywnego algorytmu. Zwiększenie prędkości komputera dla algorytmu A5 powoduje wzrost rozmiaru zadania tylko o 3, a algorytm A3 ten rozmiar potraja. Zamiana algorytmu A4 na A3 (dla 1 minuty) pozwala rozwiązać zadanie 6-krotnie większe, natomiast zamiana A4 na A2 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.