Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

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ązłożoność czasowaczasową;

  • pamięciowąpamięciowa złożoność obliczeniowapamię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 .

R1LfY8ftdr8mj1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Aby przedstawić powyższy wniosek w sposób matematyczny, posłużymy się notacją duże Onotacja 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.

Ważne!

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ść pesymistycznazłożoności pesymistycznej.

Dla dokładniejszej analizy złożoności uwzględniana jest również złożoność oczekiwanazł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ść optymistycznazł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ą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:

Linia 1. n ← wprowadź dodatnią liczbę całkowitą. Linia 2. suma ← 0. Linia 3. i ← 1. Linia 4. j ← 1. Linia 6. dopóki i otwórz nawias ostrokątny znak równości n wykonuj dwukropek. Linia 7. suma ← suma plus i. Linia 8. i ← i plus 1. Linia 10. dopóki j otwórz nawias ostrokątny znak równości n wykonuj dwukropek. Linia 11. suma ← suma plus j. Linia 12. j ← j plus 2. Linia 14. wypisz otwórz nawias okrągły suma zamknij nawias okrągły.

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:

Linia 1. a ← 5. Linia 2. b ← 10. Linia 3. c ← a plus b. Linia 5. wypisz otwórz nawias okrągły c zamknij nawias okrągły.

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:

Linia 1. n ← wprowadź dodatnią liczbę całkowitą. Linia 3. jeżeli n parzyste dwukropek. Linia 4. wypisz otwórz nawias okrągły n prawy ukośnik 2 zamknij nawias okrągły. Linia 6. w przeciwnym razie dwukropek. Linia 7. i ← 0. Linia 8. suma ← 0. Linia 10. dopóki i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 11. suma ← suma plus 2 asterysk i. Linia 12. i ← i plus 1. Linia 14. wypisz otwórz nawias okrągły suma zamknij nawias okrągły.

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:

sumasuma + 2 * i oraz  i ← i + 1.

Słownik

efektywność algorytmu
efektywność algorytmu

praktyczne zastosowanie algorytmu w programie; miara tego, jak bardzo korzystna jest wybrana metoda

notacja duże O
notacja duże O

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 dominujące
operacje dominujące

operacje charakterystyczne dla danego algorytmu, na ogół zajmujące w nim najwięcej czasu

pamięciowa złożoność obliczeniowa
pamięciowa złożoność obliczeniowa

ilość pamięci potrzebnej do wykonania zadania, wyrażona jako funkcja ilości danych

rząd złożoności
rząd złożoności

właściwość służąca do opisywania czasu działania algorytmu

złożoność czasowa
złożoność czasowa

ilość czasu potrzebnego do wykonania zadania, wyrażona jako funkcja ilości danych

złożoność obliczeniowa
złożoność obliczeniowa

ilość zasobów komputerowych potrzebnych do wykonania zadania

złożoność oczekiwana
złożoność oczekiwana

inaczej złożoność średnia; ilość zasobów potrzebna do zrealizowania zadania dla statystycznie oczekiwanych danych; zapisywana za pomocą notacji theta – Θ

złożoność optymistyczna
złożoność optymistyczna

ilość zasobów potrzebna programowi do zrealizowania zadania dla najkorzystniejszego przypadku danych; zapisywana za pomocą notacji „małe O” – ο

złożoność pesymistyczna
złożoność pesymistyczna

ilość zasobów potrzebna do zrealizowania zadania w przypadku najgorszych danych; zapisywana za pomocą notacji „duże O” – O