prawdziwe układanie

Transkrypt

prawdziwe układanie
Zaawansowane algorytmy
Wojciech Horzelski
1
Organizacja
Wykład: poniedziałek 815-10 – Aula
Ćwiczenia: …
Każdy student musi realizować projekty (treść podawana na wykładzie) :
– Ilość projektów : 5-7
– Na realizację każdego projektu studenci będą mieli 2 tygodnie
– Ocena projektów: od 0 do 10 punktów (0 –brak projektu, 7 – projekt poprawnie
wykonany, bez zastrzeżeń, 10 – wybitne rozwiązanie)
– Oddanie projektu tydzień po terminie powoduje utratę 2 punktów (później nie będzie
już oceniany)
Zaliczenie ćwiczeń:
– Minimalna ilość punktów na zaliczenie: (ilość projektów-1) * 5+2
– Dokładna punktacja dla poszczególnych ocen – później (zależna od ilości projektów)
Egzamin – pisemny ( termin „zerowy” - ?)
2
Tematyka wykładu
Wprowadzenie (przypomnienie podstaw)
Drzewa binarne i drzewa BST
Drzewa AVL i 2-3-4
Drzewa zbalansowane (czerwono-czarne)
Tablice z haszowaniem
Kompresja danych
Wyszukiwanie wzorca w tekście
Algorytmy grafowe:
– Przeszukiwanie (wszerz i w głąb)
– Drzewo rozpinające
– Znajdowanie najlepszej drogi
– Znajdowanie najkrótszych ścieżek pomiędzy wszystkimi wierzchołkami
NP - zupełność
3
Literatura
T. Cormen, Ch. Lieserson, R. Rivest, Wprowadzenie do Algorytmów, WNT, 1997
R. Sedgewick, Algorytmy w C++, RM, 1999
R. Sedgewick, P. Rzechonek, Algorytmy w C++. Grafy , RM, 2003
4
O co w tym wszystkim chodzi?
Rozwiązywanie problemów:
– Układanie planu zajęć
– Balansowanie własnego budżet
– Symulacja lotu samolotem
– Prognoza pogody
Dla rozwiązania problemów potrzebujemy procedur, recept, przepisów –
inaczej mówiąc algorytmów
5
Historia
Nazwa pochodzi od perskiego matematyka Muhammeda ibn Musa
Alchwarizmiego (w łacińskiej wersji Algorismus) – IX w n.e.
Pierwszy dobrze opisany algorytm – algorytm Euklidesa znajdowania
największego wspólnego podzielnika, 400-300 p.n.e.
XIX w. – Charles Babbage, Ada Lovelace.
XX w. – Alan Turing, Alonzo Church, John von Neumann
6
Struktury danych i algorytmy
Algorytm – metoda, zestaw działań (instrukcji) potrzebnych do
rozwiązania problemu
Program – implementacja algorytmu w jakimś języku programowania
Struktura danych – organizacja danych niezbędna dla rozwiązania
problemu (metody dostępu etc.)
7
Ogólne spojrzenie
Wykorzystanie komputera:
Projektowanie programów (algorytmy, struktury danych)
Pisanie programów (kodowanie)
Weryfikacja programów (testowanie)
Cele algorytmiczne:
- poprawność,
- efektywność,
Cele implementacji:
- zwięzłość
- możliwość powtórnego
wykorzystania
8
Problemy algorytmiczne
Specyfikacja
wejścia
?
Specyfikacja
wyjścia, jako
funkcji
wejścia
Ilość instancji danych spełniających
specyfikację wejścia może być nieskończona, np.:
posortowana niemalejąco sekwencja liczb naturalnych, o skończonej długości:
1, 20, 908, 909, 100000, 1000000000.
3, 44, 211, 222, 433.
3.
…
9
Rozwiązanie problemu
Instancja
wejściowa (dane),
odpowiadająca
specyfikacji
algorytm
Wyniki
odpowiadające
danym
wejściowym
– Algorytm opisuje działania, które mają zostać przeprowadzone na danych
– Może istnieć wiele algorytmów rozwiązujących ten sam problem
10
Definicja algorytmu
Algorytmem nazywamy skończoną sekwencję jednoznacznych
instrukcji pozwalających na rozwiązanie problemu, tj. na
uzyskanie pożądanego wyjścia dla każdego legalnego wejścia.
Własności algorytmów:
– określoność
– skończoność
– poprawność
– ogólność
– dokładność
11
Pseudokod
Zbliżony do Ady, C, Javy czy innego języka programowania:
– struktury sterujące (if … then … else, pętle while i for)
– przypisanie (←)
– dostęp do elementów tablicy: A[i]
– dla typów złożonych (record lub object) dostęp do pól: A.b
– zmienna reprezentująca tablicę czy obiekt jest traktowana jak wskaźnik do
tej struktury (podobnie, jak w C).
12
Warunki początkowe i końcowe (precondition, postcondition)
Ważne jest sprecyzowanie warunków początkowego i końcowego dla
algorytmu:
– INPUT: określenie jakie dane algorytm powinien dostać na wejściu
– OUTPUT: określenie co algorytm powinien wyprodukować. Powinna zostać
przewidziana obsługa specjalnych przypadków danych wejściowych
13
Sortowanie przez wstawianie (Insertion Sort)
A
3
4
6
8
9
1
7
2
j
5 1
n
i
Strategia
Strategia
••zaczynamy
zaczynamyod
od“pustej
“pustejręki”
ręki”
••wkładamy
wkładamykartę
kartęwe
wewłaściwe
właściwe
miejsce
miejscekart
kartpoprzednio
poprzedniojuż
już
posortowane
posortowane
••kontynuujemy
kontynuujemytakie
takiepostępowanie
postępowanie
aż
ażwszystkie
wszystkiekarty
kartyzostaną
zostaną
wstawione
wstawione
INPUT:
INPUT:A[1..n]
A[1..n]––tablica
tablicaliczb
liczbcałkowitych
całkowitych
OUTPUT:
OUTPUT:permutacja
permutacjaAAtaka,
taka,że
żeA[1]≤
A[1]≤
A[2]≤
A[2]≤…≤A[n]
…≤A[n]
for
for j←2
j←2 to
to nn
do
do key←A[j]
key←A[j]
wstaw
wstawA[j]
A[j]do
doposortowanej
posortowanej
sekwencji
sekwencjiA[1..j-1]
A[1..j-1]
i←j-1
i←j-1
while
while i>0
i>0 and
and A[i]>key
A[i]>key
do
do A[i+1]←A[i]
A[i+1]←A[i]
i-i-A[i+1]←key
A[i+1]←key
14
Analiza algorytmów
Efektywność:
– Czas działania
– Wykorzystanie pamięci
Efektywność jako funkcja rozmiaru wejścia:
– Ilość danych wejściowych (liczb, punktów, itp.)
– Ilość bitów w danych wejściowych
15
Analiza sortowania przez wstawianie
Określany czas wykonania jako funkcję rozmiaru wejścia
for j←2 to n
do key←A[j]
wstaw A[j] do posortowanej
sekwencji A[1..j-1]
i←j-1
while i>0 and A[i]>key
do A[i+1]←A[i]
i-A[i+1]:=key
czas
c1
c2
?
c3
c4
c5
c6
c7
ile razy
n
n-1
n-1
n-1
n
∑
∑
∑
t
(t − 1)
jn = 2 j
(t − 1)
j =2 j
n-1
j
nj = 2
16
Przypadki: najlepszy/najgorszy/średni
Najlepszy przypadek: elementy już są posortowane → tj=1, czas wykonania
liniowy (Cn).
Najgorszy przypadek: elementy posortowane nierosnąco (odwrotnie
posortowane) → tj=j, czas wykonania kwadratowy (Cn2)
Przypadek „średni” : tj=j/2, czas wykonania kwadratowy (Cn2)
17
Przypadki: najlepszy/najgorszy/średni
– Dla ustalonego n czas wykonania dla poszczególnych instancji:
6n
5n
4n
3n
2n
1n
18
Przypadki: najlepszy/najgorszy/średni
– Dla różnych n:
najgorszy przypadek
„średni” przypadek
Czas działania
6n
5n
najlepszy przypadek
4n
3n
2n
1n
1 2
3
4
5
6 7
8
9 10 11 12 …..
Rozmiar wejścia
19
Przypadki: najlepszy/najgorszy/średni
Analizę najgorszego przypadku stosuje się zwykle wtedy, kiedy czas działania
jest czynnikiem krytycznym (kontrola lotów, sterowanie podawaniem leków itp.)
Dla pewnych zadań „najgorsze” przypadki mogą występować dość często.
Określenie przypadku „średniego” (analiza probabilistyczna) jest często bardzo
kłopotliwe
20
Poprawność – praktyczna i całkowita
Praktyczna
Jeśli ten punkt został
osiągnięty
to otrzymaliśmy poprawny wynik
Poprawne dane
algorytm
Wynik
Całkowita poprawność
Ten punkt został
osiągnięty
Poprawne dane
algorytm
i otrzymaliśmy poprawny wynik
Wynik
21
Dowodzenie
W celu dowiedzenia poprawności algorytmu wiążemy ze specyficznymi
miejscami algorytmu stwierdzenia (dotyczące stanu wykonania).
– np., A[1], …, A[k] są posortowane niemalejąco
Warunki początkowe (Precondition) – stwierdzenia, których prawdziwość
zakładamy przed wykonaniem algorytmu lub podprogramu (INPUT)
Warunki końcowe (Postcondition) – stwierdzenia, które muszą być
prawdziwe po wykonaniu algorytmu lub podprogramu (OUTPUT)
22
Niezmienniki pętli
Niezmienniki – stwierdzenia prawdziwe za każdym razem kiedy osiągany
jest pewien punkt algorytmu (może to zdarzać się wielokrotnie w czasie
wykonania algorytmu, np. w pętli)
Dla niezmienników pętli należy pokazać :
– Inicjalizację – prawdziwość przed pierwszą iteracją
– Zachowanie – jeśli stwierdzenie jest prawdziwe przed iteracją to
pozostaje prawdziwe przed następną iteracją
– Zakończenie – kiedy pętla kończy działanie niezmiennik daje własność
przydatną do wykazania poprawności algorytmu
23
Przykład: sortowanie przez wstawianie
niezmiennik: na początku
każdego wykonania pętli for,
A[1…j-1] składa się z
posortowanych elementów
for
for j=2
j=2 to
to length(A)
length(A)
do
do key
key ←←A[j]
A[j]
ii ←← j-1
j-1
while
while i>0
i>0 and
and A[i]>key
A[i]>key
do
do A[i+1]
A[i+1] ←← A[i]
A[i]
i-i-A[i+1]
A[i+1] ←←key
key
inicjalizacja: j = 2, niezmiennik jest trywialny, A[1] jest zawsze posortowana
zachowanie: wewnątrz pętli while przestawia się elementy A[j-1], A[j-2], …,
A[j-k] o jedną pozycję bez zmiany ich kolejności. Element A[j] jest wstawiany
na k-tą pozycję, tak że A[k-1]≤A[k]≤A[k+1]. Stąd A[1..j-1] jest
posortowane.
zakończenie: kiedy pętla się kończy (j=n+1) niezmiennik oznacza, że cała
tablica została posortowana.
24
Notacje asymptotyczne
Cel: uproszczenie analizy czasy wykonania, zaniedbywanie „szczegółów”,
które mogą wynikać ze specyficznej implementacji czy sprzętu
– “zaokrąglanie” dla liczb: 1,000,001 ≈ 1,000,000
– “zaokrąglanie” dla funkcji: 3n2 ≈ n2
Główna idea: jak zwiększa się czas wykonania algorytmu wraz ze
wzrostem rozmiaru wejścia (w granicy).
– Algorytm asymptotycznie lepszy będzie bardziej efektywny dla prawie
wszystkich rozmiarów wejść (z wyjątkiem być może „małych”)
25
Notacje asymptotyczne
Notacja O (duże O)
– Asymptotyczne ograniczenie górne
– f(n) = O(g(n)), jeżeli istnieje stała c i n0,
takie, że f(n) ≤ c g(n) dla n ≥ n0
– f(n) i g(n) są nieujemnymi funkcjami
Korzysta się z niej przy analizie
najgorszego przypadku.
f (n)
Czas działania
całkowitymi
c ⋅ g(n)
n0
Rozmiar wejścia
26
Notacje asymptotyczne
Notacja Ω (duża Ω)
– Asymptotyczne ograniczenie dolne
– f(n) = Ω(g(n)) jeśli istnieje stała c i n0,
Opisuje najlepsze możliwe zachowanie się
algorytmu
Czas działania
takie, że c g(n) ≤ f(n) dla n ≥ n0
f (n )
c ⋅ g ( n)
n0
Rozmiar wejścia
27
Notacje asymptotyczne
Prosta zasada: odrzucamy mniej istotne dla czasu składniki i czynniki
stałe.
– 50 n log n jest O(n log n)
– 7n - 3 jest O(n)
– 8n2 log n + 5n2 + n jest O(n2 log n)
O jest ograniczeniem górnym więc np. (50 n log n) jest typu O(n5), ale
interesuje nas najlepsze możliwe oszacowanie – w tym przypadku jest to
O(n log n)
28
Notacje asymptotyczne
Notacja Θ (duża Θ )
– Dokładne oszacowanie asymptotyczne
– f(n) = Θ(g(n)) jeżeli istnieją stałe c1, c2, i
n0, takie, że c1 g(n) ≤ f(n) ≤ c2 g(n) dla
f(n) = Θ(g(n)) wtedy i tylko wtedy,
gdy f(n) = Ο(g(n)) i f(n) = Ω(g(n))
c 2 ⋅ g (n )
Czas działania
n ≥ n0
f (n )
c 1 ⋅ g (n )
n0
Rozmiar wejścia
29
Notacje asymptotyczne
Analogie do zależności pomiędzy liczbami:
– f(n) = O(g(n))
≅
f≤g
– f(n) = Ω(g(n))
≅
f≥g
– f(n) = Θ(g(n))
≅
f=g
– f(n) = o(g(n))
≅
f<g
– f(n) = ω(g(n))
≅
f>g
Zwykle zapisujemy: f(n) = O(g(n)) , co formalnie powinno być rozumiane
jako f(n) ∈O(g(n))
30
Porównanie czasów wykonania
Maksymalny rozmiar problemu (n)
1 sekunda
1 minuta
1 godzina
400n
2500
150000
9000000
20n log n
4096
166666
7826087
2n2
707
5477
42426
n4
31
88
244
2n
19
25
31
31

Podobne dokumenty