algorytmy i złożoność obliczeniowa - | wydział...

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

Upload: vokhue

Post on 28-Feb-2019

228 views

Category:

Documents


0 download

TRANSCRIPT

1

Algorytmy

i złożoność obliczeniowa

Wojciech Horzelski

2

Tematyka wykładu

Ø  Wprowadzenie Ø  Poprawność algorytmów (elementy analizy algorytmów) Ø  Wyszukiwanie Ø  Sortowanie Ø  Elementarne i abstrakcyjne struktury danych

3

Literatura

T. Cormen, Ch. Lieserson, R. Rivest, Wprowadzenie do Algorytmów, WNT, 1997

R. Sedgewick, Algorytmy w C++, RM, 1999

N. Wirth, Algorytmy + struktury danych = programy, WNT, 2001

4

O co w tym wszystkim chodzi?

Ø  Rozwiązywanie problemów:

–  Układanie planu zajęć

–  Bilansowanie budżet

–  Symulacja lotu samolotem

–  Prognoza pogody

Ø  Dla rozwiązania problemów potrzebujemy procedur, recept, przepisów – inaczej mówiąc algorytmów

5

Historia

Ø  Nazwa pochodzi od perskiego matematyka Muhammeda ibn Musa Alchwarizmiego (w łacińskiej wersji Algorismus) – IX w n.e.

Ø  Pierwszy dobrze opisany algorytm – algorytm Euklidesa znajdowania największego wspólnego podzielnika, 400-300 p.n.e.

Ø  XIX w. – Charles Babbage, Ada Lovelace.

Ø  XX w. – Alan Turing, Alonzo Church, John von Neumann

6

Struktury danych i algorytmy

Ø  Algorytm – metoda, zestaw działań (instrukcji) potrzebnych do rozwiązania problemu

Ø  Program – implementacja algorytmu w jakimś języku programowania

Ø  Struktura danych – organizacja danych niezbędna dla rozwiązania problemu (metody dostępu etc.)

7

Ogólne spojrzenie

Cele algorytmiczne: - poprawność, - efektywność,

Cele implementacji: - zwięzłość - możliwość powtórnego wykorzystania

Wykorzystanie komputera:

Ø Projektowanie programów (algorytmy, struktury danych)

Ø Pisanie programów (kodowanie)

Ø Weryfikacja programów (testowanie)

8

Problemy algorytmiczne

Ilość instancji danych spełniających specyfikację wejścia może być nieskończona, np.: posortowana niemalejąco sekwencja liczb naturalnych, o skończonej długości:

§  1, 20, 908, 909, 100000, 1000000000. §  3, 44, 211, 222, 433. §  3. §  …

Specyfikacja wejścia

? Specyfikacja wyjścia, jako funkcji wejścia

9

Rozwiązanie problemu

–  Algorytm opisuje działania, które mają zostać przeprowadzone na danych

–  Może istnieć wiele algorytmów rozwiązujących ten sam problem

Instancja wejściowa (dane), odpowiadająca specyfikacji

algorytm Wyniki odpowiadające danym wejściowym

10

Definicja algorytmu

Ø  Algorytmem nazywamy skończoną sekwencję jednoznacznych instrukcji pozwalających na rozwiązanie problemu, tj. na uzyskanie pożądanego wyjścia dla każdego legalnego wejścia.

Ø  Własności algorytmów:

–  określoność

–  skończoność

–  poprawność

–  ogólność

–  dokładność

11

Przykład 1: poszukiwanie

Wejście: •  uporządkowany niemalejąco ciąg n (n >0) liczb •  liczba

a1, a2, a3,….,an; q j

Wyjście: •  indeks (pozycja) odnalezionej wartości lub NIL

2 5 6 10 11; 5 2

2 5 6 10 11; 9 NIL

12

Przykład 1: poszukiwanie liniowe

INPUT: A[1..n] – tablica liczb, q – liczba całkowita. OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q j←1 while j ≤ n and A[j] ≠ q do j++ if j ≤ n then return j else return NIL

Ø  Algorytm wykorzystuje metodę siłową (brute-force) – przegląda kolejno elementy tablicy.

Ø  Kod napisany jest w jednoznacznym pseudojęzyku (pseudokodzie). Ø  Wejście (INPUT) i wyjście (OUTPUT) zostały jasno określone.

13

Pseudokod

Ø  Zbliżony do Ady, C, Javy czy innego języka programowania:

–  struktury sterujące (if … then … else, pętle while i for)

–  przypisanie (←)

–  dostęp do elementów tablicy: A[i]

–  dla typów złożonych (record lub object) dostęp do pól: A.b

–  zmienna reprezentująca tablicę czy obiekt jest traktowana jak wskaźnik do tej struktury (podobnie, jak w C).

14

Warunki początkowe i końcowe (precondition, postcondition)

Ø  Ważne jest sprecyzowanie warunków początkowego i końcowego dla algorytmu:

–  INPUT: określenie jakie dane algorytm powinien dostać na wejściu

–  OUTPUT: określenie co algorytm powinien wyprodukować. Powinna zostać przewidziana obsługa specjalnych przypadków danych wejściowych

15

Sort

Przykład 2: sortowanie

Wejście ciąg n liczb

a1, a2, a3,….,an b1,b2,b3,….,bn

Wyjście Permutacja wejściowego ciągu

2 5 4 10 7 2 4 5 7 10

poprawność wyjścia: Dla każdego wejścia algorytm po zakończeniu działania powinien dać jako wynik b1, b2, …, bn takie, że:

•  b1 < b2 < b3 < …. < bn •  b1, b2, b3, …., bn jest permutacją a1, a2, a3,….,an

16

Sortowanie przez wstawianie (Insertion Sort)

A 1 n j

3 6 8 4 9 7 2 5 1

i

Strategia •  zaczynamy od pustego ciągu (“pustej ręki”) •  wkładamy kartę we właściwe miejsce wśród kart poprzednio już posortowanych •  kontynuujemy takie postępowanie aż wszystkie karty zostaną wstawione

INPUT: A[1..n] – tablica liczb całkowitych OUTPUT: permutacja A taka, że A[1]≤ A[2]≤ …≤A[n] for j←2 to n do key←A[j] // wstaw A[j] do posortowanej

// sekwencji A[1..j-1] i←j-1 while i>0 and A[i]>key do A[i+1]←A[i] i-- A[i+1]←key

17

Analiza algorytmów

Ø  Efektywność: –  Czas działania –  Wykorzystanie pamięci

Ø  Efektywność jako funkcja rozmiaru wejścia: –  Ilość danych wejściowych (liczb, punktów, itp.) –  Ilość bitów w danych wejściowych

18

Analiza sortowania przez wstawianie

for j←2 to n do key←A[j] //wstaw A[j] do posortowanej sekwencji A[1..j-1] i←j-1 while i>0 and A[i]>key do A[i+1]←A[i] i-- A[i+1]:=key

czas c1 c2 0 c3 c4 c5 c6 c7

ile razy n n-1 n-1 n-1 n-1

2

njjt

=∑2( 1)njjt

=−∑

2( 1)njjt

=−∑

Ø  Określany czas wykonania jako funkcję rozmiaru wejścia

19

Przypadki: najlepszy/najgorszy/średni

Ø  Najlepszy przypadek: elementy już są posortowane → tj=1, czas wykonania

liniowy (Cn).

Ø  Najgorszy przypadek: elementy posortowane nierosnąco (odwrotnie

posortowane) → tj=j, czas wykonania kwadratowy (Cn2)

Ø  Przypadek „średni” : tj=j/2, czas wykonania kwadratowy (Cn2)

20

Przypadki: najlepszy/najgorszy/średni

–  Dla ustalonego n czas wykonania dla poszczególnych instancji:

1n

2n

3n

4n

5n

6n

21

Przypadki: najlepszy/najgorszy/średni

–  Dla różnych n:

1n

2n

3n

4n

5n

6n

Rozmiar wejścia

Cza

s dzi

ałan

ia

1 2 3 4 5 6 7 8 9 10 11 12 …..

najlepszy przypadek

„średni” przypadek

najgorszy przypadek

22

Przypadki: najlepszy/najgorszy/średni

Ø  Analizę najgorszego przypadku stosuje się zwykle wtedy, kiedy czas działania

jest czynnikiem krytycznym (kontrola lotów, sterowanie podawaniem leków itp.)

Ø  Dla pewnych zadań „najgorsze” przypadki mogą występować dość często,

jednak w praktyce zwykle zdarza się to rzadko lub wręcz jest to nierealne.

Ø  Określenie przypadku „średniego” (analiza probabilistyczna) jest często bardzo

kłopotliwe

23

Różnice w podejściu?

Ø  Czy sortowanie przez wstawianie jest najlepszą strategią dla zadania sortowania?

Ø  Rozważmy alternatywną strategię opartą o zasadę „dziel i zwyciężaj”:

Sortowanie przez łączenie (MergeSort):

–  ciąg <4, 1, 3, 9> dzielimy na dwa podciągi

–  Sortujemy te podciągi: <4, 1> i <3, 9>

–  łączymy wyniki

•  Czas wykonania rzędu n log n

24

Analiza wyszukiwania liniowego

INPUT: A[1..n] – tablica liczb całkowitych, q – liczba całkowita OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q

j←1 while j ≤ n and A[j] ≠ q do j++ if j ≤ n then return j else return NIL

Najgorszy przypadek: C n Średni przypadek: C n/2

25

Poszukiwanie binarne

INPUT: A[1..n] – posortowana tablica liczb całkowitych, q – liczba całkowita. OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q left←1 right←n do

j←⎣(left+right)/2⎦ if A[j]=q then return j else if A[j]>q then right←j-1 else left=j+1

while left<=right return NIL

Pomysł: „dziel i zwyciężaj”

26

Poszukiwanie binarne - analiza

Ø  Ile razy wykonywana jest pętla:

–  Po każdym przebiegu różnica między left a right zmniejsza się o połowę

•  początkowo n

•  pętla kończy się kiedy różnica wynosi 1 lub 0

–  Ile razy trzeba połowić n żeby dostać 1?

–  lg n – lepiej niż poprzedni algorytm (n)

27

Porównanie czasów wykonania

Maksymalny rozmiar problemu (n)

1 sekunda 1 minuta 1 godzina

400n 2500 150000 9000000

20n log n 4096 166666 7826087

2n2 707 5477 42426

n4 31 88 244

2n 19 25 31