AiSD W01

Post on 07-Jun-2015

623 views 6 download

Transcript of AiSD W01

Algorytmy i struktury danych

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

e-mail: kworwa@wat.edu.pl

r.a. 2006/2007

WOJSKOWA AKADEMIA TECHNICZNAWydział Cybernetyki

2Algorytmy i struktury danych

ALGORYTMY I STRUKTURY DANYCH

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

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.

4Algorytmy i struktury danych

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

adres strony www zostanie podanie później

Algorytmy i struktury danych

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

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

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

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

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

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

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

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

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.

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

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”

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

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

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,.................

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?

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):

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

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; }}

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

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;}

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.

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.

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

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.

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

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

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)

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)

33Algorytmy i struktury danych