Upload
vokhue
View
227
Download
0
Embed Size (px)
Citation preview
2
Tematyka wykładu
Ø Wprowadzenie Ø Poprawność algorytmów (elementy analizy algorytmów) Ø Wyszukiwanie Ø Sortowanie Ø Elementarne i abstrakcyjne struktury danych
3
Literatura
T. Cormen, Ch. Lieserson, R. Rivest, Wprowadzenie do Algorytmów, WNT, 1997
R. Sedgewick, Algorytmy w C++, RM, 1999
N. Wirth, Algorytmy + struktury danych = programy, WNT, 2001
4
O co w tym wszystkim chodzi?
Ø Rozwiązywanie problemów:
– Układanie planu zajęć
– Bilansowanie 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
Cele algorytmiczne: - poprawność, - efektywność,
Cele implementacji: - zwięzłość - możliwość powtórnego wykorzystania
Wykorzystanie komputera:
Ø Projektowanie programów (algorytmy, struktury danych)
Ø Pisanie programów (kodowanie)
Ø Weryfikacja programów (testowanie)
8
Problemy algorytmiczne
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. § …
Specyfikacja wejścia
? Specyfikacja wyjścia, jako funkcji wejścia
9
Rozwiązanie problemu
– Algorytm opisuje działania, które mają zostać przeprowadzone na danych
– Może istnieć wiele algorytmów rozwiązujących ten sam problem
Instancja wejściowa (dane), odpowiadająca specyfikacji
algorytm Wyniki odpowiadające danym wejściowym
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
Przykład 1: poszukiwanie
Wejście: • uporządkowany niemalejąco ciąg n (n >0) liczb • liczba
a1, a2, a3,….,an; q j
Wyjście: • indeks (pozycja) odnalezionej wartości lub NIL
2 5 6 10 11; 5 2
2 5 6 10 11; 9 NIL
12
Przykład 1: poszukiwanie liniowe
INPUT: A[1..n] – tablica liczb, q – liczba całkowita. OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q j←1 while j ≤ n and A[j] ≠ q do j++ if j ≤ n then return j else return NIL
Ø Algorytm wykorzystuje metodę siłową (brute-force) – przegląda kolejno elementy tablicy.
Ø Kod napisany jest w jednoznacznym pseudojęzyku (pseudokodzie). Ø Wejście (INPUT) i wyjście (OUTPUT) zostały jasno określone.
13
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).
14
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
15
Sort
Przykład 2: sortowanie
Wejście ciąg n liczb
a1, a2, a3,….,an b1,b2,b3,….,bn
Wyjście Permutacja wejściowego ciągu
2 5 4 10 7 2 4 5 7 10
poprawność wyjścia: Dla każdego wejścia algorytm po zakończeniu działania powinien dać jako wynik b1, b2, …, bn takie, że:
• b1 < b2 < b3 < …. < bn • b1, b2, b3, …., bn jest permutacją a1, a2, a3,….,an
16
Sortowanie przez wstawianie (Insertion Sort)
A 1 n j
3 6 8 4 9 7 2 5 1
i
Strategia • zaczynamy od pustego ciągu (“pustej ręki”) • wkładamy kartę we właściwe miejsce wśród kart poprzednio już posortowanych • kontynuujemy takie postępowanie aż wszystkie karty zostaną wstawione
INPUT: A[1..n] – tablica liczb całkowitych OUTPUT: permutacja A taka, że A[1]≤ A[2]≤ …≤A[n] 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
17
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
18
Analiza sortowania przez wstawianie
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 0 c3 c4 c5 c6 c7
ile razy n n-1 n-1 n-1 n-1
2
njjt
=∑2( 1)njjt
=−∑
2( 1)njjt
=−∑
Ø Określany czas wykonania jako funkcję rozmiaru wejścia
19
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)
20
Przypadki: najlepszy/najgorszy/średni
– Dla ustalonego n czas wykonania dla poszczególnych instancji:
1n
2n
3n
4n
5n
6n
21
Przypadki: najlepszy/najgorszy/średni
– Dla różnych n:
1n
2n
3n
4n
5n
6n
Rozmiar wejścia
Cza
s dzi
ałan
ia
1 2 3 4 5 6 7 8 9 10 11 12 …..
najlepszy przypadek
„średni” przypadek
najgorszy przypadek
22
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,
jednak w praktyce zwykle zdarza się to rzadko lub wręcz jest to nierealne.
Ø Określenie przypadku „średniego” (analiza probabilistyczna) jest często bardzo
kłopotliwe
23
Różnice w podejściu?
Ø Czy sortowanie przez wstawianie jest najlepszą strategią dla zadania sortowania?
Ø Rozważmy alternatywną strategię opartą o zasadę „dziel i zwyciężaj”:
Sortowanie przez łączenie (MergeSort):
– ciąg <4, 1, 3, 9> dzielimy na dwa podciągi
– Sortujemy te podciągi: <4, 1> i <3, 9>
– łączymy wyniki
• Czas wykonania rzędu n log n
24
Analiza wyszukiwania liniowego
INPUT: A[1..n] – tablica liczb całkowitych, q – liczba całkowita OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q
j←1 while j ≤ n and A[j] ≠ q do j++ if j ≤ n then return j else return NIL
Najgorszy przypadek: C n Średni przypadek: C n/2
25
Poszukiwanie binarne
INPUT: A[1..n] – posortowana tablica liczb całkowitych, q – liczba całkowita. OUTPUT: indeks j taki, że A[j] = q. NIL, jeśli ∀j (1≤j≤n): A[j] ≠ q left←1 right←n do
j←⎣(left+right)/2⎦ if A[j]=q then return j else if A[j]>q then right←j-1 else left=j+1
while left<=right return NIL
Pomysł: „dziel i zwyciężaj”
26
Poszukiwanie binarne - analiza
Ø Ile razy wykonywana jest pętla:
– Po każdym przebiegu różnica między left a right zmniejsza się o połowę
• początkowo n
• pętla kończy się kiedy różnica wynosi 1 lub 0
– Ile razy trzeba połowić n żeby dostać 1?
– lg n – lepiej niż poprzedni algorytm (n)