Tidskomplexitet f�r rekursiva funktioner
Man kan ofta r�kna ut tidskomplexiteten f�r rekursiva
funktioner genom att st�lla upp och l�sa en rekursionsekvation.
H�r kommer n�gra exempel och en formel, ”m�starsatsen”,
som ger l�sningen f�r ett antal rekursionsekvationer som
ofta dyker upp n�r man analyser rekursiva funktioner.
Exempel 1: summa
Som uppv�rmning visar vi att f�ljande rekursiva metod
har linj�r tidskomplexitet.
/**
* Returnerar summan 1 + 2 + ... + n, d�r n >= 1.
*/
public long sum(int n) {
if (n == 1)
return 1;
return n + sum(n-1);
}
Vi b�rjar med att inf�ra funktionen T(n) som
�r antalet grundl�ggande ber�kningssteg som utf�rs vid
metodanropet sum(n). Vi hittar genast tv�
egenskaper hos T(n).
- Eftersom sum(1) ber�knas i ett fixt antal
ber�kningssteg k1 s� �r
T(1) = k1.
- Om n > 1 s� kommer metoden att g�ra
ett fixt antal ber�kningssteg k2
och dessutom ett rekursivt anrop till sum(n-1).
Detta rekursiva anrop kommer att utf�ra T(n-1)
ber�kningssteg. Vi f�r allts�
T(n) = k2 + T(n-1).
Om vi n�jer oss med en asymptotisk uppskattning av
tidskomplexiteten s� beh�ver vi inte k�nna till de
exakta v�rdena p� konstanterna
k1
och
k2 utan l�ter
k1 =
k2 = 1.
Vi har d� reducerat problemet att hitta tidskomplexiteten f�r
metoden
sum till att l�sa f�ljande rekurssionsekvation
- T(1) = 1, (*)
- T(n) = 1 + T(n-1),
n�r n > 1. (**)
Genom att anv�nda dessa tv� ekvationer kan vi ber�kna T(n)
f�r ett godtyckligt positivt heltal n. R�kningen ser
ut s� h�r.
T(n) = (**)
1 + T(n-1) = (**)
1 + (1 + T(n-2)) =
2 + T(n-2) = (**)
2 + (1 + T(n-3)) =
3 + T(n-3) = ...
k + T(n-k) = ...
n - 1 + T(1) = (*)
n - 1 + 1= Θ(n).
Exempel 2: bin�rs�kning
Precis samma metod kan anv�ndas �ven f�r mera komplicerade
rekursiva algoritmer. Det �r fortfarande lika enkelt att st�lla
upp rekursionsekvationen �ven om det kan vara mera komplicerat
att l�sa den. Vi provar att r�kna ut tidskomplexiteten f�r
bin�rs�kning.
private static final int NOT_FOUND = -1;
/**
* Returns index of the first occurence of key in the sorted
* subarray v[first..last], or -1 if key is not found.
* Precondition: first <= last.
*/
private int binSearch(int[] v, int first, int last, int key) {
if (first == last) {
return key == v[first] ? first : NOT_FOUND;
}
// subarray with more than one element
int mid = first + (last - first)/2;
if (key <= v[mid]) {
return binSearch(v, first, mid, key);
} else {
return binSearch(v, mid + 1, last, key);
}
}
Vi inf�r beteckningen T(n)
f�r antalet ber�kningssteg som algoritmen utf�r i v�rsta fall
vid ett anrop med en subvektor som inneh�ller n element.
F�r att g�ra problemt lite enklare n�jer vi oss med att
ber�kna den asymptotiska tidskomplexiteten. Vi kan d�
till�ta oss att s�tta samtliga konstanter till 1.
Rekursionsekvationen blir:
- T(1) = 1, (*)
- T(n) = 1 + T(n/2),
n�r n > 1. (**)
Ekvation (**) f�ljer av att metoden g�r ett konstant arbete
(det �r
1:an) och ett rekursivt anrop med en subvektor
av storlek
n/2. (Subvektorn kommer i vissa fall att
ha storlek
n/2 + 1 vid det rekursiva anropet.
Men det struntar vi i eftersom vi endast s�ker ett asymptotiskt svar.)
Om man inte kan n�gon teori f�r rekursionsekvationer s� f�r
man g�ra som i exemplet ovan och r�kna ut en l�sning genom
upprepad substitution. R�kningen ser ut s� h�r:
T(n) = (**)
1 + T(n/2) = (**)
1 + (1 + T(n/4)) = 2 + T(n/4) = (**)
2 + (1 + T(n/8)) = 3 + T(n/8) = ...
k + T(n/2k) = ...
log n + T(n/2log n) = log n + T(1) = (*)
log n + 1 = Θ(log n).
M�starsatsen
M�starsatsen �r ett recept som ger asymptotiska uppskattningar
f�r en klass av rekursionsekvationer som ofta dyker upp n�r
man analyserar rekursiva algoritmer.
M�starsatsen
L�t a ≥ 1 och b > 1
vara konstanter, l�t f(n) vara en funktion och
l�t T(n) vara en funktion �ver de positiva talen
definierad av rekursionen
T(n) = aT(n/b) + f(n).
Om
f(n) = Θ(nd),
d�r
d ≥ 0, s� g�ller
- T(n) = Θ(nd)
om a < bd,
- T(n) = Θ(ndlog n)
om a = bd,
- T(n) = Θ(nlogba)
om a > bd.
Vi hoppar �ver beviset. Det �r inte sv�rt, men l�ngt.
Man kan anv�nda upprepad substitution p� samma s�tt som
i de f�reg�ende exemplen.
L�t oss kontrollera att m�starsatsen ger r�tt l�sning
f�r rekursionsekvationen i exemplet med bin�rs�kning.
I detta fall �r a = 1,
b = 2 och
funktionen f(n) = 1. Det inneb�r
att f(n) = Θ(n0), det
vill s�ga d = 0.
Vi ser att a = bd
och kan d�rf�r anv�nda punkt tv� i m�starsatsen
som s�ger att
T(n) = Θ(n0log n).
Vilket st�mmer.