AiSD W01

33
Algorytmy i struktury danych Prowadzący: dr hab. inż. Kazimierz Worwa, prof. WAT e-mail: [email protected] r.a. 2006/2007 WOJSKOWA AKADEMIA TECHNICZNA Wydział Cybernetyki

Transcript of AiSD W01

Page 1: AiSD W01

Algorytmy i struktury danych

Prowadzący: dr hab. inż. Kazimierz Worwa, prof. WAT

e-mail: [email protected]

r.a. 2006/2007

WOJSKOWA AKADEMIA TECHNICZNAWydział Cybernetyki

Page 2: AiSD W01

2Algorytmy i struktury danych

ALGORYTMY I STRUKTURY DANYCH

RAZEM Wykłady Ćwiczenia Laboratoria 60 30x 10 20+

Page 3: AiSD W01

3Algorytmy i struktury danych

LITERATURA

1.   Aho A.V., Hopcroft J.E., Ullman J.D.: Algorytmy i struktury danych. Wydawnictwo Helion, Gliwice, 2003.

2.   Aho A.V., Hopcroft J.E., Ullman J.D.: Projektowanie i analiza algorytmów. Wydawnictwo Helion, Gliwice, 2003.

3.   Banachowski L., Diks K., Rytter W., Algorytmy i struktury danych. WNT, Warszawa, 2006.

4.   Cormen T.H., Leiserson C.E., Rivest R.L., Stein C.: Wprowadzenie do algorytmów. WNT, Warszawa, 2005.

5.   Drozdek A.: C++. Algorytmy i struktury danych. Wydawnictwo Helion, Gliwice, 2004.

6.   Kotowski P.: Algorytmy + struktury danych = abstrakcyjne typy danych. Wydawnictwo BTC, Warszawa, 2006.

7.   Loudon K.: Algorytmy w C.: Wydawnictwo Helion, Gliwice, 2003.8.   Wirth N.: Algorytmy + struktury danych = programy. WNT, Warszawa, 2004.9.   Wróblewski P.: Algorytmy, struktury danych i techniki programowania.

Wydawnictwo Helion, Gliwice, 2006.

Page 4: AiSD W01

4Algorytmy i struktury danych

Materiały do wykładów z przedmiotu AiSD

adres strony www zostanie podanie później

Page 5: AiSD W01

Algorytmy i struktury danych

Wykład 1 Pojęcia podstawowe.Złożoność obliczeniowa algorytmów (cz. 1).

Page 6: AiSD W01

6Algorytmy i struktury danych

Tematyka wykładu

Pojęcia podstawowe Klasyfikacja algorytmów Własności algorytmów Metody oceny algorytmów Pojęcie złożoności obliczeniowej algorytmów Złożoność asymptotyczna: O-notacja, -notacja, -notacja

Page 7: AiSD W01

7Algorytmy i struktury danych

Potoczne rozumienie pojęcia „algorytm”

Algorytmika jest dziedziną wiedzy zajmującą się badaniem algorytmów

Potocznie algorytm jest rozumiany jako pewien przepis na wykonanie zestawu czynności, prowadzących do osiągnięcia oczekiwanego i z góry określonego celu

Mówi się również, że algorytm jest pewną ściśle określoną procedurą obliczeniową, która dla zestawu właściwych danych wejściowych generuje określone dane wyjściowe

Dzisiejsze, uogólnione znaczenie słowa algorytm:

zbiór reguł postępowania, umożliwiających rozwiązanie określonego zadania w skończonej liczbie kroków i w skończonym czasie

Page 8: AiSD W01

8Algorytmy i struktury danych

Pochodzenie słowa „algorytm”

Słowo „algorytm” pochodzi od łacińskiego słowa „algorism”, rozumianego w średniowieczu jako sztuka rachowania na liczbach w systemie decymalnym

Słowo „algorism” zostało utworzone od nazwiska perskiego matematyka z 9-tego wieku n.e., Muhameda ibu-Musy al-Choresmi, twórcy systemu dziesiętnego

Page 9: AiSD W01

9Algorytmy i struktury danych

Pojęciowy model algorytmu

Algorytm może być rozumiany jako pewne odwzorowanie f, które dla określonego zestawu danych wejściowych We generuje określony zestaw danych wyjściowych Wy:

f: We Wy

Danewejściowe We

Danewyjściowe Wy

f

Page 10: AiSD W01

10Algorytmy i struktury danych

Pojęcie dziedziny algorytmicznej

Każdy algorytm działa na pewnym zbiorze obiektów (np. liczb) wraz z operacjami pierwotnymi, które można wykonywać na tych obiektach

Zbiór obiektów wraz z operacjami wykonywanymi na tych obiektach nazywamy dziedziną algorytmiczną

Przykłady dziedzin algorytmicznych: dziedzina algorytmiczna liczb całkowitych:

(C, +, -, *, div, mod, abs) dziedzina algorytmiczna rachunku logicznego:

(B, not, and, or, =>, <=>) dziedzina algorytmiczna dla języków programowania:

zbiór symboli alfanumerycznych oraz reguł syntaktycznych i semantycznych języka programowania

Page 11: AiSD W01

11Algorytmy i struktury danych

Sposoby zapisu algorytmów

Algorytm powinien precyzyjnie opisywać kolejne jego kroki.

Do przedstawienia algorytmu stosuje się:

opis werbalny,

zapis formalny, np.:

zapisy graficzne (schematy blokowe),

formalne specyfikacje programów (np.VDM)

zapisy w postaci pseudokodu (paraprogramu)

zapis algorytmu w dowolnym języku programowania

Page 12: AiSD W01

12Algorytmy i struktury danych

Język programowania

Język programowania jest środkiem umożliwiającym zapis algorytmów w postaci zrozumiałej dla człowieka, a równocześnie przetwarzalnej do postaci zrozumiałej dla komputera.

Zapis algorytmu w języku programowania jest traktowany jako zapis formalny. Program komputerowy może być uznawany za jeden z rodzajów modeli matematycznych.

Kod źródłowy programu (w języku programowania)

Kod wynikowy programu (w języku maszynowym)

Przetworzenieprogramu

źródłowegow kod

maszynowy

Page 13: AiSD W01

13Algorytmy i struktury danych

Klasyfikacja algorytmów

Rozważać będziemy następujące klasy algorytmów: algorytmy sekwencyjne - algorytmy równoległe; algorytmy numeryczne - algorytmy nienumeryczne; algorytmy rekurencyjne - algorytmy iteracyjne.

Page 14: AiSD W01

14Algorytmy i struktury danych

Przykład - pierwiastki równania kwadratowego

START

STOP

=b2-4ac

x1=(-b-sqrt())/2a

x2=(-b+sqrt())/2a

Wypisz x1, x2

START

STOP

=b2-4ac

x1=(-b-sqrt())/2a x2=(-b+sqrt())/2a

Wypisz x1, x2

Algorytm równoległy: Algorytm sekwencyjny:

0cbxax2

Page 15: AiSD W01

15Algorytmy i struktury danych

Wywołanie funkcji rekurencyjnej

Rekurencja oznacza wywołanie funkcji (procedury) przez tę samą funkcję (procedurę)

Niepożądana cecha definicji rekurencyjnych: aby wyznaczyć n-tą wartość trzeba najpierw wyznaczyć wszystkie „wcześniejsze” wartości

Ważne jest, aby kolejne wywołania funkcji (procedury) rekurencyjnej były realizowane dla kolejnych wartości parametrów formalnych w taki sposób, aby nie doszło do zjawiska „nieskończonej pętli rekurencyjnych wywołań funkcji”

Page 16: AiSD W01

16Algorytmy i struktury danych

Przykład obliczania n! dla n=5

Algorytm rekurencyjny: Algorytm iteracyjny

START

STOP

= 5 * 4!

= 4 * 3!

3 * 2!

2 * 1!

1

= 4 * 3!

= 3 * 2!

= 2 * 1!

= 1

START

STOP

Silnia = 1i=1

i5

Silnia = Silnia*ii=i+1

T

N

Page 17: AiSD W01

17Algorytmy i struktury danych

Stos programu w wywołaniach rekurencyjnych – przykład C/C++Adres powrotu do

systemu operacyjnego

Dno stosu programu

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

Adres powrotu z funkcji

Zwracana wartość

Parametry przez adres

Parametry przez wartość

Zmienne lokalne

funkcja main()

funkcja f1

funkcja f2

funkcja fN

Kolejne poziomy rekurencji wymagają odkładania na stosie programu kolejnych rekordów aktywacji funkcji

.

.

. Stos programu w wywołaniach rekurencyjnych jest bardziej eksploatowany niż wtedy, gdy wywołania nie są rekurencyjne

Page 18: AiSD W01

18Algorytmy i struktury danych

Przykłady funkcji rekurencyjnych

Funkcja „silnia”:

1 dla n=0 (warunek zakończenia rekurencji)

n!=

n*(n-1)! dla n>0

Definicja pewnego ciągu liczb wymiernych:

1 dla n=0 (warunek zakończenia rekurencji)

f(n)=

f(n-1) + 1/f(n-1), dla n>0,

określa ciąg o wartościach:

1, 2, 5/2, 29/10, 941/290, 969581/272890,.................

Page 19: AiSD W01

19Algorytmy i struktury danych

Funkcja rekurencyjna – ciąg Fibonacciego

Ciąg Fibonacciego jest wyliczany wg formuły:

n dla n<2

Fib(n)=

Fib(n-2) + Fib(n-1) dla n>=2

Rekurencyjna implementacja w języku C:long int Fib (int n)

{

if (n<2)

return n;

else

return Fib(n-2) + Fib (n-1);

}

Czy na pewno stos programu„wytrzyma” taką realizację

funkcjirekurencyjnej Fib?

Page 20: AiSD W01

20Algorytmy i struktury danych

Efektywność rekurencyjnego wykonania funkcji Fibonacciego (cd.)

Rekurencyjna implementacja funkcji Fibonacciego jest bardzo nieefektywna. Stos programu nie jest praktycznie w stanie zrealizować tego algorytmu już

dla liczb większych od 9. Oznacza to, że program ma zbyt dużą „złożoność pamięciową”.

F(6)

F(5)F(4)

F(2)

F(0) F(1)

F(3)

F(1) F(2)

F(3)

F(1) F(2)

F(4)

F(2) F(3)

F(0)

F(1)

F(0)

F(1)

F(0)

F(1)

F(1)

F(2)

F(0)

F(1)

0 1

0

1

1 0 1 0 1

0

1

1

1

Przykład: drzewo wywołań dla F(6):

Page 21: AiSD W01

21Algorytmy i struktury danych

Efektywność rekurencyjnego wykonania funkcji Fibonacciego

nLiczba

dodawańLiczba

wywołań

6 12 25

10 88 177

15 986 1 973

20 10 945 21 891

25 121 392 242 785

30 1 346 268 2 692 537

Page 22: AiSD W01

22Algorytmy i struktury danych

Iteracyjne wykonanie rekurencyjnej funkcji Fibonacciego

Bardziej efektywna jest iteracyjna implementacja funkcji Fibonacciego. Nie przepełniamy wtedy stosu programu i wykonujemy mniejszą liczbę przypisań wartości niż w implementacji rekurencyjnej

Przykład iteracyjnej implementacji funkcji Fibonacciego:

long int IteracyjnyFib(int n){ register int i=2, last=0, tmp; long int current =1; if (n<2) return n; else { for ( ; i<=n; i++) { tmp = current; current += last; last = tmp; } return current; }}

Page 23: AiSD W01

23Algorytmy i struktury danych

Efektywność iteracyjnego wykonania rekurencyjnej funkcji Fibonacciego

nLiczba przypisań w

algorytmie iteracyjnym

Liczba przypisań (wywołań) w algorytmie

rekurencyjnym

6 15 25

10 27 177

15 42 1 973

20 57 21 891

25 72 242 785

30 87 2 692 537

Page 24: AiSD W01

24Algorytmy i struktury danych

Pułapki rekurencji - przykład rekurencji bez końca

int StadDoWiecznosci(int n){ if (n==1) return 1; else if ((n%2)==0) // czy n jest parzyste? return StadDoWiecznosci(n-2)*n; else return StadDoWiecznosci(n-1)*n;}

Page 25: AiSD W01

25Algorytmy i struktury danych

Jak porównywać algorytmy?

Idealny algorytm to taki, który: ma czytelny i zrozumiały kod, jest napisany w ogólnie dostępnym języku programowania, jest efektywny obliczeniowo (szybko liczy, nie wymaga dużej pamięci), zawsze daje poprawne wyniki.

Page 26: AiSD W01

26Algorytmy i struktury danych

Jak porównywać algorytmy – przykładowe kryteria

prostota, czytelność kodu, długość kodu, poprawność, czas realizacji (obliczeń), zajętość pamięci.

Page 27: AiSD W01

27Algorytmy i struktury danych

Częściowa poprawność algorytmu

Specyfikacją algorytmu nazywamy parę warunków (własności):

Warunek początkowy Warunek końcowy

< wp , wk >

Algorytm A wykorzystujący strukturę danych S jest częściowo poprawny ze względu na specyfikację <wp, wk>, jeżeli dla wszystkich danych spełniających warunek początkowy i dla których algorytm zatrzyma się, uzyskane wyniki spełniają warunek końcowy.

wkwp A

Page 28: AiSD W01

28Algorytmy i struktury danych

Całkowita poprawność algorytmu

wkwp A

Mówimy, że algorytm A wykorzystujący strukturę danych S jest całkowicie poprawny ze względu na specyfikację <wp, wk> jeżeli dla wszystkich danych w strukturze S spełniających warunek początkowy wp, algorytm zatrzymuje się i daje wyniki spełniające warunek końcowy wk.

Page 29: AiSD W01

29Algorytmy i struktury danych

Złożoność obliczeniowa - miara służąca do porównywania efektywności algorytmów. Mamy dwa zasadnicze kryteria efektywności: czas i pamięć.

Do oceny efektywności stosujemy jednostki logiczne, wyrażającezwiązek miedzy rozmiarem danych n (np. wielkość pliku lub tablicy)a ilością czasu T potrzebną na ich przetworzenie.

Złożoność obliczeniowa algorytmów

Page 30: AiSD W01

30Algorytmy i struktury danych

Rodzaje złożoności obliczeniowej algorytmów

Złożoność pamięciowa - wyrażana w skali zajętości pamięci (PAO, pamięci zewnętrznej), niezbędnej dla realizacji algorytmu

Złożoność czasowa - wyrażana w skali czasu wykonania algorytmu (liczba kroków, czas rzeczywisty)

Na ogół (obecnie) złożoność czasowa jest ważniejsza od złożoności pamięciowej

Page 31: AiSD W01

31Algorytmy i struktury danych

Czynniki wpływające na czas wykonania programu

Rozmiar danych wejściowych algorytmu Jakość kodu wynikowego generowanego przez kompilator (język

kodu źródłowego) Architektura i szybkość komputera, na którym program jest

wykonywany Efektywność wykorzystanego algorytmu (jego złożoność czasowa)

Page 32: AiSD W01

32Algorytmy i struktury danych

Złożoność czasowa algorytmu

Do oszacowania czasu realizacji algorytmu nie powinno się używać zwykłych jednostek czasu

Zamiast tego powinny być stosowane jednostki logiczne, określające związek między rozmiarem danych wejściowych a czasem potrzebnym na ich przetworzenie

Czas wykonywania algorytmu, gdy rozmiar danych wejściowych wynosi n, będziemy oznaczać przez T(n)

Funkcje opisujące związek między T(n) a n mogą być bardzo złożone; w praktyce upraszczamy je, pozostawiając składowe mające największy wpływ na wartości czasu T(n)

Page 33: AiSD W01

33Algorytmy i struktury danych