Algorytmy I Struktury Danych CS 01-5

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

Algorytmy i struktury danych Algorytmy i struktury danych

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)

Algorytmy i struktury danych Algorytmy i struktury danych

Literatura podstawowa (#1/4) Literatura podstawowa (#2/4)

Algorytmy, struktury danych Algorytmy + struktury danych =


i techniki programowania. programy
Wydanie IV
Niklaus Wirth
Piotr Wróblewski
Wydawnictwa Naukowo-
Helion, 2009 Techniczne, 2000

Stron: 352 Stron: 385

Algorytmy i struktury danych (3/50) Algorytmy i struktury danych (4/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Literatura podstawowa (#3/4) Literatura podstawowa (#4/4)

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

Algorytmy i struktury danych (5/50) Algorytmy i struktury danych (6/50)

1
Algorytmy i struktury danych Algorytmy i struktury danych

Literatura uzupełniająca (#1/4) Literatura uzupełniająca (#2/4)

Algorytmy i struktury danych Algorytmy.


Wydanie IV
Alfred V. Aho, John E. Hopcroft,
Jeffrey D. Ullman Robert Sedgewick, Kevin Wayne

Helion, 2003 Helion: 2012

Stron: 448 Stron: 952

Algorytmy i struktury danych (7/50) Algorytmy i struktury danych (8/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Literatura uzupełniająca (#3/4) Literatura uzupełniająca (#4/4)

Sztuka programowania Kombinatoryka dla programistów


Tom 1: Algorytmy podstawowe
Witold Lipski
Donald E. Knuth
Wydawnictwa Naukowo-
Wydawnictwa Naukowo- Techniczne, 2004
Techniczne, 2002
Stron: 276
Stron: 679

Algorytmy i struktury danych (9/50) Algorytmy i struktury danych (10/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Czym jest algorytm ? Jak zapisać algorytm ?

• recepta, przepis na wykonanie jakiejś czynności • język naturalny (http://www.kwestiasmaku.com/):


• w matematyce/informatyce: skończony ciąg • jak zrobić omlet ?
• składniki:
(sekwencja) reguł/czynności, które po • 2 jaja
zastosowaniu do skończonego zbioru danych, • 1 - 2 łyżki masła
pozwalają rozwiązywać zbliżone do siebie klasy • 1 łyżka zimnej wody
• sól, pieprz
problemów (algorytm ma być możliwie
uniwersalny) • całe jaja dobrze rozbić widelcem, dodając wodę, sól i pieprz
• patelnię postawić na bardzo małym ogniu, potem zwiększyć
• słowo algorytm pochodzi od nazwiska perskiego płomień, rozgrzać masło, ale nie rumienić, wlać masę
matematyka z IX w. Abū ʿAbdallāh Muḥammad ibn jajeczną.
Mūsā al-Khwārizmī (‫ﺳﻰ ﺍ َ ْﻟ ْﺧ َﻭ ِﺍﺭ ْﺯﻣِ ﻲ‬
َ ‫ﻋ ْﺑﺩَﷲ ُﻣ َﺣ ﱠﻣﺩ ِﺑﻥ ُﻣﻭ‬
َ ), • smażyć bez przykrycia na dużym ogniu, aż brzegi omletu się
al-Khwarizmi -> Al-Khwarithmi -> Algoritmi zetną
• … omlet smaży się nie dłużej niż 2 minuty, z większej ilości
jajek trochę dłużej
Algorytmy i struktury danych (11/50) Algorytmy i struktury danych (12/50)

2
Algorytmy i struktury danych Algorytmy i struktury danych

Jak zapisać algorytm ? Jak zapisać algorytm ?

• pseudokod: • język formalny


algorytm Forda-Fulkersona obliczania maksymalnego • zapis matematyczny, precyzyjna definicja ale czasami
przepływu w sieci: trudna w implementacji
Wejście: Graf G o przepustowości c, węzeł źródłowy s i
węzeł ujścia t
Wyjście: Maksymalny przepływ w f z s do t
Silnia(n) = { 1
Silnia(n-1) * n
dla n = 0
dla n > 0
1) f(u,v) ← 0 dla wszystkich krawędzi (u,v)
• język programowania
2) dopóki w Gf istnieje ścieżka p z s do t, taka że cf(u,v) > 0
dla wszystkich krawędzi (u,v)  p wykonuj: • Pascal/Delphi
1) Znajdź cf(p) = min{cf(u,v) | (u,v)  p}, • Java
2) Dla każdej krawędzi (u,v)  p: • C/C++/C#
1) f(u,v) ← f(u,v) + cf(p) • VB, Fortran, Lisp …
2) f(v,u) ← f(v,u) - cf(p)

Algorytmy i struktury danych (13/50) Algorytmy i struktury danych (14/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Jak ocenić wydajność algorytmu ? Jak ocenić wydajność algorytmu ?

• 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

Algorytmy i struktury danych (15/50) Algorytmy i struktury danych (16/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Jak ocenić wydajność algorytmu ? Jak ocenić wydajność algorytmu ?

typy złożoności: • zazwyczaj analizując złożoność przyjmujemy uproszczenia


• pesymistyczna (maksymalna): stanowi górną granicę możliwego dotyczące mniej znaczących składników:
czasu działania algorytmu dla dowolnych danych wejściowych • pomijamy rzeczywisty koszt poszczególnych instrukcji używając
(algorytm na pewno nigdy nie będzie działał gorzej) abstrakcyjnych stałych
w niektórych zastosowaniach najgorszy przypadek występuje • koncentrujemy się na rzędzie wielkości funkcji – najwyższa
stosunkowo często – np. wyszukiwanie informacji, której nie ma w potęga to najbardziej znaczący, najszybciej rosnący składnik w
danych, formule – inne składniki wraz ze wzrostem n stają coraz mniej
w systemach uwarunkowanych czasowo jej uwzględnienie jest istotne
konieczne, • przeważnie przyjmujemy, że lepszy algorytm ma czas działania
dla wielu algorytmów przypadek średni nie różni się istotnie od opisany funkcją niższego rzędu – może to być niesłuszne w
pesymistycznego przypadkach szczególnych takich jak wykorzystywanie algorytmu
• średnia: pozwala ocenić zachowanie algorytmu w typowych dla małych egzemplarzy danych wejściowych (warto rozważyć
sytuacjach (problemy: co to są typowe sytuacje, jaki jest rozkład kombinację dwóch lub więcej algorytmów)
prawdopodobieństwa wystąpienia określonych danych ?) • w niektórych zastosowaniach stałe i składniki niższych rzędów
• minimalna: istotna w nietypowych sytuacjach, np. bezpieczeństwo mogą się okazać istotne (po to ulepszamy komputery)
szyfru – minimalny czas złamania szyfru określonym algorytmem

Algorytmy i struktury danych (17/50) Algorytmy i struktury danych (18/50)

3
Algorytmy i struktury danych Algorytmy i struktury danych

Jak ocenić wydajność algorytmu ? Przykładowe klasy złożoności

• złożoność obliczeniowa algorytmu jest mierzona jego 12

wymaganiami czasowymi T(n) i przestrzennymi S(n), które są


funkcjami zależnymi od rozmiaru problemu n
• funkcja ta jest nazywana złożonością teoretyczną i opisuje klasę 10

algorytmu najczęściej za pomocą notacji „dużego O”


stała
• notacja O() ma charakter asymptotyczny (zachowanie wartości 8
log n
funkcji wraz z wzrostem jej argumentów): podliniowa
f(n) = O(g(n)) oznacza, że istnieją takie stałe c i n0, że: liniowa

f(n) ≤ c * g(n) dla n ≥ no 6 n log n


n^2
• w notacji O(n) zaniedbujemy stałe oraz niższe potęgi wykładnicza

• typowe klasy algorytmów: 4


silnia

• wielomianowe: stała – O(1), logarytmiczna – O(log n), liniowa –


O(n), kwadratowa – O(n2)
2
• wykładnicze: O(2n), O (n!)

0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Algorytmy i struktury danych (19/50) Algorytmy i struktury danych (20/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Zalety notacji „dużego O” Wyszukiwanie

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

Wykładnicza O(2n) 10301030 10301016 lat Zadanie:


• ocenić w każdym przypadku złożoność minimalną,
dla porównania:
maksymalną i średnią
1. Ziemia ma ca 4,5 * 109 lat
2. prawo Moore’a mówi, że moc komputerów podwaja się co 2 lata (szybsze
komputery nie są rozwiązaniem wykładniczej złożoności)
ale wykładnicza złożoność obliczeniowa jest podstawą bezpieczeństwa
informacji (np. szyfrów) 

Algorytmy i struktury danych (21/50) Algorytmy i struktury danych (22/50)

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 ?

Wejście: bool IsEqual(int[] Vector, int Number, int Position)


• wektor w zawierający n liczb całkowitych {
return Vector[Position] == Number;
l1 l2 l3 … ln-2 ln-1 ln }

• 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

Algorytmy i struktury danych (23/50) Algorytmy i struktury danych (24/50)

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

liczba operacji (porównań): 1 liczba operacji (porównań): 1

Algorytmy i struktury danych (25/50) Algorytmy i struktury danych (26/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie Ocena wydajności

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)

Algorytmy i struktury danych (27/50) Algorytmy i struktury danych (28/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

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

Algorytmy i struktury danych (29/50) Algorytmy i struktury danych (30/50)

5
Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

Problem: czy liczba x występuje w nieuporządkowanym wektorze w ? Problem: czy liczba x występuje w nieuporządkowanym wektorze w ?

Przykład: czy liczba 8 występuje w wektorze w ?


bool IsPresent(int[] Vector, int Number)
{ TAK
for (int i = 0; i < Vector.Length; i++)
if (Vector[i] == Number) return true; 1 2 3 4 5
return false;
7 13 4 2 8 9 1
}
bool IsPresent(int[] Vector, int Number)
{
co jest operacją dominującą ? for (int i = 0; i < Vector.Length; i++) =:1
if (Vector[i] == Number) return true;
• przypisanie (=) return false;
<:5
• porównanie (<) } ++:4
// ...
• porównanie (==) int[] w = { 7, 13, 4, 2, 8, 9, 1};
==:5
• inkrementacja (++) Console.WriteLine(IsPresent(w, 8));

liczba operacji dominujących (porównań ==): 5


Algorytmy i struktury danych (31/50) Algorytmy i struktury danych (32/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

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)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

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

Czy liczba czynności zależy od wartości elementów ? ∑ …


średnia liczba porównań: =

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

Algorytmy i struktury danych (35/50) Algorytmy i struktury danych (36/50)

6
Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

Analityczna ocena średniej złożoności algorytmu Empiryczna ocena z wykorzystaniem instrumentacji


założenia:
• tablica ma rozmiar n (zawiera n elementów) bool IsPresent(int[] Vector, int Number)
• element znajduje się w tablicy ( jeśli nie to mamy złożoność pesymistyczną) {
for (int i = 0; i < Vector.Length; i++)
• każdy element występuje w tablicy z jednakowym prawdopodobieństwem if (Vector[i] == Number) return true;
return false;
6
}
liczba porównań

bool IsPresent(int[] Vector, int Number)


4
{
OpAssignment = OpComparisonLT = 1;
3
for (int i = 0; i < Vector.Length; i++, OpIncrement++)
{
2
OpComparisonEQ++;
if (Vector[i] == Number) return true;
1
OpComparisonLT++;
}
0
1 2 3 4 5 6 7 8 9 10 return false;
}

Algorytmy i struktury danych (37/50) Algorytmy i struktury danych (38/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie liniowe Wyszukiwanie liniowe

Empiryczna ocena z wykorzystaniem instrumentacji Empiryczna ocena z wykorzystaniem pomiaru czasu


35

==
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

Algorytmy i struktury danych (39/50) Algorytmy i struktury danych (40/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Ocena wydajności Wyszukiwanie binarne

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

Algorytmy i struktury danych (41/50) Algorytmy i struktury danych (42/50)

7
Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie binarne Wyszukiwanie binarne

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)

Algorytmy i struktury danych (43/50) Algorytmy i struktury danych (44/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie binarne Wyszukiwanie binarne

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

 średnia złożoność wyszukiwania binarnego to:


liczba operacji (porównań ==): 3
ó ę łó
ó

Algorytmy i struktury danych (45/50) Algorytmy i struktury danych (46/50)

Algorytmy i struktury danych Algorytmy i struktury danych

Wyszukiwanie binarne Porównanie metod wyszukiwania

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

Middle = (Left + Right) / 2;


if (Vector[Middle] == Number) return true; 25

else if (Vector[Middle] > Number) Right = Middle - 1;


20
else Left = Middle + 1;
}
15
return false;
} 10

przyjmujemy, że operacją dominującą jest porównanie elementów (==) 5

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

Algorytmy i struktury danych (47/50) Algorytmy i struktury danych (48/50)

8
Algorytmy i struktury danych Algorytmy i struktury danych

Ocena wydajności Porównanie metod wyszukiwania

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 rozmiaru wektora ? 2 (Luboszów) 2 1,5 2 1,5

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ść

Algorytmy i struktury danych (49/50) Algorytmy i struktury danych (50/50)

You might also like