Professional Documents
Culture Documents
Algorytmy I Struktury Danych CS 01-5
Algorytmy I Struktury Danych CS 01-5
Algorytmy I Struktury Danych CS 01-5
Plan wykładu
Algorytmy i struktury danych #1
Wprowadzenie
• literatura podstawowa i uzupełniająca
• czym jest algorytm ?
• jak zapisać i ocenić wydajność algorytmu ?
• metody oceny złożoności
• wyszukiwanie liniowe
Wojciech Complak • wyszukiwanie binarne
Instytut Informatyki, Wydział Informatyki, Politechnika Poznańska
e-mail: Wojciech.Complak@wsb.poznan.pl
1.06
Algorytmy i struktury danych (2/50)
Wprowadzenie do algorytmów.
Wydanie VII Algorytmy. Almanach.
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest,
Clifford Stein George Heineman, Gary Pollice,
Wydawnictwo Naukowe PWN, 2014 Stanley Selkow
Stron: 1400
Helion, 2012
Algorytmy bez tajemnic.
Wydanie I Stron: 351
Thomas H. Cormen
Helion, 2013
Stron: 223
1
Algorytmy i struktury danych Algorytmy i struktury danych
2
Algorytmy i struktury danych Algorytmy i struktury danych
• kryteria: • zwykle wydajność algorytmu opisuje się jako zależność wzrostu czasu
wykonywania od rozmiaru danych wejściowych (np. liczby elementów do
• (nie)zadowolenie użytkownika przeszukania albo posortowania),
• częstotliwość uruchamiania jak opisać złożoność algorytmu sprawdzania czy dana liczba jest
pierwsza ?
• koszty implementacji (usprawnienia) • kluczowe znaczenie ma identyfikacja operacji dominujących (mających
• problem komunikacji największych wpływ na koszt) np. porównanie, zamiana elementów
• czas wykonania („zawiesił się czy jeszcze liczy ?”) • konieczna jest analiza zachowania dla różnych rozkładów danych
wejściowych z uwzględnieniem identyfikacji najgorszego, typowego i
• wymagania pamięciowe ewentualnie najlepszego przypadku,
• miara złożoności obliczeniowej powinna być niezależna od • określenie złożoności obliczeniowej algorytmu zwykle obejmuje złożoności:
komputera (procesora), platformy programistycznej, opcji i • pesymistyczną (maksymalną),
bieżącego stanu systemu • średnią (typową/oczekiwaną)
oraz ewentualnie
poszukujemy abstrakcyjnej miary odzwierciedlającej • optymistyczną (minimalną)
charakter zależności i pomijającej mniej istotne szczegóły • złożoność algorytmu może być większa niż złożoność rozwiązywanego
problemu
3
Algorytmy i struktury danych Algorytmy i struktury danych
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
dla dużych n złożoność algorytmu może być przyczyną wielkich różnic w czasie
odpowiedzi
Problem: sprawdzenie czy określona liczba występuje w
przyjmując, że komputer działa z prędkością operacja/s:
jednowymiarowej tablicy (wektorze) ?
Klasa Złożoność Liczba operacji dla n = 106 Czas rzeczywisty
1. na określonej pozycji
Wielomianowa:
2. w całym wektorze
stała O(1) 1 1 s a) jeśli elementy nie są uporządkowane
liniowa O(n) 106 1s
kwadratowa O(n2) 1012 10 dni b) jeśli elementy są posortowane rosnąco
sześcienna O(n3) 1018 27,397 lat
Wyszukiwanie Wyszukiwanie
Problem: czy liczba x występuje w wektorze w na pozycji y ? Problem: czy liczba x występuje w wektorze w na pozycji y ?
• liczba x
• pozycja y operacja dominująca (elementarna): operacja charakterystyczna
dla danego algorytmu mająca bezpośredni wpływ na czas jego
Wyjście: wykonania – porównanie (==)
• TAK – liczba x znajduje się w wektorze w na pozycji y
• NIE – liczba x nie znajduje się w wektorze w na pozycji y złożoność czasowa: to zależność liczby operacji dominujących w
funkcji rozmiaru danych wejściowych
4
Algorytmy i struktury danych Algorytmy i struktury danych
Wyszukiwanie Wyszukiwanie
Problem: czy liczba x występuje w wektorze w na pozycji y ? Problem: czy liczba x występuje w wektorze w na pozycji y ?
Przykład: czy liczba 5 występuje w wektorze w na pozycji 3. (2) ? Przykład: czy liczba 8 występuje w wektorze w na pozycji 5. (4) ?
NIE TAK
7 13 4 2 8 9 1 7 13 4 2 8 9 1
bool IsEqual(int[] Vector, int Number, int Position) bool IsEqual(int[] Vector, int Number, int Position)
{ {
return Vector[Position] == Number; return Vector[Position] == Number;
} }
// ... // ...
int[] w = { 7, 13, 4, 2, 8, 9, 1}; int[] w = { 7, 13, 4, 2, 8, 9, 1};
Console.WriteLine(IsEqual(w, 5, 2)); False Console.WriteLine(IsEqual(w, 8, 4)); True
Problem: czy liczba x występuje w wektorze w na pozycji y ? Problem: czy liczba x występuje w wektorze w na pozycji y ?
Analiza: Analiza:
Czy liczba czynności zależy od rozmiaru wektora ? Czy liczba czynności zależy od rozmiaru wektora ? Nie
Czy liczba czynności zależy od pozycji liczby ? Czy liczba czynności zależy od pozycji liczby ? Nie
Czy liczba czynności zależy od wartości elementów ? Czy liczba czynności zależy od wartości elementów ? Nie
Wniosek:
Złożoność jest stała: O(1) (minimalna = maksymalna = średnia)
Problem: czy liczba x występuje w nieuporządkowanym wektorze w ? Problem: czy liczba x występuje w nieuporządkowanym wektorze w ?
Wejście: Algorytm:
• wektor w zawierający n liczb całkowitych • rozpoczynając od początku wektora porównujemy kolejne liczby
• zatrzymujemy się po znalezieniu liczby x lub osiągnięciu końca
l1 l2 l3 … ln-2 ln-1 ln
wektora w
• liczba x
Wyjście:
• TAK – liczba x znajduje się w wektorze w
l1 l2 l3 … ln-2 ln-1 ln
• NIE – liczba x nie znajduje się w wektorze w
5
Algorytmy i struktury danych Algorytmy i struktury danych
Problem: czy liczba x występuje w nieuporządkowanym wektorze w ? Problem: czy liczba x występuje w nieuporządkowanym wektorze w ?
Problem: czy liczba x występuje w nieuporządkowanym wektorze w ? Problem: czy liczba x występuje w nieuporządkowanym wektorze w ?
Jaka jest złożoność minimalna ? Jaka jest złożoność maksymalna ?
poszukiwana liczba jest na pierwszej pozycji poszukiwana liczba jest na ostatniej pozycji albo nie ma jej w
wektorze
TAK
1
1 2 3 4 5 6 7
7 13 4 2 8 9 1 7 13 4 2 8 9 1
bool IsPresent(int[] Vector, int Number)
{ =:1 =:1
for (int i = 0; i < Vector.Length; i++) =:1 liczba na ostatniej pozycji: liczby nie ma w wektorze:
if (Vector[i] == Number) return true; <:7 <:8
return false;
<:1 IsPresent(w, 1) IsPresent(w, 5)
++:6 ++:7
} ++:0
// ... ==:7 ==:7
int[] w = { 7, 13, 4, 2, 8, 9, 1};
==:1
Console.WriteLine(IsPresent(w, 7));
liczba operacji dominujących (porównań ==): 1 liczba operacji (porównań ==): 7 = liczba elementów tablicy = n
Algorytmy i struktury danych (33/50) Algorytmy i struktury danych (34/50)
Problem: czy liczba x występuje w nieuporządkowanym Analityczna ocena średniej złożoności algorytmu
wektorze w ? założenia:
Analiza: • tablica ma rozmiar n (zawiera n elementów)
Czy liczba czynności zależy od rozmiaru wektora ? • element znajduje się w tablicy ( jeśli nie to mamy złożoność pesymistyczną)
Czy liczba czynności zależy od pozycji liczby ? • każdy element występuje w tablicy z jednakowym prawdopodobieństwem
Ocena złożoności:
ciąg arytmetyczny:
• analitycznie – znajdujemy funkcję f(n) n-ty wyraz: 1 suma elementów ciągu:
• empirycznie:
– instrumentacja kodu ∑ … ∗
średnia liczba porównań: = = ∗ ∗ = =
– pomiar czasu, profilowanie
6
Algorytmy i struktury danych Algorytmy i struktury danych
==
using System.Diagnostics;
30
++
< long StartingTime = Stopwatch.GetTimestamp();
=
25
//
// badany kod
20 //
long EndingTime = Stopwatch.GetTimestamp();
15 long ElapsedTime = EndingTime ‐ StartingTime;
double ElapsedSeconds = ElapsedTime * (1.0 / Stopwatch.Frequency);
10
0
1 2 3 4 5 6 7 8 9 10
Problem: czy liczba x występuje w nieuporządkowanym Problem: czy liczba x występuje w posortowanym rosnąco
wektorze w ? wektorze w ?
Analiza:
Czy liczba czynności zależy od rozmiaru wektora ? Wejście:
Czy liczba czynności zależy od pozycji liczby ? • wektor w zawierający n liczb całkowitych uporządkowanych
Czy liczba czynności zależy od wartości elementów ? rosnąco
l1 l2 l3 … ln-2 ln-1 ln
Wniosek:
• liczba x
Złożoność minimalna = 1 (stała)
Wyjście:
maksymalna = n (liniowa)
• TAK – liczba x znajduje się w wektorze w
średnia = ½(n+1) (liniowa)
• NIE – liczba x nie znajduje się w wektorze w
7
Algorytmy i struktury danych Algorytmy i struktury danych
Problem: czy liczba x występuje w posortowanym rosnąco wektorze w ? Problem: czy liczba x występuje w posortowanym rosnąco wektorze w ?
Algorytm: Algorytm:
• porównujemy liczbę x z elementem w połowie wektora, • porównujemy liczbę x z elementem w połowie wektora,
stop jeśli jest równa lub lewy indeks wektora jest większy od prawego stop jeśli jest równa lub lewy indeks wektora jest większy od prawego
• jeśli liczba x jest większa od badanego elementu powtarzamy algorytm dla prawej • jeśli liczba x jest większa od badanego elementu powtarzamy algorytm dla prawej
połowy wektora, jeśli mniejsza – dla lewej połowy wektora, jeśli mniejsza – dla lewej
poziomy węzłów:
n=7
(zrównoważone) drzewo 1
=4
wyszukiwań binarnych
L P
2
=2 =6
L P L P
l1 l2 l3 … ln-2 ln-1 ln
1 3 5 7 3
liczba porównań: 3 2 3 1 3 2 3
(n = 7) liczba porównań: 3 2 3 1 3 2 3 (in-order)
Problem: czy liczba x występuje w posortowanym rosnąco wektorze Problem: jaka jest średnia złożoność wyszukiwania binarnego ?
w?
Jaka jest złożoność maksymalna ? n=2 1
= = 1,5
Przykład: czy liczba 8 występuje w wektorze w ? 2
1
2 n=6 1
TAK 3 2 2 = 2,33
3 3 3
1 3 4 6 8 9 13
Problem: czy liczba x występuje w posortowanym rosnąco wektorze w ? porównanie maksymalnych (Lmax) i średnich (Lavg) kosztów wyszukiwania
liniowego i binarnego (odpowiednio Bmax, Bavg):
bool IsPresent(int[] Vector, int Number) 40
{
int Left = 0, Right = Vector.Length - 1, Middle; Lmax Lavg
35
while(Left <= Right) Bmax Bavg
{ 30
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
8
Algorytmy i struktury danych Algorytmy i struktury danych
Problem: czy liczba x występuje w posortowanym rosnąco dla uporządkowanych (posortowanych) danych przewagę wyszukiwania binarnego
wektorze w ? nad liniowym dla rosnących n można zademonstrować na przykładzie kosztów
wyszukiwania w książkach telefonicznych o różnej liczbie numerów:
Analiza: Liczba numerów lsearch max lsearch avg bsearch max bsearch avg
Czy liczba czynności zależy od pozycji liczby ? 2*105 (Poznań) 200 000 100 000,5 18 16,69
Czy liczba czynności zależy od wartości elementów ? 106 (Warszawa) 1 000 000 500 000,5 20 18,95
Wnioski:
Wniosek:
• warto uporządkować dane jeśli operacja wyszukiwania będzie wykonywana
Złożoność minimalna = O(1) (stała) wielokrotnie
maksymalna = O(log n) (logarytmiczna log2n) • ulepszony algorytm (wyszukiwanie binarne) może dla większych rozmiarów
średnia = O(log n) problemów osiągać znaczącą przewagę nad prostszym (wyszukiwanie liniowe)
• wyrafinowany algorytm dla relatywnie małych rozmiarów problemu może mieć
porównywalną wydajność