0% found this document useful (0 votes)
28 views3 pages

HTML Input

sdffffffffffffffff

Uploaded by

youngscribe2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views3 pages

HTML Input

sdffffffffffffffff

Uploaded by

youngscribe2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 3

Wstęp do Algorytmiki - Złożoność Obliczeniowa i Sortowanie

Literatura
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, "Wprowadzenie do algorytmów"
Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani, "Algorytmy"

Złożoność Obliczeniowa
Definicja
Złożoność obliczeniowa to ilość zasobów komputerowych koniecznych do rozwiązania problemu obliczeniowego. Rozważane zasoby to zazwyczaj czas, pamięć lub liczba procesorów. Twórcami teorii złożoności obliczeniowej są Richard Stearns i Juris Hartmanis.

Złożoność Pamięciowa i Czasowa


Złożoność pamięciowa: Ilość pamięci, która jest wykorzystywana w celu rozwiązania problemu obliczeniowego. Podawana jest jako funkcja rozmiaru danych.

Złożoność czasowa: Czas potrzebny na rozwiązanie problemu obliczeniowego w standardowych jednostkach czasu. Podawana jest jako funkcja rozmiaru danych. Dokładna złożoność czasowa jest niemożliwa do określenia (zależy np. od maszyny), dlatego wyrażana jest w ilości operacji
dominujących.

Typy Złożoności Obliczeniowej


1. Złożoność optymistyczna: Określa potrzebne zasoby dla najkorzystniejszego zestawu danych.
2. Złożoność średnia: Określa potrzebne zasoby dla typowego (zgodnie z rozkładem prawdopodobieństwa) zestawu danych.
3. Złożoność pesymistyczna: Określa potrzebne zasoby dla najbardziej niekorzystnego zestawu danych.

Przykład Typów Złożoności Obliczeniowej


Rozważmy algorytm sprawdzający, czy w zbiorze danych wejściowych jest liczba ujemna:

Optymistyczna złożoność T (n) = 1 (pierwsza ze sprawdzonych wartości jest ujemna)


o

Pesymistyczna złożoność T (n) = n (ostatnia ze sprawdzonych wartości jest ujemna lub brak liczb ujemnych)
p

Średnia złożoność T (n) = n/2 (liczba ujemna jest znaleziona średnio po sprawdzeniu połowy zbioru)
s

Przykłady Złożoności Wielomianowych


Liniowa: T (n) = 5n
Kwadratowa: T (n) = 5n + 9n − 13
2

Sześcienna: T (n) = 5n − 9n
3

Złożoności Niewielomianowe
Logarytmiczna: T (n) = 2 log(n) + 2
Quasiliniowa: T (n) = 4n log(n + 1) − 2
Wykładnicza: T (n) = e + x + x
n 13

Silniowa: T (n) = 5(n − 1)!


NP-zupełna i NP-trudna

Notacje Klas Złożoności


1. Duże O (O): Określa asymptotyczne tempo wzrostu funkcji jako górną granicę.
2. Małe o (o): Wskazuje, że funkcja rośnie wolniej niż podana granica.
3. Duże Omega (Ω): Określa asymptotyczne tempo wzrostu funkcji jako dolną granicę.
4. Małe omega (ω): Wskazuje, że funkcja rośnie szybciej niż podana granica.
5. Theta (Θ): Wskazuje, że funkcja rośnie asymptotycznie w tym samym tempie.

Przykład Szacowania Złożoności Obliczeniowej


Dla algorytmu obliczającego sumę ciągu n liczb:

Krok Operacja Czas wykonania


1 Read n 1 × t1
2 sum = 0 1 × t2
3 i=1 1 × t2
4 If i > n then goto 7 (n + 1) × t3
5 i=i+1 n × t2
6 sum = sum + i n × t2
7 Write sum 1 × t4
8 End 1 × t5

Algorytmy Sortowania
Sortowanie przez Wstawianie
insertionsort(A):
for i = 1 to length(A) - 1:
x = A[i]
j = i - 1
while j >= 0 and A[j] > x:
A[j + 1] = A[j]
j = j - 1
A[j + 1] = x

Najprostszy z algorytmów sortowania.


Odzwierciedla układanie kart w dłoni.
Użyteczny jedynie dla krótkich ciągów liczb.
Średnia złożoność obliczeniowa: O(n ).
2

Sortowanie Bąbelkowe
bubbleSort(A):
n = length(A)
repeat:
swapped = false
for i = 1 to n - 1 inclusive:
if A[i - 1] > A[i]:
swap(A[i - 1], A[i])
swapped = true
n = n - 1
until not swapped

Polega na porównywaniu dwóch sąsiednich elementów i zamianie ich kolejności jeśli nie jest poprawna.
Użyteczny jedynie dla krótkich ciągów liczb.
Średnia złożoność obliczeniowa: O(n ).
2

Sortowanie Shella
gaps = [701, 301, 132, 57, 23, 10, 4, 1]
foreach (gap in gaps):
for i = gap to n:
temp = a[i]
for j = i; j >= gap and a[j - gap] > temp; j -= gap:
a[j] = a[j - gap]
a[j] = temp

Uogólnienie sortowania przez wstawianie lub bąbelkowego.


Kolejne przebiegi polegają na sortowaniu przez proste wstawianie elementów oddalonych o ustaloną liczbę miejsc.
Średnia złożoność zależy od zastosowanego ciągu oddalenia elementów.
Algorytm wciąż jest przedmiotem badań i optymalizacji.

Sortowanie przez Scalanie


mergesort(T, p, r):
if p < r:
q = (p + r) / 2
mergesort(T, p, q)
mergesort(T, q + 1, r)
merge(T, p, q, r)

Algorytm rekurencyjny.
Bardzo prosty w implementacji i efektywny.
Średnia złożoność obliczeniowa: O(n log(n)).

Sortowanie Szybkie
quicksort(A, low, high):
if low < high:
pivot_location = Partition(A, low, high)
quicksort(A, low, pivot_location)
quicksort(A, pivot_location + 1, high)

Algorytm rekurencyjny.
Zaimplementowany w wielu bibliotekach standardowych.
Średnia złożoność obliczeniowa: n log(n).

Najważniejsze Informacje
Szczegółowe omówienie złożoności obliczeniowej, w tym złożoności pamięciowej i czasowej.
Kompleksowy przegląd różnych algorytmów sortowania, ich implementacji i złożoności obliczeniowej.

You might also like