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.