Professional Documents
Culture Documents
Wykład 3
Wiele ważnych algorytmów ma strukturę
rekurencyjną,
którą można opisać następująco:
Problem:
Dana jest tablica n liczb całkowitych :
a[1], ..., a[n].
Problem:
Znaleźć największy i najmniejszy element w
zbiorze n-elementowym S.
Załóżmy dodatkowo, że n jest potęgą liczby 2.
ZWYCIĘŻAJ:
Znajdź minimalne i maksymalne elementy w
zbiorach S1 i S2 a następnie wybierz element
mniejszy z dwóch znalezionych minimów i element
większy z dwóch znalezionych maksimów.
1 dla n = 2
T(n) =
2T(n/2) + 2 dla n > 2
1 dla n = 2
T(n) =
2T(n/2) + 2 dla n > 2
T(n) = ⋅ n − 2.
3
2
1 dla n = 2
T(n) =
2T(n/2) + 2 dla n > 2
T(n) = ⋅ n − 2.
3
2
a więc T(n)=O(n).
Marek Łatko 2005 33
Funkcja SILNIA ( n! )
0! = 1
n! = 1⋅2⋅.....⋅(n-1) ⋅n
0! = 1
n! = 1⋅2⋅.....⋅(n-1) ⋅n
1 dla n = 0
n!=
n ⋅ (n − 1) ! dla n > 0
Funkcja SILNIA(n);
początek
jeżeli n = 0 wtedy pisz (1)
w przeciwnym wypadku
pisz (n*SILNIA(n-1))
koniec
0≤0 TAK
0≤0 TAK 0! = 1
0≤0 TAK 0! = 1
1! =1•1=1
2! = 2•1!=2 •1
0≤0 TAK 0! = 1
UWAGA:
Każde wywołanie rekursywne zajmuje pewien obszaru pamięci
(zorganizowana jako stos). W przypadku bardzo dużej liczby
wywołań rekurencyjnych szybko może nastąpić przepełnienie
stosu, a w konsekwencji przerwanie pracy procedury.
F(4)
F(4)
F(3)
F(4)
F(3) F(2)
F(4)
F(3) F(2)
F(2) F(1)
F(4)
F(3) F(2)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
F(4)
F(3) F(2)
F(1) F(0)
T(n) = (1,6)n
n gdy m mod n = 0
NWP(m, n) =
NWP(n, m mod n) gdy m mod n ≠ 0
EUKLID(30,21) Æ
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID
•zmniejszanie się wartość drugiego argumentu, czyli
funkcja EUKLID zawsze się kończy i oblicza poprawny wynik.
EUKLID(30,21) Æ EUKLID(21,9) Æ
EUKLID(9,3) Æ EUKLID(3,0) = 3
Mamy tu:
•trzy rekurencyjne wywołania funkcji EUKLID
•zmniejszanie się wartość drugiego argumentu, czyli
funkcja EUKLID zawsze się kończy i oblicza poprawny wynik.
Liczba wywołań rekurencyjnych funkcji EUKLID dla m>n>0
wynosi: O(log n).
Tak Nie
a<>b
Tak Nie
a<>b
a>b
Tak Nie
Tak Nie
a<>b
a>b
Tak Nie
a:= a-b
Tak Nie
a<>b
a>b
Tak Nie
Tak Nie
a<>b
a
a>b
Tak Nie
Tak Nie
a<>b
a
a>b
Tak Nie Koniec
a:= a-b b:= b-a
Zadanie:
Przenieść wszystkie krążki na prawy kołek C wg zasad:
1. za jednym razem można zmienić położenie tylko jednego
krążka
2. żadnego krążka nie można umieścić na mniejszym krążku
Marek Łatko 2005 96
Wieża Hanoi
A B C
A B C
T1 = 1
Tn = 2Tn-1 +1
Funkcja złożoności czasowej:
T(n) = 2n - 1