Informatyka II wykłady 1 i 2 Algorytmy

Transkrypt

Informatyka II wykłady 1 i 2 Algorytmy
Katedra Elektrotechniki Teoretycznej i
Informatyki
sem. II - Elementy algorytmów
Dr hab. inż. M. Czyżak
REGULAMIN zaliczeń i wystawiania ocen z przedmiotu
Informatyka II
realizowanych w Katedrze Elektrotechniki Teoretycznej i Informatyki
na studiach stacjonarnych I stopnia na kierunku Elektrotechnika w
sem. III, 2016/2017
1. Obecność studentów na wykładach i laboratorium jest
obowiązkowa.
2. Na wykładzie i laboratorium obecność jest kontrolowana. W
przypadku stwierdzenia 3 – krotnej nieusprawiedliwionej nieobecności
na laboratorium, student jest skreślany z listy uczestniczących w
laboratorium i nie jest klasyfikowany.
3. Podczas semestru 2– krotnie przeprowadzane jest kolokwium na
laboratorium (90 min) – zgodnie z podanym harmonogramem
laboratorium.
4.
W przypadku usprawiedliwionej nieobecności na kolokwium,
potwierdzonej zwolnieniem lekarskim, student jest zobowiązany w terminie 2
tygodni od daty zakończenia zwolnienia odrobić kolokwium w godzinach
konsultacji. W przypadku nieobecności nieusprawiedliwionej lub nie
odrobienia w podanym terminie usprawiedliwionej nieobecności na
kolokwium, student otrzymuje 0 punktów z kolokwium.
5. Zaliczenie laboratorium następuje w oparciu o ilość punktów uzyskanych
przez studenta. Podział punktów dla laboratorium na poszczególne elementy
jest następujący:
-– kolokwia
60 pkt ( 2 x 30 pkt)
-– wejściówki
20 pkt
-– zadania domowe
20 pkt
Zaliczenie laboratorium wymaga 60 pkt, konieczne jest też uzyskanie
przynajmniej 30 pkt łącznie z kolokwiów. Zadania domowe należy oddać w
terminie dwóch tygodni. Prowadzący zajęcia laboratoryjne wystawia oceny
punktowe.
6. Zaliczenie części wykładowej następuje w oparciu o kolokwium
organizowane na koniec semestru, prace domowe oraz obecność na
wykładzie (80 pkt kolokwium, 20 pkt prace domowe). Student może
dodatkowo uzyskać 10 pkt za zadania wykonywane na wykładzie (1
pkt za jedno zadanie, w przypadku niepoprawnego wykonania
zadania 0.5 pkt). Zaliczenie części wykładowej wymaga uzyskania
60 pkt w tym przynajmniej 41 pkt z kolokwium wykładowego)
7. Na zakończenie zajęć w semestrze oblicza się końcową punktową
ocenę każdego studenta, wg wzoru:
Z  0.66 * L  0.34 *W
gdzie: L – ocena punktowa uzyskana z części laboratoryjnej, W –
ocena punktowa uzyskana z części wykładowej.
8. Ocenę końcową wystawia
przedstawionych w tabeli:
się
wg
progów
punktowych
Progi punktowe
Ocena
poniżej 60
niedostateczna
60 - 66
dostateczna
67 - 73
dość dobra
74 - 80
dobra
81 - 87
ponad dobra
powyżej 88
bardzo dobra
9. Prowadzący laboratorium organizuje dodatkowe
kolokwium
zaliczające laboratorium bezpośrednio przed sesją podstawową oraz
kolokwium zaliczające w sesji poprawkowej. W wyniku każdego z tych
kolokwiów student może otrzymać połowę maksymalnej ilości punktów
z kolokwiów czyli 30 pkt.
10. Dla studentów, którzy nie uzyskali wymaganego minimum punktów
z kolokwium zaliczającego wykład, organizowane jest kolokwium
poprawkowe z części wykładowej w sesji poprawkowej.
11. W wyniku kolokwium poprawkowego z części wykładowej można
uzyskać tylko połowę maksymalnej liczby punktów, czyli 40 pkt.
12. Obliczanie ocen po sesji poprawkowej odbywa się z
uwzględnieniem wyniku kolokwium poprawkowego oraz pozostałych
elementów składających się na część laboratoryjną i wykładową.
Algorytmy
Algorytm jest jednym z zasadniczych pojęć w
informatyce. Dział nauki zajmujący się algorytmami jest
określany jako "Teoria algorytmów", "Analiza
algorytmów" czy też "Algorytmika".
Algorytm ( nieformalne określenie)
1. Algorytm jest przepisem określającym krok po kroku
rozwiązanie jakiegoś problemu lub też osiągnięcie
pewnego celu.
Algorytmy
2. Algorytm jest pewną ściśle określoną procedurą
obliczeniową, która dla właściwych danych wejściowych,
wytwarza dane wyjściowe zwane wynikiem działania
algorytmu.
Algorytm można też traktować jako sposób
rozwiązania konkretnego problemu obliczeniowego.
Postawienie takiego problemu polega na ustaleniu wymagań,
co do relacji między danymi wejściowymi algorytmu, a
danymi wyjściowymi, a algorytm opisuje procedurę
obliczeniową, która zapewni, że relacja ta będzie osiągnięta.
Algorytmy
Problemy, które można rozpatrywać w aspekcie ich
rozwiązywania z użyciem algorytmów, można podzielić na
następujące grupy:
a) problemy niealgorytmiczne - wykazano, że nie mogą być
rozwiązane za pomocą algorytmów w skończonym czasie
Przykład 1. Pokrywanie powierzchni wielokątami o
dowolnym kształcie. Wykazano, że to zadanie jest
obliczeniowo nierozwiązywalne.
Przykład 2. Rozwiązywanie równań diofantycznych
xn  yn  z n
Dla n=2 nieskończenie wiele rozwiązań w liczbach całkowitych,
brak rozwiązań dla n>2.
Algorytmy
b) problemy przypuszczalnie niealgorytmiczne zadania dla których nie udało się znaleźć algorytmu o
skończonym czasie działania, ale też nie udowodniono, że
taki algorytm nie istnieje (nie mogą być rozwiązane za
pomocą algorytmów w skończonym czasie)
c) problemy wykładnicze - nie mają algorytmów
ograniczonych przez wielomian zmiennej problemu
( np. n!)
Algorytmy
d) problemy przypuszczalnie wykładnicze - nie udało się
podać algorytmu wielomianowego, ale też nie udowodniono
że nie ma takiego algorytmu.
d) problemy wielomianowe - dla problemów tych istnieją
algorytmy rozwiązujące je w czasie ograniczonym
wielomianem zmiennej problemu.
Kubale, M. Łagodne wprowadzenie do analizy algorytmów,
Wyd. PG, 1999.
Algorytmy
Słowo algorytm pochodzi od nazwiska matematyka
arabskiego żyjącego w IX wieku Abu Ja'far Mohammed ibn
Müsâ al Khowârizmî ( al Khorezmi, (ar.) z Chorezmu) ,
nazwisko jego pisano w Europie jako Algorismus.
Podał on w IX wieku reguły dodawania, odejmowania,
mnożenia i dzielenia liczb dziesiętnych znane wcześniej w
Indiach i Chinach.
Algorytmy
Jednak za autora pierwszego algorytmu uważa się greckiego
matematyka Euklidesa ( 365 p.n.e- 300 p.n.e), stworzył on
słynny przepis na obliczanie największego wspólnego
dzielnika dwóch liczb całkowitych a i b ( NWD, gcd - ang.
greatest common divisor)
Algorytmy
Algorytm Euklidesa - obliczanie gcd (a,b)
gcd(a,0)=0
Dopóki b>0 wykonuj
1. c=a modulo b
2. a=b
3. b=c
4. gcd=a
Operacja = oznacza, podobnie jak w języku C,
podstawienie do zmiennej po lewej stronie, wartości
wyrażenia po prawej stronie.
Algorytmy
Przykład. Zastosowanie algorytmu Euklidesa dla a=30, b=21.
I.
II.
III.
1. c=9
1. c=3
1. c=0
2. a=21
2. a=9
2. a=3
3. b=9
3. b=3
3. b=0
4. gcd=21
4. gcd=9
4. gcd=3
b>0
b=0, stop
b>0
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.1
1. Opis słowny
2. Opis w postaci listy kolejnych kroków
3. Opis w języku programowania ( Pascal, C/C++)
4. Opis w postaci schematu blokowego
Przykład. Opis słowny
Cel działania algorytmu: algorytm sprawdza czy dana liczba
naturalna N jest liczbą pierwszą.
Realizacja algorytmu (algorytm): algorytm oblicza całkowitą
resztę z dzielenia N przez kolejne liczby nieparzyste
mniejsze lub równe  N  . Jeśli jakaś reszta jest równa
zeru, algorytm przerywa działanie.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.2
2. Opis w postaci listy kolejnych kroków
Przykład. Zapis algorytmu Euklidesa w postaci listy kroków.
Dane: Liczby całkowite a i b.
Wynik: Największy wspólny dzielnik a i b, gcd(a,b).
1. Wczytaj a.
2. Wczytaj b.
3. Jeśli b=0, idź do kroku 10.
4. Oblicz c=a modulo b.
5. Wykonaj a=b.
6. Wykonaj b=c.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.3
Przykład. Zapis algorytmu Euklidesa w postaci listy kroków
( cz. II).
7. Wykonaj gcd=a.
8. Jeśli b=0, idź do kroku 4.
9. Idź do kroku 11.
10. gcd=0.
11. Drukuj a, b, gcd.
12. STOP .
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.4
Przykład. Zapis algorytmu Euklidesa w postaci programu
int main() {
int a=30,b=21,c,gcd;
do {
c=a%b;
a=b;
b=c;
gcd=a;
} while ( b>0);
printf("\n a=%d b=%d gcd=%d ",a,b,gcd); }
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.5
Sieci działań ( schematy blokowe)
Autorem tej koncepcji jest John von Neumann.
Zaproponował on w latach 50-tych formalizację algorytmów
przy użyciu sieci działań. Sieci działań są geometrycznym
sposobem zapisu algorytmów.
Podstawą tej koncepcji jest podzielenie procesu
rozwiązania na odrębne etapy, które w sieci działań
przedstawia się w postaci bloków. Bloki są prostymi
figurami geometrycznymi.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.6
Sieci działań ( schematy blokowe)
Wewnątrz bloków umieszcza się rodzaj czynności, którą
symbolizuje dany blok. Bloki łączy się liniami, które ukazują
ich powiązania logiczne, a strzałki wskazują na kolejność
wykonywania poszczególnych w algorytmie.
Algorytm przedstawiony w postaci sieci działań jest
niezależny od języka programowania, w którym będzie
napisany program.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.7
Sieci działań ( schematy blokowe)
Sieci działań mogą być pisane na różnym poziomie
szczegółowości, lecz zwykle przyjmuje się, że każdy blok
odpowiada jednej instrukcji programu realizującej pewne
obliczenie lub instrukcji, która umożliwia podjęcie decyzji w
algorytmie odnośnie dalszej jego realizacji.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.8
Sieci działań ( schematy blokowe)
Wewnątrz bloków sieci działań można stosować
następujące symbole:
,
- litery alfabetu łacińskiego i greckiego
- cyfry systemu dziesiętnego
- symbole działań arytmetycznych
- dodawanie +
- odejmowanie -
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.9
Sieci działań ( schematy blokowe)

- symbole działań arytmetycznych (c.d.)
- mnożenie
lub
- dzielenie /
- dzielenie całkowite
- potęgowanie
- pierwiastkowanie


Algorytmy
Sposoby opisu (zapisu algorytmów) cz.10
Sieci działań ( schematy blokowe)
- symbole działań logicznych
- negacja ~
- koniunkcja
- alternatywa


Algorytmy
Sposoby opisu (zapisu algorytmów) cz.11
Sieci działań ( schematy blokowe)
- symbole relacji
, , , , , 
- symbol podstawienia

,:=
- znaki interpunkcyjne
Wewnątrz bloków sieci działań można ponadto
stosować liczby całkowite, rzeczywiste, zespolone jednak
o wielkości odpowiadającej wielkości typów dla
komputera, na którym będzie realizowany algorytm.
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.12
Sieci działań ( schematy blokowe)
- stałe logiczne
- stałe tekstowe
- zmienne i wskaźniki do zmiennych (użycie zmiennej
wskazuje, że będzie istniała komórka pamięci, o
nazwie takiej, jak nazwa zmiennej)
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.13
Sieci działań ( schematy blokowe)
- wyrażenia arytmetyczne i logiczne
- funkcje ( wykładnicze, logarytmiczne,
trygonometryczne, cyklometryczne, hiperboliczne i
odwrotne do nich)
- wartość bezwzględna
- część całkowita

Algorytmy
Sposoby opisu (zapisu algorytmów) cz.14
Sieci działań ( schematy blokowe)
Symbole geometryczne
- początek algorytmu
START
- koniec algorytmu
STOP
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.15
Sieci działań ( schematy blokowe)
Operator - działanie
(operacja do wykonania)
Operator wejścia/wyjścia
wprowadzanie lub wyprowadzanie
danych
Operator - element
decyzyjny- wybór jednej z
dróg działania
Algorytmy
Sposoby opisu (zapisu algorytmów) cz.16
Sieci działań ( schematy blokowe)
Łącznik - łączy dwie części
algorytmu
Linia - łącząca poszczególne
symbole sieci działań
Algorytmy
Struktura algorytmów (cz.1)
Opis algorytmu w postaci sieci działań wymaga
zwykle niewielu podstawowych elementów takich jak
- sekwencja operacji
- przełącznik
- pętla
Algorytmy
Struktura algorytmów (cz.2)
Sekwencja operacji
Sekwencja operacji stanowi zbiór operacji
realizowanych w określonej kolejności na określonych
danych.
Przykład. Realizacja obliczenia
y  (c  (a  b) )  d
2
Algorytmy
Struktura algorytmów (cz.3)
dane
a,b,c,d
wyznacz
a+b
wyznacz
(a+b)2
wyznacz
c+(a+b)2
wyznacz
(c+(a+b)2)d
dane
a,b,c,d
y <- a+b
y <-y*y
y <-y+c
y <-y*c
Algorytmy
Struktura algorytmów (cz.4)
Przełącznik
Przełącznik jest elementem sprawdzającym
spełnienie określonego warunku i wybierającego jedną z
dwóch alternatywnych sekwencji operacji w zależności od
tego czy warunek jest spełniony czy też nie.
Przykład.
TAK
Sekwencja 1
a>0
NIE
Sekwencja 2
Algorytmy
Struktura algorytmów (cz.4)
Pętla
Pętla jest elementem umożliwiającą kolejną, wielokrotną
realizację określonej operacji lub sekwencji operacji.
Algorytmy
Ogólna struktura pętli
Część inicjacyjna
Część główna
Część
aktualizująca
warunek
Część decyzyjna
Część wyjściowa
Algorytmy
Przykład. Sieć działań dla obliczania sumy (cz. 1)
n 1
1
S 
i 1 i
Algorytmy
Przykład. Sieć działań dla obliczania sumy (cz. 2)
START
s<-0
s<-s+1/i
i<-i+1
TAK
i<n
NIE
Drukuj s
STOP
Algorytmy
Nauka o algorytmach to teoria algorytmów zwana też
analizą algorytmów. Zajmuje się ona szukaniem
najlepszych algorytmów dla rozwiązywania określonych
zadań na komputerach, badaniem możliwości rozwiązania
pewnych zadań jak również określaniem złożoności
rozwiązań, o ile one istnieją.
Algorytmy
Przykłady algorytmów (1)
I. Algorytmy numeryczne
1. Interpolacja Lagrange’a.
2. Interpolacja Aitkena-Lagrange’a.
3. Aproksymacja wielomianowa.
4. Aproksymacja trygonometryczna.
5. Kwadratura Newtona-Cotesa.
6. Metoda całkowania Romberga.
7. Metoda rozwiązywania równań nieliniowych (bisekcja,
metoda siecznych, metoda Newtona).
Algorytmy
Przykłady algorytmów (2)
8. Rozwiązywanie układu równań z macierzą trójkątną.
9. Metoda eliminacji Gaussa.
10. Rozkład LU.
11. Metoda Gaussa-Crouta.
12. Metoda eliminacji Jordana.
13. Obliczanie wyznacznika metodą rozkładu LU.
14. Odwracanie macierzy przy użyciu rozkładu LU.
15. Metoda Jacobiego rozwiązywania układu równań
liniowych.
Algorytmy
Przykłady algorytmów (3)
16. Metoda Gaussa-Seidela.
17. Rozkład QR macierzy metodą Grama-Schmidta.
18. Rozkład QR macierzy metodą Givensa.
19. Schemat Hornera obliczania wartości wielomianu.
20. Metoda relaksacyjna rozwiązywania układu równań
liniowych.
21. Metoda Eulera rozwiązywania równań różniczkowych
zwyczajnych.
22. Metoda Runge-Kutty rozwiązywania równań
różniczkowych zwyczajnych.
23. Szybka transformacja Fouriera.
Algorytmy
Przykłady algorytmów (4)
II. Algorytmy przeszukiwania zbiorów danych
1. Przeszukiwanie binarne.
2. Przeszukiwanie z funkcją mieszającą.
III.Algorytmy przeszukiwania tekstów.
1. Algorytm typu brute-force.
2. Algorytm K-M-P (Knutha, Morrisa, Pratta).
3. Algorytm Boyera-Moore’a.
4. Algorytm Rabina-Karpa.
Algorytmy
Przykłady algorytmów (5)
IV. Algorytmy grafowe
1. Algorytm Floyda-Warshalla ( domknięcie przechodnie
grafu, algorytm pozwala stwierdzić, czy istnieje droga
między dwoma wierzchołkami grafu).
2. Algorytm Dijkstry (poszukiwanie najkrótszej drogi w
grafie).
3. Algorytmy przeszukiwania grafów ( wszerz, w głąb)
V. Algorytmy kompresji danych
1. Kompresja przez modelowanie matematyczne.
2. Kompresja metodą RLE.
3. Kompresja danych metodą Huffmana.
4. Kompresja LZW.
Algorytmy
Przykłady algorytmów (6)
VI. Algorytmy szyfrowania
1. Algorytm wymiany klucza Diffiego-Hellmana.
2. Algorytm RSA
3.Algorytm Rijndael.
VII. Algorytmy teorioliczbowe (przykłady)
1. Obliczanie iloczynu Mongomery’ego
2. Potęgowanie modulo n (n nieparzyste) z użyciem
iloczynu Mongomery’ego.
3. Chińskie twierdzenie o resztach.
Algorytmy
Przykłady algorytmów (7)
VIII. Algorytmy sortowania.
1. Sortowanie przez zamianę ( ang. exchange sort)
( przykład: sortowanie przez prostą zamianę).
2. Sortowanie przez wybieranie (ang. selection sort)
(przykład sortowanie przez proste wybieranie)
3. Sortowanie przez proste wstawianie.
4. Sortowanie szybkie (ang. quicksort).
5. Sortowanie przez kopcowanie (ang. heapsort).
6. Sortowanie przez scalanie( ang. mergesort).
Algorytmy
Sortowanie
Sortowanie jest procesem ustawiania zbioru
obiektów w określonym porządku.
Sortowanie stosuje się w celu ułatwienia
późniejszego wyszukiwania elementów sortowanego
zbioru. Problem sortowania można sformułować
następująco:
Dane są obiekty
a1 , a2 ,..., an
Algorytmy
Sortowanie (niemalejąco) polega na przestawianiu
tych obiektów aż do chwili osiągnięcia uporządkowania
ak1 , ak 2 ,..., ak3
takiego, że dla danej funkcji porządkującej f zachodzi
związek:
f (ak1 )  f (ak 2 )  ...  f (ak3 )
Algorytmy
Zwykle nie oblicza się wartości funkcji porządkującej,
lecz przechowuje się je w jawnej postaci jako składowe
każdego obiektu. Wartość tej funkcji nazywana jest kluczem
obiektu. Dla tablic kluczem obiektu jest wartość elementu.
Algorytmy
Przykłady algorytmów (5)
IV. Algorytmy sortowania.
1. Sortowanie przez zamianę ( ang. exchange sort)
( przykład: sortowanie przez prostą zamianę).
2. Sortowanie przez wybieranie (ang. selection sort)
( przykład sortowanie przez proste wybieranie)
3. Sortowanie przez proste wstawianie.
4. Sortowanie szybkie (ang. quicksort).
5. Sortowanie przez kopcowanie (ang. heapsort)
6. Sortowanie przez scalanie ( ang. merge sort)
Algorytmy
Sortowanie przez prostą zamianę ( sortowanie bąbelkowe)
Metoda ta polega na porównywaniu w kolejnych
przebiegach kluczy kolejnych sąsiadujących elementów (dla
tablic wartości elementów tablicy) i ewentualnej zamianie
miejscami tych elementów, jeżeli nie spełniają zadanej relacji.
Po zakończeniu danego przebiegu następuje sprawdzenie
czy nastąpiły w nim zamiany. Jeśli tak, realizowany jest
kolejny przebieg, jeśli nie, to sortowanie zostało zakończone.
Algorytmy
Sortowanie przez prostą zamianę (sortowanie bąbelkowe)
Przykład. Posortować niemalejąco tablicę 5-elementową zawierającą
elementy 8,6,10,2,1. Pokazane zostaną poniżej stany tablicy w kolejnych
przebiegach.
I. przebieg
8,6,10,2,1
6,8,10,2,1
6,8,10,2,1
6,8,2,10,1
6,8,2,1,10
II. przebieg
6,8,2,1,10
6,8,2,1,10
6,2,8,1,10
6,2,1,8,10
6,2,1,8,10
III. przebieg IV. przebieg V. przebieg
6,2,1,8,10
2,1,6,8,10
1,2,6,8,10
2,6,1,8,10
1,2,6,8,10
1,2,6,8,10
2,1,6,8,10
1,2,6,8,10
1,2,6,8,10
2,1,6,8,10
1,2,6,8,10
1,2,6,8,10
2,1,6,8,10
1,2,6,8,10
1,2,6,8,10
Algorytmy
Sortowanie przez prostą zamianę (bąbelkowe)
#define N 5 // sortowanie niemalejąco
#include <stdio.h>
#include <conio.h>
int main(int argc, char **argv)
{ int i, nr=1,p, zam;
int a[5]={8,6,10,2,1};
do
{ zam=0;
printf("\n przebieg nr=%d",nr++);
for (i=0;i<N -1;i++)
if (a[i+1]<a[i]) {
p=a[i];
a[i]=a[i+1];
a[i+1]=p;
zam=1; }
}
while (zam);
printf("\n Stan tablicy po sortowaniu");
for (i=0;i<N;i++) printf("\n % d ",a[i]);
getchar(); return 0;}
Algorytmy
Sortowanie przez proste wybieranie
Metodę tę można opisać następująco:( sortowanie
niemalejąco)
- wybrać element o najmniejszym kluczu ( dla
tablic element o najmniejszej wartości)
- wymienić go z pierwszym elementem.
Operacje te powtarza się z pozostałymi n-1
obiektami, następnie z n-2 obiektami, aż
pozostanie jeden obiekt - największy.
Algorytmy
Przykład. Posortować niemalejąco przy użyciu algorytmu prostego
wybierania tablicę 5- elementową przy użyciu zawierającą elementy
8,6,10,2,1. Pokazane zostaną poniżej kolejne stany tablicy w trakcie
sortowania.
8
6
10
2
1
1
6
10
2
8
1
6
10
2
8
1
2
10
6
8
1
2
10
6
8
zamieniane elementy 10 i 6
1
2
10
6
8
stan po trzeciej zamianie
1
2
6
10
8
1
2
6
8
10
zamieniane elementy 8 i 1
stan po pierwszej zamianie
zamieniane elementy 6 i 2
stan po drugiej zamianie
zamieniane elementy 8 i 10
tablica posortowana
Algorytmy
// Sortowanie przez proste wybieranie
#define N 5
#include <stdio.h>
#include <conio.h>
int main(int argc, char **argv)
{ int i,j,k,p,amin; int a[5]={8,6,10,2,1};
for (i=0;i<N;i++)
{ amin=a[i];
k=i;
for (j=i+1;j<N-1;j++)
if (a[j]<amin)
{ amin=a[j];
k=j; }
if (k!=i)
{ p=a[i];
a[i]=a[k];
a[k]=p;
}
}
printf("\n Stan tablicy po sortowaniu");
for (i=0;i<N;i++) printf("\n % d ",a[i]); getchar(); return 0;}
Algorytmy
Podstawowe własności algorytmów
a) własność stopu
b) poprawność
Def. (poprawność algorytmu)
Algorytm jest poprawny, gdy dla każdego egzemplarza
problemu zatrzymuje się i daje poprawny wynik.
c) stabilność numeryczna
d) złożoność obliczeniowa
Algorytmy
Elementy analizy algorytmów
Analiza algorytmu (analiza złożoności obliczeniowej)
polega na określeniu zasobów, jakie są potrzebne do jego
wykonania.
Zasobami zasadniczymi są czas obliczeń i wielkość
potrzebnej pamięci.
Obecnie ważniejszym parametrem jest czas obliczeń.
Zwykle rozpatruje się przypadek pesymistyczny dla czasu
działania algorytmu.
Algorytmy
Pesymistyczny czas działania jest górną granicą
możliwego czasu działania algorytmu dla każdych danych
wejściowych. Znając ten czas, mamy gwarancję, że
algorytm nie będzie działał dłużej (taki czas może często
występować w praktyce, np. przy poszukiwaniu w bazie
danych informacji, której tam nie ma) .
Algorytmy
Czas działania algorytmu może być opisany pewną
funkcją np.
t = f(n)=an2+bn +c,
gdzie n reprezentuje rozmiar danych wejściowych. Można
zauważyć, że dla dużych n znaczenie ma głównie pierwszy
składnik. Przyjmując przykładowo a=1, b=1, c=1
n
an2
bn
c
t
10
100
10
1
111
100
10000
100
1
10111
1000
1000000
1000
1
1001001
Algorytmy
Pojawia się tutaj pojęcie rzędu wielkości funkcji.
Rząd wielkości funkcji określa jak zmienia się składnik
najbardziej istotny. Uważa się, że dany algorytm jest lepszy,
jeśli jego pesymistyczny czas działania jest funkcją niższego
rzędu.
Algorytmy
Przykład. Dla funkcji f(n) i czasu z poniższej tabeli wyznaczyć
największy rozmiar problemu, który może być rozwiązany w czasie
t, zakładając, że algorytm działa w ciągu f(n) mikrosekund.
f(n)
n
log n
1 sek
n
n
1 min
1 dzień
1 miesiąc
n log n
n2
n3
2n
n!
Algorytmy
Notacje asymptotyczne (1)
Symbol 
Niech g:R*  R* będzie funkcją rzeczywistą zmiennej n . Mówimy, że funkcja
jest  (g(n)), gdy istnieją stałe c1,,c2  R* i x0  R* takie, że
c1 g(n)  f(n))  c2 g(n) dla wszystkich n  n0. Mówimy wówczas,że
funkcje są tego samego rzędu.
(log n) - logarytmiczna
(n) - liniowa
c1g(n)
(n log n) logarytmiczno-liniowa
f(n)
c2g(n)
(n2) - kwadratowa
(2n) - wykładnicza
n0
n
Algorytmy
Notacje asymptotyczne (2)
Symbol O(·)
Niech g:R*  R* będzie funkcją rzeczywistą zmiennej n . Przez O(g)
oznaczymy zbiór funkcji f:R*  R*, takich, że dla pewnego c  R*
i x0  R* mamy f(n))  c g(n) dla wszystkich n  n0. } Symbol O(g)
czytamy " O duże od n", zaś o funkcji f mówimy, "że jest duże O od g"
c1g(n)
f(n)
n
Algorytmy
Rząd złożoności obliczeniowej
Klasa funkcji
subliniowa
wielomianowa
niewielomianowa
Typ funkcji
Przykłady
stała
(e-nsin2n), (1/n)
polilogarytmiczna
(log log n), (log2n)
liniowa
(n),(n(1+n)n)
quasi-liniowa
(n log n),(n loglog n)
kwadratowa
(n2), (n/2)
superwielomianowa
(nlog n),()
wykładnicza
(2n), (n23n)
superwykładnicza
( 2 ),(nn)
n n
Algorytmy
Złożoność obliczeniowa a programowanie algorytmów
Generalnie powinno się stosować algorytmy o możliwie
najmniejszej złożoności obliczeniowej, lecz w praktyce powinno się też
uwzględnić dodatkowe czynniki:
1. Gdy program będzie używany niewiele razy, to koszt napisania i
uruchomienia programu jest większy od pozostałych kosztów.
2. Jeśli program będzie wykonywany na małych danych, istotna jest
wielkość stałej proporcjonalności c.
3. Program nie powinien być skomplikowany ( o ile to możliwe), gdyż
utrudnia to wprowadzanie zmian
4. Istnieją algorytmy o dużej złożoności dla najgorszego przypadku, a
działające szybko dla przypadku przeciętnego.
5. Dla algorytmów działających na liczbach rzeczywistych są ważne
dokładność, a także wrażliwość numeryczna.
Żródło Kubale M. Łagodne wprowadzenie do algorytmów.