Wyższa Szkoła Technologii Informatycznych
Ćwiczenia Algorytmy i struktury danych
ćwiczenia 4
Złożoność czasowa algorytmów
Złożoność obliczeniowa stała - O(1)
Algorytm wykonuje stałą ilość operacji dominujących bez względu na rozmiar danych wejściowych. W takim algorytmie czas wykonania jest stały i nie zmienia się przy zmianie liczby przetwarzanych elementów.
Złożoność obliczeniowa liniowa - O(n)
Dla każdej danej algorytm wykonuje stałą ilość operacji dominujących. Czas wykonania jest proporcjonalny do liczby n danych wejściowych. Czas wykonania rośnie liniowo ze wzrostem liczby elementów.
Złożoność obliczeniowa kwadratowa - O(n2)
Algorytm dla każdej danej wykonuje ilość operacji dominujących proporcjonalną do liczby wszystkich przetwarzanych danych. Czas wykonania jest proporcjonalny do kwadratu liczby danych n.
Inne złożoności tego typu O(n3), O(n4)... noszą nazwę wielomianowych złożoności obliczeniowych.
Złożoność obliczeniowa logarytmiczna - O(log n)
W algorytmie zadanie rozmiaru n da się sprowadzić do zadania rozmiaru n/2. Typowym przykładem jest wyszukiwanie binarne w zbiorze uporządkowanym. Sprawdzenie środkowego elementu pozwala określić, w której z dwóch połówek zbioru może znajdować się poszukiwany element.
Ponieważ uczniowie młodszych klas liceum nie znają pojęcia logarytmu, podajemy jego skróconą definicję:
Zapis logax czytamy: logarytm przy podstawie a z liczby x. Wartością jest wykładnik potęgowy y, do którego należy podnieść podstawę logarytmu a, aby otrzymać liczbę logarytmowaną x.
logax = y wtedy i tylko wtedy, gdy ay = x
W określeniu klasy złożoności obliczeniowej nie podajemy podstawy logarytmu, ponieważ logarytmy o różnych podstawach z tej samej wartości różnią się od siebie jedynie iloczynem przez stałą:
Niech
logax = y oraz logbx = cy
Wtedy
ay = x, oraz bcy = x
Stąd
ay = bcy
(a)y = (bc)y
Zatem
a = bc oraz logbx = c logax
Ponieważ podstawy a i b są stałe, to i c musi być stałe. Z kolei z definicji notacji Omikron wynika, iż klasa złożoności dwóch funkcji różniących się jedynie iloczynem przez stałą jest taka sama. W informatyce bardzo często stosuje się logarytmy przy podstawie 2.
Przykład :
log24 = 2, bo 22 = 4
log216 = 4, bo 24 = 16
log2256 = 8, bo 28 = 256, itd.
Złożoność obliczeniowa liniowo logarytmiczna - O(n log n)
Zadanie rozmiaru n daje się sprowadzić do dwóch podzadań rozmiaru n/2 plus pewna ilość operacji, których liczba jest proporcjonalna do ilości danych n. Tego typu złożoność obliczeniową posiadają dobre algorytmy sortujące.
Złożoność obliczeniowa wykładnicza - O(2n), O(n!)
Złożoność obliczeniową O(2n) posiada algorytm, w którym wykonywana jest stała liczba operacji dla każdego podzbioru n danych wejściowych.
Złożoność obliczeniową O(n!) posiada algorytm, w którym wykonywana jest stała liczba operacji dla każdej permutacji n danych wejściowych.
SORTOWANIE ZWARIOWANE
SORTOWANIE PRZEZ WYBÓR
Idea algorytmu sortowania przez wybór jest bardzo prosta. Załóżmy, iż chcemy posortować zbiór liczbowy rosnąco. Zatem element najmniejszy powinien znaleźć się na pierwszej pozycji. Szukamy w zbiorze elementu najmniejszego i wymieniamy go z elementem na pierwszej pozycji. W ten sposób element najmniejszy znajdzie się na swojej docelowej pozycji.
W identyczny sposób postępujemy z resztą elementów należących do zbioru. Znów wyszukujemy element najmniejszy i zamieniamy go z elementem na drugiej pozycji. Otrzymamy dwa posortowane elementy. Procedurę kontynuujemy dla pozostałych elementów dotąd, aż wszystkie będą posortowane.
SORTOWANIE BĄBELKOWE
SORTOWANIE BĄBELKOWE WERSJA 2
SORTOWANIE BĄBELKOWE WERSJA 3
SORTOWANIE BĄBELKOWE WERSJA 4