Przejdź do dokumentu

Złożoność obliczeniowa

Notatki z wykładu nt. złożoności obliczeniowej algorytmów
Kurs

Bioinformatyka (BIOIN2021)

38 Dokumenty
Studenci udostępnili 38 dokumentów w tym kursie
Rok akademicki: 2021/2022
Przesłane przez:
Anonimowy Student
Ten dokument został przesłany przez studenta, takiego jak Ty, który zażyczył sobie zachować anonimowość.
Uniwersytet Medyczny im. Karola Marcinkowskiego w Poznaniu

Komentarze

Aby publikować komentarze, zaloguj się lub zarejestruj się.

Przejrzyj tekst

Złożoność obliczeniowa

Czas działania algorytmów

Mierzony TYLKO l iczbą wykonanych operacji elementarnych (niezależnie
od architektury komputera)
Miara efektywno\ci algorytmu
Związany bezpo\rednio ze złożono\cią obliczeniową

Złożoność obliczeniowa

Funkcja złożoności obliczeniowej - wyraża liczbę operacji elementarnych
(dominujących) dokonywanych przez algorytm w zależno\ci od rozmiaru danych
wej\cia
Je\li funkcja złożono\ci jest opisana notacją asymptotyczną to można pominąć
<funkcja złożono\ci obliczeniowej= bo to wiadomo
Okre\la koszt wykonania algorytmu
Dla instancji I jest wyrażona jako funkcja rozmiaru danych wej\ciowych Length(I)
Ze względu na złożono\ć obliczeniową wyróżniamy:
1. Algorytmy wielomianowe
2. Algorytmy wykładnicze

Rodzaje złożoności obliczeniowej:

Optymistyczna - dolne oszacowanie liczby wykonanych operacji
[rednia - warto\ć oczekiwana liczby wykonanych operacji → znana dla
niektórych algorytmów, bo często nie znamy rozkładu danych
Pesymistyczna - górne oszacowanie liczby operacji → najczęściej (wiemy, że
gorzej nie będzie, w przypadku zmiennej liczby wykonań danej jednostki
składowej zakładamy, że poleci najwięcej razy)

Koszt wykonania operacji elementarnej = 1

Koszt wykonania p/f = koszt wykonania jej ciała (tre\ci)
Koszt komentarza = 0
Koszt funkcji standardowych (div, log, mod, sqrt, funkcje trygonometryczne,
funkcje specjalne) i instrukcji wej\cia-wyj\cia = 1

Algorytmy wielomianowe

Liczba operacji elementarnych jest ograniczona od góry przez wielomian od
rozmiaru wejścia
Czyli dla wielomianowych jest n^k, gdzie n = rozmiar danych wejścia, a k to
jakaś stała
Algorytm wielomianowy w jednym z modeli obliczeń pozostanie
wielomianowy w każdym innym
Tylko one są efektywne!!
Są też algorytmy pseudowielomianowe, gdzie liniowość zależy od
dodatkowych parametrów

Algorytmy wykładnicze

Każdy algorytm, który nie jest wielomianowy XDDD
Liczba operacji elementarnych nie może być ograniczona od góry przez
żaden wielomian od rozmiaru wej\cia
Wolne - niezależnie od szybko\ci zegara procesora
Je\li dysponujemy tylko algorytmem wykładniczym to możemy rozwiązać
dokładnie tylko instancje o małych rozmiarach
Nie zawsze będą mniej efektywne od wielomianowego → zależy od stałych
ukrytych w notacji asymptotycznej, które opisują rzędy złożono\ci
porównywanych algorytmów

Złożoność pamięciowa

Pamięć

#Z 1 zmienną, ale liczba operacji bez zmian s = 0sqrt((a+b+c )(b+c)(a+c)(a+b)) return s

Obliczanie objętości

#Objętość walca V ← π * r * r * h return V

Zagadnienia kalendarzowe

#Rok przestępny if ((n mod 4 == 0) and (n mod 100 6= 0)) or (n mod 400 == 0) then return true else return false

Problemy o złożoności logarytmicznej

Rozwiązywane algorytmami z liczbą operacji proporcjonalną do rozmiaru danych
wej\ciowych.
Reszta z dzielenia

tmp = 1 while (tmp + 1) * b f a do tmp = tmp + 1 return a tmp * b

Addytywny algorytm Euklidesa - NWD

while a 6= b do if a g b then a = a − b else b = b − a return a

Wyszukiwanie binarne w uporządkowanej tablicy

i = 1 j = n while (A[i] != x) and (i f j) do k = (i+j) div 2 if x > A[k] then i = k + 1 else j = k - 1 if A[k] = x then return k else write "Nie znaleziono x w A" return

Potęgi

#Potęga binarna k = n b = 1 c = x while k 6= 0 do if k mod 2 == 0 then k = k div 2 c = c * c else k = k − 1 b = b * c return b

Problemy o złożoności liniowej

Rozwiązywane algorytmami z jedną pętlą i wykorzystującymi tablice 1D.
Liczba ujemnych elementów

#sposób 1 ile = 0 for i = 1 to n do if A[i] < 0 then ile = ile + 1 return ile

#2 sposób ile = 0

for i = n-1 downto 0 do wart = wart * x0 + A[i] return wart

#Z zapamiętaniem wyników częściowych W[n] = A[n] for i = n-1 downto 0 do W[i] = W[i+1] * x0 + A[i] return W[0]

Fibonacci

#za pomocą tablicy 1D F[0] = 1 F[1] = 1 k = 2 while k f n do F[k] = F[k-1] + F[k-2] k = k + 1 return F[n]

#wersja 2 F0 = 1 F1 = 1 k = 2 while k f n do Fk = F0 + F F0 = F F1 = Fk k = k + 1 return Fk

⇒ lepsza złożoność pamięciowa
Sortowanie przez zliczanie
*liniowy tylko przy dodatkowych założeniach

COUNTING-SORT(A,n,k) for i=0 to k do // krok 0 C[i]= for j=1 to n do // krok 1 C[A[j]]=C[A[j]]+ for i=1 to k do // krok 2 C[i]=C[i]+C[i-1] for j=n downto 1 do // krok 3

B[C[A[j]]]=A[j] C[A[j]]=C[A[j]]- return B[1.]

Złożono\ć sortowania przez zliczanie zależy wielomianowo zależy od n i k → k to
największa warto\ć w danych wej\ciowych

Problemy o złożoności liniowo-logarytmicznej

Sito Eratostenesa - szukanie liczb pierwszych w przedziale [2,n]

SITO_ERATOSTENESA(n, A[2.]) for i = 2 to n do if A[i] 6= 0 then write A[i] j = i while j f n do j = j + i if A[j] 6= 0 then A[j] = 0 return {A[i] 6= 0 : 2 f i f n}

Złożono\ć okre\lana przez liczbę wykre\leń liczb z badanego przedziału
Liczba wszystkich wykre\leń będzie w przybliżeniu n*logn
Sortowanie
Jeden z nielicznych problemów ze znanym dolnym oszacowaniem złożono\ci
obliczeniowej
Dowód tego oszacowania → drzewo decyzyjne
Drzewo decyzyjne - regularne drzewo binarne, w którym:
wewnętrzn e wierzchołki poziomu k odpowiadają różnym posortowaniom
n elementów
liście odpowiadają różnym posortowaniom n elementów
krawędzie odpowiadają porównaniom par elementów
Algorytmy sortujące asymptotycznie optymalne - o takim samym rzędzie
złożono\ci obliczeniowej jak dolne ograniczenie złożono\ci dla problemu
Iloczyn macierzy

ILOCZYN_MACIERZY(n,A[1.,1.],B[1.,1.]) for i = 1 to n do for j = 1 to n do s = 0 for k = 1 to n do s = s + A[i,k] * B[k,j] C[i,j] = s return C

Problemy o złożoności wykładniczej

Generowanie wszystkich permutacji zbioru
Generowanie wszystkich podzbiorów zbioru
Problem Collatza - prawdopodobnie wykładniczy
Znalezienie odpowiedzi na pytanie: czy funkcja wypisuje 1 dla dowolnego
naturalnego n?

function Collatz(n) while n 6= 1 do if (n mod 2 == 0) then n = n div 2 else n = 3 * n + 1 return n

Naiwny algorytm sprawdzania pierwszości
Wydaje się wielomianowy, ale jest wykładniczy

function PIERWSZOSC(n) for i = 2 to [√n] do if n mod i = 0 then PIERWSZOSC = false exit #exit = natychmiastowe opuszczenie pętli else PIERWSZOSC = true

Złożoność problemów rekurencyjnych

Analiza złożono\ci równań rekurencyjnych wymaga rozwiązania równań
rekurencyjnych, które opisują zależno\ci między złożono\cią obliczeniową dla
różnych n
Metody rozwiązania równań rekurencyjnych:
Metoda podstawiania
Twierdzenie o rekurencji uniwersalnej
Silnia

function SILNIA(n) if n=0 or n=1 then SILNIA = 1 else SILNIA = n * SILNIA(n-1)

#lub function SILNIA(n) if n=0 or n=1 then return 1 else return n * SILNIA(n-1)

#bez rekurencji wart = 1 for i = 2 to n do wart = wart * i return wart

W dwóch pierwszych zachodzi równanie rekurencyjne
Quick-sort
Dziel i zwyciężaj a rekurencja
Analiza złożono\ci obliczeniowej algorytmów skonstruowanych za pomocą techniki
dziel i zwyciężaj prowadzi do równań rekurencyjnych okre\lonej postaci
#PARTITION

PARTITION(A,p,r) x=A[r] i=p- for j=p to r-1 do if A[j] <= x then i=i+ A[i] <-> A[j] A[i+1] <-> A[r] return i+

#lub function PARTITION(A[1.], p, r) x = A[p] i = p - 1 j = r + 1

Czy ten dokument był pomocny?

Złożoność obliczeniowa

Kurs: Bioinformatyka (BIOIN2021)

38 Dokumenty
Studenci udostępnili 38 dokumentów w tym kursie
Czy ten dokument był pomocny?
Złożono\ć obliczeniowa 1
Złożoność obliczeniowa
Czas działania algorytw
Mierzony TYLKO liczbą wykonanych operacji elementarnych (niezależnie
od architektury komputera)
Miara efektywno\ci algorytmu
Związany bezpo\rednio ze złożono\cią obliczeniową
oność obliczeniowa
Funkcja złożoności obliczeniowej - wyraża liczbę operacji elementarnych
(dominujących) dokonywanych przez algorytm w zależno\ci od rozmiaru danych
wej\cia
Je\li funkcja złożono\ci jest opisana notacją asymptotyczną to można pominąć
<funkcja złożono\ci obliczeniowej= bo to wiadomo
Okre\la koszt wykonania algorytmu
Dla instancji I jest wyrażona jako funkcja rozmiaru danych wej\ciowych Length(I)
Ze względu na złożono\ć obliczeniową wyróżniamy:
1. Algorytmy wielomianowe
2. Algorytmy wykładnicze
Rodzaje onci obliczeniowej:
Optymistyczna - dolne oszacowanie liczby wykonanych operacji
[rednia - warto\ć oczekiwana liczby wykonanych operacji → znana dla
niektórych algorytmów, bo często nie znamy rozkładu danych
Pesymistyczna - górne oszacowanie liczby operacji → najczęściej (wiemy, że
gorzej nie będzie, w przypadku zmiennej liczby wykonań danej jednostki
składowej zakładamy, że poleci najwięcej razy)
Koszt wykonania operacji elementarnej = 1