Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Podobne dokumenty
INFORMATYKA SORTOWANIE DANYCH.

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Zasady analizy algorytmów

Podstawy Informatyki. Sprawność algorytmów

Jeszcze o algorytmach

Podstawy Programowania. Złożoność obliczeniowa

Technologie informacyjne Wykład VII-IX

TEORETYCZNE PODSTAWY INFORMATYKI

Informatyka 1. Złożoność obliczeniowa

Programowanie w VB Proste algorytmy sortowania

Wprowadzenie do złożoności obliczeniowej

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Wstęp do programowania

Podstawy Programowania

Podstawy Programowania. Złożoność obliczeniowa

Liczby pierwsze - wstęp

Algorytmy i Struktury Danych.

Analiza algorytmów zadania podstawowe

Wykład 2. Poprawność algorytmów

Algorytmy i Struktury Danych.

Podstawy Programowania

Teoretyczne podstawy informatyki

Matematyczne Podstawy Informatyki

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Zaawansowane algorytmy i struktury danych

Złożoność obliczeniowa zadania, zestaw 2

Algorytmy i struktury danych

Zaawansowane algorytmy i struktury danych

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Efektywność algorytmów

TEORETYCZNE PODSTAWY INFORMATYKI

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy i struktury danych

Algorytmy sortujące i wyszukujące

Złożoność algorytmów. Wstęp do Informatyki

Programowanie równoległe

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

1. Analiza algorytmów przypomnienie

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Złożoność obliczeniowa i pamięciowa. Spis treści. Złożoność obliczeniowa -- założenia

Algorytmy i struktury danych Matematyka III sem.

Algorytmy i Struktury Danych

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Sortowanie - wybrane algorytmy

Sortowanie przez scalanie

PODSTAWY INFORMATYKI wykład 5.

5. Podstawowe algorytmy i ich cechy.

Sprawozdanie do 5. Projektu z Algorytmów i struktur danych 1

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Algorytm i złożoność obliczeniowa algorytmu

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Teoretyczne podstawy informatyki

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Metody numeryczne. materiały do wykładu dla studentów. 1. Teoria błędów, notacja O

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Luty 2001 Algorytmy (4) 2000/2001

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Laboratorium nr 7 Sortowanie

Efektywna metoda sortowania sortowanie przez scalanie

Przykładowe B+ drzewo

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Algorytmy i Struktury Danych

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Algorytmy i struktury danych

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy w teorii liczb

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Materiały dla finalistów

Struktura danych. Sposób uporządkowania informacji w komputerze.

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Podyplomowe Studium Informatyki

Podyplomowe Studium Programowania i Systemów Baz Danych

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Sortowanie bąbelkowe

Algorytmy sortujące 1

Informatyka A. Algorytmy

Złożoność Obliczeniowa Algorytmów

2:8,7 3:9,4 / \ / \ / \ / \ 4:7,3 5:8 6:9,2 7:4

Algorytmy i Struktury Danych, 2. ćwiczenia

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych.

Struktury Danych i Złożoność Obliczeniowa

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Wstęp do programowania

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Transkrypt:

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to wprowadzili J. Hartmanis i R. Stearns. Najczęściej przez zasób rozumie się czas oraz pamięć dlatego też używa się określeń "złożoność czasowa" i "złożoność pamięciowa". Za jednostkę złożoności pamięciowej przyjmuje się pojedyncze słowo maszyny (np. Bajt). W przypadku złożoności czasowej nie można podać bezpośrednio jednostki czasu, np. milisekundy, bowiem nie wiadomo na jakiej maszynie dany algorytm będzie wykonywany. Dlatego też wyróżnia się, charakterystyczną dla algorytmu, operację dominującą 1. Liczba wykonań tej operacji jest proporcjonalna do wykonań wszystkich operacji. Rozróżnia się dwa rodzaje złożoności: złożoność pesymistyczna określa złożoność w "najgorszym" przypadku, dla najbardziej złośliwych danych. złożoność oczekiwana określa złożoność średnią czyli wartość oczekiwaną. Złożoność obliczeniowa nie jest wygodna w stosowaniu, bowiem operacja dominująca na jednym komputerze może wykonywać się błyskawicznie, na innym zaś musi być zastąpiona szeregiem instrukcji. Dlatego też częściej stosuje się złożoność asymptotyczną, która mówi o tym jak złożoność kształtuje się dla bardzo dużych, granicznych rozmiarów danych wejściowych. Do opisu złożoności obliczeniowej asymptotycznej stosuje się trzy notacje: 1. Notacja wielkie O (omikron) 2. Notacja Ω(Omega) 3. Notacja Ɵ(Teta) 1 Operacja elementarna (dominująca) w teorii obliczeń operacja charakterystyczna dla danego algorytmu, na ogół zajmująca w nim najwięcej czasu. 1

O (omikron) przykłady (dalej będą kolejne ;-) ): O( n ) Algorytm o liniowej zależności czasu wykonania od ilości danych. Dwukrotny wzrost liczby przetwarzanych danych powoduje dwukrotny wzrost czasu wykonania. O( n 2 ) Algorytm, w którym czas wykonania rośnie z kwadratem liczby przetwarzanych elementów. Dwukrotny wzrost liczby danych powoduje czterokrotny wzrost czasu wykonania. O( n log 2 n ) Dobre algorytmy sortujące mają taką właśnie złożoność obliczeniową. Czas wykonania przyrasta dużo wolniej od wzrostu kwadratowego. O( n! ) O( a n ) Bardzo pesymistyczne algorytmy, czas wykonania rośnie bardzo szybko ze wzrostem liczby elementów wejściowych, czyli znalezienie rozwiązania może zająć najszybszym komputerom całe wieki lub tysiąclecia. Takich algorytmów należy unikać jak ognia! np.: jeżeli mamy jakiś ciąg o długości n, i przechodzimy go dwiema pętlami for(int i=0;i<n;i++) for(int j=0;j<n;j++) to złożoność wynosi n^2, jeżeli jedna pętla to złożoność n, natomiast gdy masz wyszukiwanie binarne ciągu uporządkowanego, czyli przy każdym przejściu odrzucasz połowę ciągu to złożoność wynosi log(n) przy podstawie z 2 2

Zapis O(...) określamy mianem klasy złożoności obliczeniowej algorytmu. Złożoność obliczeniowa umożliwia porównywanie wydajności różnych algorytmów sortujących. Z reguły proste algorytmy posiadają wysoką złożoność obliczeniową - długo dochodzą do wyniku końcowego. Algorytmy bardziej skomplikowane posiadają mniejszą złożoność obliczeniową - szybko dochodzą do rozwiązania. Złożoność obliczeniowa wszystkich algorytmów sortujących została dokładnie oszacowana. Przykład Załóżmy, iż mamy program sortujący dane zbudowany na bazie algorytmu sortującego o klasie złożoności obliczeniowej O(n 2 ). Sto elementów jest sortowane w czasie 1 sekundy. Ile czasu zajmie posortowanie za pomocą tego programu zbioru o tysiącu elementach? Odpowiedź brzmi - 100 sekund. Ponieważ ilość danych wzrosła 10 razy, to czas obliczeń wzrósł 10 2, czyli 100 razy. Poniżej przedstawiamy odpowiednią tabelkę. Lp. Ilość elementów Czas obliczeń 1. 100 1 sekunda 2. 1.000 100 sekund = 1 minuta 40 sekund 3. 10.000 10.000 sekund = 2 godziny 46 minut 40 sekund 4. 100.000 1.000.000 sekund = 11 dni 13 godzin 46 minut 40 sekund 5. 1.000.000 6. 10.000.000 100.000.000 sekund = 3 lata 2 miesiące 9 godzin 46 minut 40 sekund 1x10 10 sekund = 317 lat 1 miesiąc 4 dni 17 godzin 46 minut 40 sekund Widzimy więc, iż algorytm ten spisuje się dobrze tylko przy niewielkiej liczbie elementów. Gdy liczba sortowanych elementów jest duża, czas oczekiwania na rozwiązanie może być nie do zaakceptowania. Dlatego właśnie informatycy poświęcili tak dużo swojego wysiłku na opracowanie odpowiednio szybkich algorytmów sortujących (te najszybsze mają klasę złożoności O(n log 2 n) ). 3

UWAGA: Notacja O eliminuje składniki wolniej rosnące oraz zaniedbuje czynniki stałe, przez które pomnożone są funkcje. Przykład: f(n) = 5n 2 2*n + 2 = O(n 2 ) Ponieważ: 5n 2-2n + 2 5n 2 (dla każdego ) n N Przykłady określania złożoności czasowej: 1. Przeszukiwanie elementów w celu znalezienia danego elementu x i:=0; Repeat i:=i+1 until (a[i]=x) or (i=n); złożoność O(n) 4

2. Jeżeli elementy są wcześniej posortowane, stosujemy metodę połowienia przedziałów (metoda bisekcji lub przeszukiwania połówkowego) i:=1; j:=n; repeat k:=(i+j) div 2 if x>a[k] then i:= k+1 else j:= k-1 until (x=a[k]) or (i>j); złożoność O(log n) 3. Znajdowanie min i max metodą iteracyjną min:=a[1]; max:=a[1]; for i:=2 to n do begin if min >a[i] then min:=a[i]; if max <a[i] then max:=a[i] end; złożoność O(n) 5

4. wyszukiwanie wartości maksymalnej w ciągu nieposortowanym Załóżmy, że masz n liczb. Potrzebujesz przejrzeć każdą z nich po to, by określić która z nich jest największa. Potrzebujesz zatem n operacji ("spojrzeń) - liczba potrzebnych operacji jest proporcjonalna do rozmiaru ciągu - więc złożoność liniowa, O(n). 5. wyszukiwanie danej liczby w ciągu posortowanym Pomyśl jakąś liczbę od 1 do 1000. Teraz ja zgadnę jaką pomyślałeś, zadając Ci maksymalnie 10 pytań: Czy ta liczba jest mniejsza od 500? Jeśli tak, to czy jest mniejsza od 250? Jesli nie, to czy jest mniejsza od 375? Jeśli nie, to czy jest mniejsza od 438? Jeśli nie, to czy jest mniejsza od 469? Jeśli tak, to czy jest mniejsza od 443? Jeśli tak, to czy jest mniejsza od 440? Jeśli tak, to tą liczbą jest 439. Idea jest taka, że dzięki temu, że ciąg jest posortowany, cały czas pomniejszasz sobie zakres, w którym masz szukać o połowę - dzięki temu potrzebujesz tylko ok. log 2 1000 operacji - a więc masz złożoność O(log 2 n) - logarytmiczną. 6

6. sortowanie przez wybieranie Masz nieposortowany ciąg o n elementach i posortowany o 0 elementach. Szukasz najmniejszego elementu w ciągu nieposortowanym i wstawiasz go na koniec posortowanego ciągu, tyle razy, aż posortowany ciąg będzie miał n elementów, a nieposortowany 0. Taki stan uzyskasz wtedy, gdy wszystkie n elementów z nieposortowanego przerzucisz w posortowany. Musisz zatem n razy wyszukać najmniejszy element w ciągu - a wyszukiwanie najmniejszego elementu, jak wiemy z 1. przykładu, ma złożoność O(n) (liniową). Zatem wykonanie n razy operacji o złozoności n wymaga n*n operacji, czyli ma złożoność O(n*n) = O(n 2 ) - kwadratową. 7

Z grubsza złożoności można posortować następująco (od najlepszej (najmniejszej)) : log(n) n nlog(n) n^2 n^3... 2^n 3^n... n! Na załączonym wykresie widać jak czas wykonania programu rośnie w zależności od wielkości rozwiązywanego problemu. 8