AiSD W01
-
Upload
api-26356906 -
Category
Documents
-
view
623 -
download
6
Transcript of 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
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