Przeczytaj
Jak zdefiniować złożoność obliczeniową?
Złożoność obliczeniowa algorytmu pozwala określić ilość zasobów komputerowych niezbędnych do wykonania czynności opisanych w algorytmie w zależności od rozmiaru danych wejściowych.
Wyróżnia się złożoność:
czasowączasową;
pamięciowąpamięciową.
Pierwsza z nich odnosi się do liczby wykonywanych operacji i jest niezależna od komputera oraz języka programowania. Natomiast druga odnosi się do rozmiaru wykorzystywanej pamięci.
Załóżmy, że napisaliśmy program, który przyjmuje od użytkownika słów, a następnie modyfikuje w pewien sposób wszystkie otrzymane wyrazy i wypisuje ostateczny rezultat przekształceń.
Na każdym słowie wykonywana jest pewna liczba operacji, a zatem szybkość działania programu zależy głównie od rozmiaru danych wejściowych. Opiszmy liczbę wykonywanych operacji. Posłużymy się w tym celu pewną funkcją . Przyjmijmy, że ma ona następującą postać:
Dla dużych argumentów wartość jest o wiele większa niż . Wynika z tego, że wartość funkcji zależy głównie od składnika .
Aby przedstawić powyższy wniosek w sposób matematyczny, posłużymy się notacją duże Onotacją duże O:
W taki właśnie sposób wyznaczyliśmy złożoność czasową przykładowego algorytmu; jest to złożoność kwadratowa.
Liczba operacji wykonywanych przez program może być zależna nie tylko od wielkości danych wejściowych, ale także od nich samych. W takiej sytuacji podczas wyznaczania złożoności obliczeniowej bierzemy pod uwagę najbardziej pesymistyczny przypadek (zakładamy, że realizacja algorytmu pochłonie największą ilość zasobów systemu komputerowego), co znaczy, że dla określania złożoności obliczeniowej będziemy używać złożoności pesymistycznejzłożoności pesymistycznej.
Dla dokładniejszej analizy złożoności uwzględniana jest również złożoność oczekiwanazłożoność oczekiwana – istnieje wiele przypadków, w których porównywane algorytmy mają tę samą złożoność pesymistyczną, jednak w przypadku średnim nie działają tak samo szybko. Wyróżniamy również złożoność optymistycznązłożoność optymistyczną, która określa złożoność dla najlepszego przypadku danych. W praktyce jednak często nie jest ona brana pod uwagę.
Operacje dominujące
Określając czasową złożoność obliczeniową, bierzemy pod uwagę tzw. operacje dominująceoperacje dominujące. Są to operacje charakterystyczne dla danego algorytmu, a więc mające największy wpływ na czas potrzebny do wykonania algorytmu. Przeanalizujmy przykładowy pseudokod prostego programu:
Program ten wykonuje m.in. operacje odczytu i zapisu danych oraz dodawania. O czasie działania programu decyduje jednak tak naprawdę liczba wykonywanych dodawań. Jeżeli program wykona ich ponad milion, to czas potrzebny na zapis czy odczyt danych staje się mało istotny. Operacje dodawania są zatem operacjami dominującymi w przedstawionym algorytmie.
Zastanówmy się nad kolejnym przykładem:
W powyższym algorytmie nie ma operacji dominujących, czyli takich, które zajmowałyby większość czasu potrzebnego do wykonania w zależności od danych wejściowych. Nasz program zawsze wykona niezmienną liczbę operacji.
Przeanalizujmy jeszcze jeden przykład:
Ten z kolei program może być wykonywany przez różny czas w zależności od tego, jaką wartość będzie miała zmienna n
. W takiej sytuacji zawsze bierzemy pod uwagę najbardziej pesymistyczny przypadek. Operacjami dominującymi są więc:
suma
← suma + 2 * i
oraz i
← i + 1
.
Słownik
praktyczne zastosowanie algorytmu w programie; miara tego, jak bardzo korzystna jest wybrana metoda
miara określająca, w jaki sposób rośnie wartość funkcji wraz ze zwiększaniem jej argumentów; służy do wyznaczania górnych granic asymptotycznych
operacje charakterystyczne dla danego algorytmu, na ogół zajmujące w nim najwięcej czasu
ilość pamięci potrzebnej do wykonania zadania, wyrażona jako funkcja ilości danych
właściwość służąca do opisywania czasu działania algorytmu
ilość czasu potrzebnego do wykonania zadania, wyrażona jako funkcja ilości danych
ilość zasobów komputerowych potrzebnych do wykonania zadania
inaczej złożoność średnia; ilość zasobów potrzebna do zrealizowania zadania dla statystycznie oczekiwanych danych; zapisywana za pomocą notacji theta –
ilość zasobów potrzebna programowi do zrealizowania zadania dla najkorzystniejszego przypadku danych; zapisywana za pomocą notacji „małe O” –
ilość zasobów potrzebna do zrealizowania zadania w przypadku najgorszych danych; zapisywana za pomocą notacji „duże O” –