AiSD W01
-
Upload
api-26356906 -
Category
Documents
-
view
623 -
download
6
Transcript of AiSD W01
![Page 1: AiSD W01](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/1.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/2.jpg)
2Algorytmy i struktury danych
ALGORYTMY I STRUKTURY DANYCH
RAZEM Wykłady Ćwiczenia Laboratoria 60 30x 10 20+
![Page 3: AiSD W01](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/3.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/4.jpg)
4Algorytmy i struktury danych
Materiały do wykładów z przedmiotu AiSD
adres strony www zostanie podanie później
![Page 5: AiSD W01](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/5.jpg)
Algorytmy i struktury danych
Wykład 1 Pojęcia podstawowe.Złożoność obliczeniowa algorytmów (cz. 1).
![Page 6: AiSD W01](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/6.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/7.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/8.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/9.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/10.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/11.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/12.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/13.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/14.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/15.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/16.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/17.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/18.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/19.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/20.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/21.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/22.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/23.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/24.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/25.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/26.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/27.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/28.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/29.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/30.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/31.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/32.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022050906/5571f21d49795947648c3061/html5/thumbnails/33.jpg)
33Algorytmy i struktury danych