Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska
Algorytmy i struktury danych - wykłady
Anna Maria Radzikowska
Algorytmy i Struktury Danych
Wykład 1:
Wprowadzenie
dr Anna Maria Radzikowska
Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska
Tematyka wykładu
Podstawy analizy poprawno´sci i zło˙zono´sci algorytmów
Metoda niezmienników dowodzenia poprawno´sci programów.
Zło˙zono´s´c czasowa i pami˛eciowa algorytmów.
Metody sortowania danych
Sortowanie tablic (QuickSort, HeapSort, elementarne sortowanie).
Sortowanie plików.
Metody selekcji.
Wyszukiwanie w zbiorze uprz ˛adkowanym Listy.
Drzewa (BST, AVL–drzewa, B–drzewa, drzewa PATRICIA).
Tematyka wykładu (cd.)
Wyszukiwanie w zbiorze nieuporz ˛adkowanym (haszowanie).
Podstawowe metody teoriografowe.
Reprezentacja grafów.
Przeszukiwanie grafów.
Podstawowe algorytmy teoriografowe.
Literatura
Lech Banachowski, Krzysztof Diks, Wojciech Rytter (1996). Algorytmy i struktury danych, Wydawnictwo Naukowo–Techniczne, Warszawa.
Alfred V. Aho, John E. Hopcroft, Jeffrey D. Ullman (2003).
Projektowanie i analiza algorytmów, HELION.
Alfred V. Aho, John E. Hopcroft, Jeffrey D. Ullman (2003). Algorytmy i struktury danych, HELION.
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1996).
Wprowadzenie do algorytmów i struktur danych, Wydawnictwo Naukowo–Techniczne, Warszawa.
Literatura (cd.)
Lech Banachowski, Antoni Kreczmar (1982). Elementy analizy algorytmów, Wydawnictwo Naukowo–Techniczne, Warszawa.
Lech Banachowski, Antoni Kreczmar, Wojciech Rytter (1987). Analiza algorytmów i struktur danych, Wydawnictwo Naukowo–Techniczne, Warszawa.
Niklaus Wirth (1980). Algorytmy + struktury danych = programy, Wydawnictwo Naukowo–Techniczne, Warszawa.
Robert Sedgewick (1999). Algorytmy w C++, Oficyna Wydawnicza READ ME, Warszawa.
Poj˛ecie algorytmu
Definicja 1.1 Algorytmem nazywamy abstrakcyjny opis działa´n na pewnych obiektach prowadz ˛acy do rozwi ˛azania okre´slonego problemu.
Problem taki (zestaw zada´n, zwanych jego instancjami) nazywamy problemem algorytmicznym.
Przykładowo:
porz ˛adkowanie ci ˛agów liczbowych.
mno˙zenie macierzy
wyszukiwanie okre´slonych elementów w zbiorze.
Klasy problemów algorytmicznych
Wyró˙zniamy 3 podstawowe klasy problemów algorytmicznych:
algorytmicznie rozwi ˛azywalne — istnieje algorytm daj ˛acy poprawny wynik dla ka˙zdej instancji problemu.
Przykładowo: mno˙zenie macierzy.
algorytmicznie cz˛e´sciowo rozwi ˛azywalne — istnieje algorytm, który dla ka˙zdej instancji problemu daje albo poprawny wynik albo nie ko´nczy oblicze´n.
Przykładowo: problem spełnialno´sci formuł klasycznej logiki 1–szego rz˛edu.
algorytmicznie nierozwi ˛azywalne — wpp.
Przykładowo: problem stopu algorytmów.
Syntaktyka i semantyka
Syntaktyka — dziedzina bada´n lingwistycznych zajmuj ˛aca si˛e form ˛a, postaci ˛a, strukturami wyra˙ze´n j˛ezykowych.
Semantyka – dziedzina bada´n lingwistycznych zajmuj ˛aca si˛e znaczeniem wyra˙ze´n j˛ezykowych.
Podstawowe typy semantyk:
semantyka operacyjna — opisuje znaczenie wyra˙ze´n j˛ezyka przy
pomocy działa´n okre´slonych w innym j˛ezyku (w informatyce: operacji wykonywanych przez pewien abstrakcyjny automat).
semantyka denotacyjna — opisuje znaczenie wyra˙ze´n j˛ezyka przypisuj ˛ac im pewne obiekty matematyczne.
semantyka aksjomatyczna — opisuje znaczenie wyra˙ze´n j˛ezyka przy pomocy pewnej logiki.
Struktury danych
Struktur ˛a danych nazywamy reprezentacj˛e zbioru obiektów (danych) o okre´slonej syntaktyce, skojarzon ˛a ze zbiorem pewnych działa´n na tych obiektach.
Z kolei algorytmy działaj ˛a na obiektach przyjmuj ˛acych form˛e struktur danych.
Zatem poj˛ecie struktury danych jest nierozerwalnie zwi ˛azane z poj˛eciem algorytmu.
Analiza poprawno´sci algorytmów
Podstawy metody niezmienników
Definicja 1.2 Dziedzin ˛a algorytmiczn ˛a nazywamy układ DAL = (U, f1, . . . , fn, r1, . . . , rm), gdzie
U 6= ∅ jest zbiorem obiektów
fi : Uki → U , i = 1, . . . , n, jest symbolem funkcyjnym, ki nazywamy arno´sci ˛a (liczb ˛a argumentów) symbolu fi; w ogólno´sci fi jest symbolem funkcji cz˛e´sciowej
rj ⊆ Ukj, j = 1, . . . , m, jest symbolem relacyjnym.
Przykłady:
(Z, +, −, ∗, div, mod, =, <)
(R, +, −.∗, /, ln, exp, sin, cos, arc tg, <).
(B, ¬, ∧, ∨, →, ↔).
(AN, =, <).
Dziedziny algorytmiczne
Elementarne dziedziny algorytmiczne:
liczby całkowite : int liczby rzeczywiste : real warto´sci logiczne : Bool
symbole : char
napisy : string
wska´zniki : ↑ D (D – pewna dziedzina algorytmiczna).
Dziedziny algorytmiczne (cd.)
Zło˙zone dziedziny algorytmiczne:
A = A1 × A2 × . . . × Ak
gdzie Ai, i = 1, . . . , k, jest dziedzin ˛a algorytmiczn ˛a. Obiekty tych dziedzin nazywamy rekordami i zapisujemy:
struct A = record
pole1 : A1 . . .
polek : Ak end
Termy
Definicja 1.3 Termami nazywamy wyra˙zenia spełniaj ˛ace nast˛epuj ˛ace warunki:
ka˙zda stała (element dziedziny algorytmicznej U ) i ka˙zda zmienna typu U jest termem
je´sli f jest symbolem funkcji k–argumentowej i t1, . . . , tn s ˛a termami, to f (t1, . . . , tn) jest termem.
Termy w dziedzinie liczb (całkowitych, rzeczywistych) nazywamy wyra˙zeniami arytmetycznymi.
Termy w dziedzinie (B, ¬, ∧, ∨, →, ↔) nazywamy wyra˙zeniami logicznymi.
Termy (cd.)
Przykłady:
+(x, ∗(2, y)) (tj. x + 2 ∗ y) jest termem
x ∨ (2 < y) jest termem (x jest typu logicznego, y typu liczbowego)
1
2 + 14 + 18 + . . . nie jest termem.
Wyra˙zenia logiczne
Wyra˙zeniami logicznymi jest najmniejszy zbiór napisów spełniaj ˛acy warunki:
ka˙zda stała logiczna (true, f alse) jest wyra˙zeniem logicznym ka˙zda zmienna logiczna jest wyra˙zeniem logicznym
je´sli t1, . . . ,tn s ˛a termami i r jest symbolem n–argumentowej relacji, to r(t1, . . . , tn) jest wyra˙zeniem logicznym
je´sli α i β s ˛a wyra˙zeniami logicznymi, to ¬α, α ∧ β, α ∨ β, α → β, α ≡ β s ˛a wyra˙zeniami logicznymi.
Warto´sciowanie termów
Definicja 1.4
Niech (U, f1, . . . , fn, r1, . . . , rm) b˛edzie dziedzin ˛a algorytmiczn ˛a.
Warto´sciowaniem termów w tej dziedzinie nazywamy funkcj˛e val : T erms(U ) → U ∪ {⊥} okre´slon ˛a nast˛epuj ˛aco:
val(u) = u dla ka˙zdego u ∈ U Niech x b˛edzie zmienn ˛a typu U . val(x) =
ostatnio nadana warto´s´c zmiennej x
⊥, je´sli nie nadano warto´sci x
je´sli t1, . . . , tn s ˛a termami, f jest symbolem n–argumentowej funkcji F oraz val(ti) 6= ⊥, i = 1, . . . , n, to
val(f (t1, . . . , tn)) = F (val(t1), . . . , val(tn)), o ile warto´s´c funkcji F dla (val(t1), . . . , val(tn)) jest okre´slona
val(f (t1, . . . , tn)) = ⊥ wpp.
Warto´sciowanie wyra˙ze ´n logicznych
warto´sciowanie stałych i zmiennych logicznych okre´slone jest tak jak w przypadku termów
je´sli r jest symbolem n–argumentowej relacji R, t1,. . . ,tn s ˛a termami oraz val(ti) 6= ⊥, i = 1, . . . , n, to
val(r(t1, . . . , tn)) =
true je´sli (val(t1), . . . , val(tn)) ∈ R f alse wpp
warto´sci logiczne negacji, koniunkcji, dysjunkcji, implikacji i równowa˙zno´sci s ˛a okre´slone według reguł rachunku logicznego.
Instrukcje
Definicja 1.5
Instrukcj ˛a jest napis postaci:
Napis pusty (instrukcja pusta)
Niech x b˛edzie zmienn ˛a typu U i niech t ∈ T erms(U ). Instrukcj ˛a przypisania jest wyra˙zenie x := t
Je´sli I1, I2 s ˛a instrukcjami, to I1; I2 jest instrukcj ˛a zwan ˛a instrukcj ˛a zło˙zon ˛a
Je´sli α jest wyra˙zeniem logicznym i I1, I2 s ˛a instrukcjami, to
if α then I1 else I2 fi jest instrukcj ˛a zwan ˛a instrukcj ˛a warunkow ˛a
Je´sli α jest wyra˙zeniem logicznym i I jest instrukcj ˛a, to while α do I od jest instrukcja zwan ˛a instrukcj ˛a iteracyjn ˛a.
Poprawno´s´c algorytmów
Obliczenie instrukcji
Ka˙zda instrukcja (poza instrukcj ˛a pust ˛a) zmienia warto´sciowanie zmiennych (stan algorytmu). Ci ˛ag warto´sciowa´n obliczanych w trakcie realizacji instrukcji nazywamy obliczeniem instrukcji. Mog ˛a zaj´s´c 3 przypadki:
obliczenie dochodzi do punktu ko´ncowego – jest ono sko´nczone i warto´sciowanie ko´ncowe jest okre´slone
obliczenie jest sko´nczone, ale nie dochodzi do punkty ko´ncowego (tj.
zostaje przerwane, np. wskutek wykonania niedozwolonej operacji) – warto´sciowanie zmiennych NIE jest okre´slone
obliczenie jest niesko´nczone – warto´sciowania zmiennych nie s ˛a okre´slone.
Obliczenie algorytmu (cd.)
Algorytmem jest ci ˛ag instrukcji.
Definicja 1.6
Obliczeniem algorytmu nazywamy ci ˛ag
(ei0, vi0), (ei1, vi1), . . . , (eik, vik), . . . gdzie
eij s ˛a etykietami kolejno wykonywanych instrukcji ei0 jest etykiet ˛a instrukcji pocz ˛atkowej
eij, eij+1 s ˛a etykietami kolejno wykonywanych instrukcji
vij jest warto´sciowaniem zmiennych PRZED wykonaniem instrukcji o etykiecie eij.
Niezmienniki
Z ka˙zd ˛a instrukcj ˛a I zwi ˛azana jest para (α, β) warunków logicznych zwanych odpowiednio warunkiem pocz ˛atkowym (przesłank ˛a) i warunkiem ko ´ncowym (wnioskiem) instrukcji.
{α} I {β}
α okre´sla warunek nało˙zony na dane wej´sciowe instrukcji I, za´s β – warunek nało˙zony na wynik I.
Definicja 1.7
Warunek γ nazywamy niezmiennikiem instrukcji I wtt gdy γ zachodzi PRZED i PO wykonanie I dla ka˙zdego obliczenia tej instrukcji.
Innymi słowy, instrukcja nie zmienia warunku γ (jest on niezmienniczy wzgl˛edem I).
Cz˛e´sciowa poprawno´s´c
Definicja 1.8
Algorytm nazywamy cz˛e´sciowo poprawnym wzgl˛edem warunku
pocz ˛atkowego α i warunku ko ´ncowego β wtt gdy dla ka˙zdych danych
pocz ˛atkowych spełniaj ˛acych warunek α, je´sli obliczenie algorytmu dochodzi do punktu ko´ncowego, to warto´sciowanie ko´ncowe spełnia warunek β.
Uwagi:
Ka˙zdy algorytm A NIE JEST cz˛e´sciowo poprawny wzgl˛edem warunków (true, f alse) i ka˙zdy JEST cz˛e´sciowo poprawny wzgl˛edem
(f alse, true).
Czy algorytm p˛etl ˛acy si˛e jest cz˛e´sciowo poprawny wzgl˛edem zadanych asercji α i β?
Odpowied´z: TAK.
Własno´s´c stopu i okre´slono´s´c oblicze ´n
Definicja 1.9
Algorytm ma własno´s´c stopu wzgl˛edem warunku pocz ˛atkowego α wtt gdy dla ka˙zdych danych pocz ˛atkowych spełniaj ˛acych α obliczenie algorytmu jest
sko´nczone.
Definicja 1.10
Algorytm ma własno´s´c okre´slono´sci oblicze ´n wzgl˛edem warunku
pocz ˛atkowego α wtt gdy dla ka˙zdych danych pocz ˛atkowych spełniaj ˛acych α obliczenie algorytmu nie jest przerwane.
Semantyczna poprawno´s´c
Definicja 1.11
Algorytm A nazywamy semantycznie poprawnym wzgl˛edem warunku pocz ˛atkowego α i warunku ko ´ncowego β wtt gdy dla ka˙zdych danych wej´sciowych spełniaj ˛acych α obliczenie algorytmu dochodzi do punktu ko´ncowego i ko´ncowe warto´sciowanie zmiennych spełnia warunek β.
Synonimy:
algorytm semantycznie poprawny, algorytm poprawny, algorytm zgodny ze specyfikacj ˛a.
Algorytm poprawny wzgl˛edem w.p. α i w.k. β to algorytm:
cz˛e´sciowo poprawny wzgl˛edem w.p. α i w.k. β
maj ˛acy własno´s´c okre´slono´sci oblicze´n wzgl˛edem w.p. α maj ˛acy własno´s´c stopu wzgl˛edem w.p. α.
Metoda niezmienników
Metoda niezmienników Naura–Floyda dowodzenia cz˛e´sciowej poprawno´sci programów i okre´slono´sci ich oblicze´n polega na:
wyró˙znieniu w algorytmie pewnych miejsc
zwi ˛azanie z nimi warunków opisuj ˛acych zale˙zno´sci mi˛edzy warto´sciowaniami zmiennych
udowodnieniu spełnialno´sci tych warunków dla ka˙zdego obliczenia algorytmu, dla którego spełniony jest warunek pocz ˛atkowy α.
Uwagi:
Własno´s´c stopu dowodzimy oddzielnie.
Bardzo istotny jest wybór miejsc w algorytmie. W szczególno´sci wa˙znym jest ustalenie niezmienników p˛etli. W dowodach stosujemy zasad˛e
indukcji matematycznej.
Schemat post˛epowania
begin
{α}
E0: I1;
E1: while ϕ do I2 od; {γ}
E2: {β}
end;
Zakładamy α i konstruujemy warunek γ.
Rozwa˙zamy E0 → E1: po wykonaniu I1 dowodzimy, ˙ze γ zachodzi (zachodzi przed 1–szym obrotem p˛etli).
Rozwa˙zamy E1 → E1: zakładamy γ i ϕ; dowodzimy, ˙ze γ zachodzi po wykonaniu I2.
Rozwa˙zamy E1 → E2: z γ i ¬ϕ dowodzimy β.
Przykład
Udowodni´c cz˛e´sciow ˛a poprawno´s´c nast˛epuj ˛acego algorytmu:
begin
{α : x ≥ 0 ∧ y > 0}
E0: z := 0; u := x;
E1: while u > 0 do z := z + y;
u := u − 1;
od;
E2: {β : z = x ∗ y}
end;
Dowód:
Załó˙zmy, ˙ze dane wej´sciowe (zmienne x i y) spełniaj ˛a α.
Wyznaczmy niezmiennik p˛etli: {γ : x ∗ y = z + u ∗ y ∧ u ≥ 0}.
E0 → E1: Teraz z = 0 i u = x. Zatem z + u ∗ y = 0 + x ∗ y = x ∗ y. Z α, x ≥ 0, wi˛ec u ≥ 0. Wobec tego γ spełniony przed wej´sciem do p˛etli.
Przykład (cd.)
begin
{α : x ≥ 0 ∧ y ≥ 0}
E0: z := 0; u := x;
E1: while u > 0 do {γ : x ∗ y = z + u ∗ y ∧ u ≥ 0}
z := z + y;
u := u − 1;
od;
E2: {β : z = x ∗ y}
end;
E1 → E1: Załó˙zmy, ˙ze (Z.1) γ(z, u)
(Z.2) u > 0 (“wchodzimy” do p˛etli).
Poka˙zemy, ˙ze (T) γ(z′, u′).
Przykład (cd.)
begin
{α : x ≥ 0 ∧ y ∧ 0}
E0: z := 0; u := x;
E1: while u > 0 do {γ : x ∗ y = z + u ∗ y ∧ u ≥ 0}
z := z + y;
u := u − 1;
od;
E2: {β : z = x ∗ y}
end;
Po wykonaniu instrukcji p˛etli mamy z′ = z + y i u′ = u − 1. Teraz z′ + u′ ∗ y = (z + y) + (u − 1) ∗ y = z + u ∗ y z γ
= x ∗ y.
Z (Z.2), u > 0, wi˛ec u − 1 ≥ 0, zatem u′ ≥ 0.
Wobec tego γ(z′, u′) zachodzi.
Na mocy zasady indukcji matematycznej wnioskujemy, ˙ze γ jest niezmiennikiem p˛etli.
Przykład (cd.)
begin
{α : x ≥ 0 ∧ y ∧ 0}
E0: z := 0; u := x;
E1: while u > 0 do {γ : x ∗ y = z + u ∗ y ∧ u ≥ 0}
z := z + y;
u := u − 1;
od;
E2: {β : z = x ∗ y}
end;
E1 → E2: Teraz γ zachodzi oraz u ≤ 0 (bo “wychodzimy” z p˛etli). Warunki u ≥ 0 (z γ) i u ≤ 0 daj ˛a u = 0.
Z γ otrzymujemy x ∗ y = z + u ∗ y = z + 0 ∗ y = z. Zatem β zachodzi.
Algorytmy i Struktury Danych
Wykład 2:
Analiza algorytmów (cd.)
dr Anna Maria Radzikowska
Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska
Analiza poprawno´sci algorytmów – cd.
Własno´s´c stopu algorytmów
Przypomnienie:
Algorytm ma własno´s´c stopu wzgl˛edem warunku pocz ˛atkowego α wtt gdy dla ka˙zdych danych pocz ˛atkowych spełniaj ˛acych α jego obliczenie dochodzi do punktu ko´ncowego.
Obliczenie niesko´nczone mo˙ze wyst ˛api´c w trakcie realizacji instrukcji iteracyjnej lub realizacji rekursji.
Własno´s´c stopu dowodzimy stosuj ˛ac metod˛e niezmienników.
Najpopularniejsze metody:
Metoda liczników iteracji (tak˙ze: uogólniona metoda liczników).
Metod˛e malej ˛acych warto´sci.
Metoda liczników iteracji
Rozwa˙zmy algorytm A:
begin
while ϕ do I
od;
end;
Idea metody:
Przy pomocy nowej zmiennej całkowitej l zliczamy liczb˛e wykonanych iteracji. Wykazujemy, ˙ze ilo´s´c obrotów p˛etli jest
sko´nczona, tj. warto´s´c zmiennej l jest ograniczona przez wyra˙zenie arytmetyczne o warto´sciach dodatnich i nie ulegaj ˛ace zmianie przy ka˙zdym obrocie p˛etli.
Metoda liczników iteracji (cd.)
begin
while ϕ do I
od;
end;
Metoda post˛epowania:
Wprowadzamy now ˛a, nie wyst˛epuj ˛ac ˛a w algorytmie, zmienn ˛a całkowit ˛a l (licznik) i przy ka˙zdym obrocie p˛etli zwi˛ekszamy l o 1.
Wyznaczamy wyra˙zenie arytmetyczne τ , którego warto´s´c nie zmienia si˛e w trakcie obrotów p˛etli.
Wykazujemy, ˙ze warunek l ≤ τ jest niezmiennikiem p˛etli.
Metoda liczników iteracji (cd.)
Algorytm A′:
begin {α}
l := 0;
while ϕ do {γ ∧ (l ≤ τ )}
I;
l := l + 1;
od;
end;
Twierdzenie 2.1 (kryterium liczników) Je˙zeli
1. warunek γ ∧ (l ≤ τ ) jest niezmienikiem p˛etli w A′ wzgl˛edem warunku pocz ˛atkowego α,
2. instrukcja I ma własno´s´c stopu wzgl˛edem warunku γ ∧ ϕ,
to algorytmy A i A′ maj ˛a własno´s´c stopu wzgl˛edem warunku pocz ˛atkowego α.
Przykład 2.1
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x;
E1: while r ≥ y do {γ : (x = q ∗ y + r) ∧ (r ≥ 0)}
q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
Zmienn ˛a q przyjmujemy za licznik iteracji. Ponadto, niech τ = xy. Łatwo sprawdzi´c, ˙ze γ jest niezmiennikiem p˛etli. Poka˙zemy, ˙ze
{γ∗ : (l ≤ τ )}
te˙z jest niezmiennikiem p˛etli.
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x;
E1: while r ≥ y do {γ∗ : q ≤ xy} q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
E0 → E1: Teraz q = 0 i r = x. Z α mamy xy ≥ 0. Zatem q = 0 ≤ xy.
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x;
E1: while r ≥ y do {γ∗ : q ≤ xy} q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
E1 → E1: Załó˙zmy:
(Z.1) γ∗(q) (Z.2) r ≥ y.
Wyka˙zemy:
(T) γ∗(q′).
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x;
E1: while r ≥ y do {γ∗ : q ≤ xy} q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
Po wykonaniu instrukcji p˛etli i mamy q′ = q + 1 i r′ = r − y. Zmienne x i y nie zmieniaj ˛a si˛e w p˛etli. Z γ, x = q′ ∗ y + r′, wi˛ec q′ = xy − ry′, co wobec r′ ≥ 0 (z γ) daje q′ ≤ xy. Tym samym q ≤ xy jest niezmiennikiem p˛etli.
Na mocy kryterium liczników algorytm ma własno´s´c stopu.
Uogólniona metoda liczników
Algorytm A:
begin
while ϕ do I od end;
Uogólnienie:
Ustalamy wyra˙zenie w o warto´sciach całkowitych, którego warto´s´c ro´snie przy ka˙zdym obrocie p˛etli (rosn ˛acy ci ˛ag warto´sciowa´n).
Ustalamy wyra˙zenie arytmetyczne τ , którego warto´s´c nie zmienia si˛e przy
˙zadnym obrocie p˛etli.
Udowadniamy, ˙ze (w′ > w) ∧ (w ≤ τ ) jest niezmiennikiem p˛etli (tu: w′ to nowa warto´s´c wyra˙zenia w po obrocie p˛etli).
Uogólniona metoda liczników (cd.)
A:
begin
while ϕ do {γ}
I od end;
A′′:
begin
t := w − 1;
while ϕ do {γ}
t := w;
I od end;
Twierdzenie 2.2 (uogólnione kryterium liczników) Je´sli
1. warunek γ ∧ (t < w) ∧ (w ≤ τ ) jest niezmiennikiem p˛etli w A′′
wzgl˛edem warunku α,
2. algorytm I ma własno´s´c stopu wzgl˛edem warunku γ ∧ ϕ,
to oba algorytmy A i A′′ maj ˛a własno´s´c stopu wzgl˛edem warunku α.
Metoda malej ˛acych warto´sci
A :
begin {α}
while ϕ do {γ}
I od;
end;
Metoda dualna wobec uogólnionego kryterium liczników:
Ustalamy wyra˙zenie arytmetyczne w o warto´sciach całkowitych, którego warto´s´c maleje przy ka˙zdym obrocie p˛etli.
Ustalamy wyra˙zenie arytmetyczne τ , którego warto´s´c nie zmienia si˛e przy ka˙zdym obrocie p˛etli.
Udowadniamy, ˙ze warunek (w′ < w) ∧ (w ≥ τ ) jest niezmienniczy w p˛etli.
Metoda malej ˛acych warto´sci (cd.)
A :
begin {α}
while ϕ do {γ}
I od end;
A′′′ :
begin {α}
t := w + 1;
while ϕ do {γ}
t := w;
I od end;
Twierdzenie 2.3 (kryterium malej ˛acych warto´sci) Je´sli
1. warunek γ ∧ (t > w) ∧ (w ≥ τ ) jest niezmiennikiem p˛etli przy warunku pocz ˛atkowym α w algorytmie A′′′
2. algorytm I ma własno´s´c stopu przy warunku γ ∧ ϕ, to oba algorytmy A i A′′′ maj ˛a własno´s´c stopu wzgl˛edem α.
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x; w := r + y;
E1: while r ≥ y do {γ : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
w := r;
q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
Jako warto´s´c malej ˛ac ˛a przyjmujemy warto´sci zmiennej r. Udowodnimy, ˙ze γ∗ : (w > r) jest niezmiennikiem p˛etli.
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x; w := r + y;
E1: while r ≥ y do {γ : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
w := r;
q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
E0 → E1: Z α, y > 0, wi˛ec w = r + y > r. Zatem γ∗ zachodzi.
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x; w := r + y;
E1: while r ≥ y do {γ : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
w := r;
q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
E1 → E1: Załó˙zmy, ˙ze (Z.1) γ∗(r)
(Z.2) r ≥ y.
Wyka˙zemy, ˙ze (T) γ∗(r′).
Przykład 2.1 (cd.)
begin
{α : x ≥ 0 ∧ y > 0}
E0: q := 0; r := x; w := r + y;
E1: while r ≥ y do {γ : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
w := r;
q := q + 1;
r := r − y od;
E2: {β : (x = q ∗ y + r) ∧ (0 ≤ r < y)}
end;
Z (Z.2), w′ = r i r′ = r − y. Poniewa˙z y > 0 (z α), wi˛ec r′ < r = w′. Zatem γ∗(q′) zachodzi.
Pokazali´smy, ˙ze γ∗ jest niezmiennikiem p˛etli. Na mocy kryterium malej ˛acych warto´sci algorytm ma własno´s´c stopu.
Zło˙zono´s´c algorytmów
Poj˛ecia pomocnicze
Definicja 2.1
Niech X 6= ∅ oraz niech f, g : X → R. Mówimy, ˙ze f jest co najwy˙zej rz˛edu g, ozn. f = O(g), wtt gdy
(∃c > 0) |f (x)| ≤ c · |g(x)|
dla prawie wszystkich x ∈ X.
co najmniej rz˛edu g, ozn. f = Ω(g), wtt gdy (∃c > 0) |f (x)| ≥ c · |g(x)|
dla prawie wszystkich x ∈ X
dokładnie rz˛edu g, ozn. f = Θ(g), wtt gdy
(∃c1, c2 > 0) c1 · |g(x)| ≤ |f (x)| ≤ c2 · |g(x)|
dla prawie wszystkich x ∈ X.
Poj˛ecia podstawowe (cd.)
Twierdzenie 2.4.
Niech f, g, h : X → R.
Je´sli f = O(g) i g = O(h), to f = O(h) Je´sli f = Θ(g) i g = Θ(h), to f = Θ(h) Je´sli f = O(g) i g = O(f ), to f = Θ(g) Je´sli f = Θ(g), to g = Θ(f ).
Przykład 2.2
f (n) = n·log n + n + √
n, n ∈ N.
f = Θ(n·log n).
Efektywno´s´c algorytmów
Rozwa˙za´c b˛edziemy teraz algorytm A o zbiorze danych wej´sciowych D i własno´sci stopu dla wszystkich d ∈ D.
Efektywno´s´c A:
czasowa : mierzona liczb ˛a wykonanych operacji przez algorytm A dla danych d ∈ D.
pami˛eciowa : mierzona liczb ˛a komórek pami˛eci potrzebnych do realizacji algorytmu dla danych d ∈ D.
Dla ró˙znych danych d efektywno´s´c A jest zwykle ró˙zna. Rozwa˙zane s ˛a przypadki
najgorszy przeci˛etny najlepszy.
Operacje jednostkowe
Efektywno´s´c czasow ˛a algorytmów b˛edziemy mierzy´c liczb ˛a wykonanych operacji elementarnych. Operacj ˛a elementarn ˛a jest:
wykonanie operatora artymetycznego, logicznego, relacyjnego nadanie warto´sci zmiennej
obliczanie warto´sci zmiennej indeksowanej, wskazywanej, atrybutu rekordu
przekazanie parametru do podprogramu inicjalizacja wywołania podprogramu wykonanie instrukcji wej´scia/wyj´scia.
Pełna funkcje kosztu
Definicja 2.2
Pełn ˛a funkcj ˛a kosztu algorytmu A nazywamy funkcj˛e t : D → N, gdzie t(d) jest liczb ˛a wszystkich operacji jednostkowych wykonanych przez algorytm A dla danych d.
Zwykle bardzo trudno (je´sli w ogóle) jest wyznaczy´c pełn ˛a funkcj˛e kosztu.
Zatem w´sród danych wej´sciowych wyró˙zniamy te, które maj ˛a istotny wpływ na koszt algorytmu.
Wymiar danych
Zwykle D = D1 × D2 × . . . × Dk. Wymiarem danych jest funkcja
| · | : D → W , gdzie W = Di1 × . . . × Dik. Przykład 2.2
Danymi algorytmu mno˙zenia macierzy An×m i Bm×k jest d = (A, B, n, m, k). Wtedy |d| = (n, m, k).
Danymi algorytmu porz ˛adkowania ci ˛agu n–elementowego s ˛a d = (A, n).
Wtedy |d| = n.
Funkcja kosztu
Definicja 2.3.
Funkcj ˛a kosztu algorytmu nazywamy funkcj˛e T : W → N okre´slon ˛a nast˛epuj ˛aco:
T (w) = sup{t(d) : d ∈ D & |d| = w}.
Synonimy:
funkcja kosztu, funkcja przypadku niepomy´slnego, funkcja
zło˙zono´sci czasowej, zło˙zono´s´c czasowa, pesymistyczna zło˙zono´s´c czasowa.
Funkcja kosztu (cd.)
Analizuj ˛ac efektywno´s´c algorytmu dogodnie jest rozwa˙za´c wybrane operacje jednostkowe zwane operacjami dominuj ˛acymi — s ˛a to te operacje, których liczba wykona´n w algorytmie (dla wszystkich d ∈ D) jest dokładnie rz˛edu wszystkich wykonanych operacji.
Twierdzenie 2.4 Niech T b˛edzie funkcj ˛a kosztu wyznaczon ˛a wzgl˛edem wszystkich operacji jednostkowych oraz niech Tdom b˛edzie funkcj ˛a kosztu wyznaczon ˛a wzgl˛edem operacji dominuj ˛acych. Wówczas T = Θ(Tdom).
Przykład 2.3
Zbada´c zło˙zono´s´c nast˛epuj ˛acego algorytmu:
begin
{α : n ≥ 0}
z := 1; k := 0;
while n > k do z := z + z;
k := k + 1 od;
{β : z = 2n} end;
Operacja dominuj ˛aca: np.
dodawanie z + z.
Dla ka˙zdego obrotu p˛etli wykonywana jest 1 operacja dominuj ˛aca.
Liczba obrotów p˛etli: n.
Zatem T (n) = Θ(n).
´Srednia zło˙zono´s´c czasowa
Załó˙zmy, ˙ze dane jest prawdopodobie´nstwo wyst ˛apienia na wej´sciu danych d ∈ D wymiaru |d| = w, ozn. Pw(d). Zakładamy, ˙ze P
|d|=w Pw(d) = 1 dla wszystkich w ∈ W .
Definicja 2.4
Sredni ˛´ a zło˙zono´sci ˛a czasow ˛a nazywamy funkcj˛e Tave : W → R+ okre´slon ˛a nast˛epuj ˛aco:
Tave(w) = P
|d|=w Pw(d) · t(d).
´Srednia zło˙zono´s´c czasowa (cd.)
´Sredni ˛a zło˙zono´s´c czasow ˛a wygodniej jest szacowa´c przymuj ˛ac Tave(w) = P
|d|=w Pw(d) · t′(d).
gdzie t′(d) to liczba operacji dominuj ˛acych wykonywanych dla d ∈ D.
Twierdzenie 2.4 Tave = Θ(Tave′ ).
Zło˙zono´s´c pami˛eciowa
Definicja 2.5 Pełn ˛a funkcj ˛a zło˙zono´sci pami˛eciowej algorytmu A jest funkcja s : D → N, gdzie s(d) to liczba wszystkich komórek pami˛eci potrzebnych do realizacji A dla danych d ∈ D.
Definicja 2.6 Funkcj ˛a zło˙zono´sci pami˛eciowej algorytmu A nazywamy funkcj˛e S : W → N okre´slon ˛a nast˛epuj ˛aco:
S(w) = sup{s(d) : d ∈ D & |d| = w}
Definicja 2.7 Sredni ˛´ a zło˙zono´sci ˛a pami˛eciow ˛a algorytmu A nazywamy funkcj˛e Save : W → R+ okre´slon ˛a nast˛epuj ˛aco:
Save(w) = P
|d|=w Pw(d) · s(d).
Kryteria zło˙zono´sci
Dwa kryteria zło˙zono´sci:
jednolite (najpopularniejsze) logarytmiczne.
Kryterium jednolite:
ka˙zda operacja jednostkowa jest realizowana w stałym czasie (niezale˙znym od warto´sci jej argumentów)
ka˙zda warto´s´c typu prostego/wska´znikowego zajmuje stałe pole pami˛eci.
Dalej to wła´snie kryterium b˛edziemy stosowa´c.
Kryterium logarytmiczne
Kryterium logarytmiczne:
czas realizacji operacji jednostkowej jest wprost proporcjonalny do sumy długo´sci binarnej jej argumentów
ka˙zda warto´s´c typu prostego/wska´znikowego zajmuje pole pami˛eci proporcjonalne do jej długo´sci binarnej.
Długo´s´c binarna liczby n: bin(n) =
1 dla n = 0
⌊log n⌋ + 1 dla n > 0
Algorytmy i Struktury Danych
Wykład 3:
Analiza algorytmów (cd.), Problem sortowania
dr Anna Maria Radzikowska
Wydział Matematyki i Nauk Informacyjnych Politechnika Warszawska
Równania rekurencyjne
Równania rekurencyjne
Wykorzystywane przy badaniu zło˙zono´sci algorytmów rekurencyjnych.
Definicja 3.1 Równaniem rekurencyjnym nazywamy równanie postaci:
xn = f (xn−1, . . . , xn−k) , gdzie (xi)∞i=0 jest pewnym ci ˛agiem, k ≥ 1.
Twierdzenie 3.1
Twierdzenie 3.1 Niech a, b, c ∈ R+ oraz niech n ∈ ck dla k ∈ N.
Rozwi ˛azaniem równania rekurencyjnego postaci T (n) =
b dla n = 1
a · T (nc ) + b · n dla n > 1 jest
T (n) =
Θ(n) dla a < c Θ(n log n) dla a = c Θ(nlogc a) dla a > c
Twierdzenie to umo˙zliwia rozwi ˛azanie pewnych równa´n rekurencyjnych dla n b˛ed ˛acych pot˛egami c.
Twierdzenie 3.1 – dowód
T (n) =
b dla n = 1
a · T (nc ) + b · n dla n > 1 Dowód:
T (n) = aT n c
+ bn = ah
aT n c2
+ bn c
i + bn = a2T n c2
+ abn
c + bn
= a2 h
aT n c3
+ b n c2
i + abn
c + bn = a3T n c3
+ a2b n
c2 + abn
c + bn
= . . . = akT n ck
+ bn
k−1
X
i=0
a c
i
= akb + bn
k−1
X
i=0
a c
i
= ak
ck bn + bn
k−1
X
i=0
a c
i
= bn
k
X
i=0
a c
i
.
Twierdzenie 3.1 – dowód (cd.)
T (n) = bn
k
X
i=0
a c
i
, n = ck, k ∈ N.
Przypadek 1.
Niech a < c. Szereg
∞
X
i=0
a c
i
jest zbie˙zny, wi˛ec T (n) = Θ(n).
Przypadek 2.
Niech a = c. Wtedy
k
X
i=0
a c
i
= k + 1 = logc n + 1.
Zatem T (n) = bn (logc n + 1) = Θ(n log n).
Twierdzenie 3.1 – dowód (cd.)
Przypadek 3.
Niech a > c. Zauwa˙zmy najpierw, ˙ze loga n = logc n
logc a =⇒ logc n = (loga n) (logc a).
ck = n =⇒ k = logc n.
k = (loga n) (logc a).
ak = a(loga n)(logc a) = nlogc a.
Twierdzenie 3.1 – dowód (cd.)
T (n) = bn
k
X
i=0
a c
i
, n = ck, k ∈ N.
ak = nlogc a.
T (n) = bn
k
X
i=0
a c
i
= bn1 − ack+1
1 − ac = bnc − ak+1ck
c − a = bnc − a · ak
n
c − a
= bc
c − an − ba · ak
c − a = bc
c − an − ba
c − anlogc a = Θ(nlogc a).
Czy podane twierdzenie mo˙zna uogólni´c dla wszystkich liczb naturalnych?
Twierdzenie 3.2
Twierdzenie 3.2 Je´sli
(Z.1) T : N → N i f : R+ → R+ s ˛a funkcjami niemalej ˛acymi (Z.2) T (ak) = Θ(f (ak)) dla k ∈ N i a > 1
(Z.3) (∃x0 > 0) (∃c > 0) (∀x ≥ x0) f (ax) ≤ cf (x) to T (n) = Θ(f (n)) dla ka˙zdego n ∈ N.
To twierdzenie umo˙zliwia rozszerzenie rozwi ˛azania uzyskanego w
Twierdzeniu 3.1 na wszystkie liczby naturalne, o ile rozwi ˛azanie jest funkcj ˛a ograniczon ˛a wielomianowo.