430 likes | 664 Views
Datastructuren Analyse van Algoritmen en O. College 6. Dit onderwerp. Sommaties en analyse van algoritmen Analyse van algoritmen met recurrente betrekkingen Oplossen van recurrente betrekkingen Master-theorem. 1. Sommaties EN LOOPSTRUCTUREN. Rekenkundige reeks.
E N D
Dit onderwerp • Sommaties en analyse van algoritmen • Analyse van algoritmen met recurrentebetrekkingen • Oplossen van recurrentebetrekkingen • Master-theorem
1 Sommaties EN LOOPSTRUCTUREN Datastructuren
Rekenkundige reeks • Een rekenkundige rij getallen is een rij getallen waarvan het verschil tussen twee opeenvolgende getallen steeds hetzelfde is • Voorbeeld: 4, 7, 10, 13, 16 • Een rekenkundige reeks is de sommatie van zo’n rij. Datastructuren
De uitkomst van een rekenkundige reeks • Onthoud: (eerste plus laatste)*aantal / 2 Datastructuren
Voorbeelden • for i=1 to n do • for j=1 toido • O(1) werk • for i=1 to ndo • for j=1 toido • for k = 1 to n do • O(1) werk Datastructuren
Voorbeelden (2) = • for i=1 to n do • for j=1 toido • O(1) werk • for i=1 to n do • for j=1 toido • for k = 0 to n do • O(1) werk = * n = Datastructuren
Meetkundige rijen en reeksen • Meetkundige rij: quotient van opeenvolgende getallen is steeds hetzelfde • Voorbeeld: 2 6 18 54 162 • Een meetkundige reeks is de sommatie van zo’n rij Datastructuren
Over de meetkundige reeks • Eerste term A • Groeifactor r • A Ar Ar2 Ar3 Ar4 ... Datastructuren
Uitkomst meetkundige reeks • = • Als de groeifactor een positief getal behalve 1 is: • (“volgende term” – eerste) / (groeifactor -1) • Volgende term: de eerste term die zou komen als we de rij eentje langer zouden maken, dus bij deze som: • En volgende term is 16 bij Datastructuren
Voorbeelden • = Datastructuren
Analyse met meetkundige reeks Voorbeeld: • k=1 • for i=1 to n do • k = k*3 • for j = 1 to k do • O(1) werk Datastructuren
Analyse met meetkundige reeks (2) Voorbeeld: • k=1 • for i=1 to n do • k = k*3 • for j = 1 to k do • O(1) werk Datastructuren
Nog eentje Voorbeeld: • i=n • while (i>1) do • i=i/2 • for j=1 to i do • O(1) werk Datastructuren
Nog eentje (2) Voorbeeld: • i=n • while (i>1) do • i=i/2 • for j=1 to i do • O(1) werk • O(n) werk Datastructuren
En deze? Voorbeeld: • i=n • while (i>1) do • i=i/2 • O(1) werk
En deze? Voorbeeld: • i=n • while (i>1) do • i=i/2 • O(1) werk • O(log n) iteraties van O(1) werk: O(log n) tijd
Oneindige geometrische reeks • … • ... • Als r>1 dan wordt dit oneindig • Als r<1 dan , dus: Convergentie Datastructuren
Resultaat oneindige meetkundige reeks Als Datastructuren
Harmonische reeks • Komen we straks ook nog tegen bij sommige datastructuren • … is niet op telossen. Hebbenzedaaromeennaampjegegeven: • ... Is ongeveer ln(n) Datastructuren
Analyse met Harmonische reeks • for i = 1 to n do • j = 1; • whilej < n do • O(1) work • j = j+ i Datastructuren
Analyse met Harmonische reeks(2) • for i = 1 to n do • j = 1; • whilej < n do • O(1) work • j = j+ i Datastructuren
2 Recurrente Betrekkingen Datastructuren
Merge-sort if n>1 then Recursie op n/2 elementen Recursie op n/2 elementen O(n) werk voor merge Else O(1) werk Schrijf: T(n) is de tijd van merge-sort op n elementen T(1)= Q(1) Als n>1, dan T(n) = 2T(n/2)+ Q(n) Hoe los je zo’n recurrente betrekking op? Analyse van algoritmen met recurrente betrekkingen
Methode 1: Substitutie • Gok de juiste vorm van de oplossing • Bewijs met inductie dat die gok goed is • Dus, als we hebben: • T(1)= Q(1) • Als n>1, dan T(n) = 2T(n/2)+ Q(n) • Schrijf dan eerst eens: • T(1)= a • Als n>1, dan T(n) = 2T(n/2)+ bn • Gok dan dat T(n) = cn lg n voor geschikte c • Nu …
Recursief sorteeralgoritme • We kijken even naar een simpel recursief sorteeralgoritme • Hoe analyseren we zijn looptijd?
Selection Sort • Selection sort (A, p, q) • {Sorteert de rij A[p … q]} • {Reken eerst uit waar de grootste waarde staat} • max = A[p]; • for i = p to q do • if A[i] > A[max] then max = i; • {Zet de grootste waarde achteraan} • Verwissel A[q] en A[max] • {Sorteer de rest recursief} • if (q>p+1) then Selection sort (A, p, q – 1)
Selection sort: de recurrente betrekking • T(1)=Q(1) • T(2)=Q(1) • Als n>2 dan • T(n) = T(n-1) + Q(n) • Of, equivalent, maar iets simpeler: • T(1)=Q(1) • Als n>1 dan • T(n) = T(n-1) + Q(n)
Twee voorbeelden voor substitutie • Selection sort: • T(1)= O(1) • T(n)= T(n-1)+O(n) • Binary search: • T(1) = O(1) • T(n) = T(n/2)+O(1)
Methode 2: De recursie-boom • Analyseer de recursie-boom • Hoeveel niveau’s heeft de boom? • Hoeveel werk doen we per level? • Sommeer het werk over de levels
Voorbeelden • Merge-sort: • T(1)= Q(1) • Als n>1, dan T(n) = 2T(n/2)+ Q(n) • Selection sort: • T(1)= O(1) • T(n)= T(n-1)+O(n) • Binary search: • T(1) = O(1) • T(n) = T(n/2)+O(1)
3 De MASTERTHEOREM Datastructuren
De master theorem • Stel a³1 en b>1 zijn constantes, f(n) is een functie en T(n) is een functie van de niet-negatieve (of positieve) integers), gedefineerd met: • T(n) = a T(n/b)+f(n) • Waarbij n/b zowel omhoog als omlaag kan afgerond worden • Voor kleine n … • Dan geldt dat: • Als f(n) = O(nlogb a- e)(n tot de macht logb a-e), voor constante e>0, dan T(n) = Q(nlogb a) • Als f(n) = Q(nlogb a), dan T(n) = Q(nlogb a* lg n) • Als f(n) = W(nlogb a+ e)(n tot de macht logb a+e), voor constante e>0, en a f(n/b) £ c f(n) voor een constante c<1 dan T(n) = Q(f(n))
Als f(n) = O(nlogb a- e)voor constante e>0, dan T(n) = Q(nlogb a) Als f(n) = Q(nlogb a), dan T(n) = Q(nlogb a* lg n) Als f(n) = W(nlogb a+ e)voor constante e>0, ena f(n/b) £ c f(n) voor een constante c<1 danT(n) = Q(f(n)) Vb: T(n)= 9T(n/3)+n a=9 b=3 logb a = log3 9 = 2 n = O(n2-1) Geval 1 is geldig: T(n) = Q(n2) Toepassen van de master theoremvoorbeeld type 1
Als f(n) = O(nlogb a- e)voor constante e>0, dan T(n) = Q(nlogb a) Als f(n) = Q(nlogb a), dan T(n) = Q(nlogb a* lg n) Als f(n) = W(nlogb a+ e)voor constante e>0, ena f(n/b) £ c f(n) voor een constante c<1 danT(n) = Q(f(n)) Vb:T(n)=T(2n/3)+1 a=1 b=3/2 logb a = log3/2 1 = 0 1 = Q(n0) = Q(1) Geval 2 is geldig: T(n) = Q(n0 log n) = Q(log n) Toepassen van de master theoremvoorbeeld type 2
Als f(n) = O(nlogb a- e)voor constante e>0, dan T(n) = Q(nlogb a) Als f(n) = Q(nlogb a), dan T(n) = Q(nlogb a* lg n) Als f(n) = W(nlogb a+ e)voor constante e>0, ena f(n/b) £ c f(n) voor een constante c<1 danT(n) = Q(f(n)) Vb:T(n)= 4 T(n/2)+ Q(n2) a=4 b=2 logb a = log2 4 = 2 Geval 2 is geldig: T(n) = Q(n2 log n) Toepassen van de master theoremvoorbeeld type 2 (nog eentje)
Als f(n) = O(nlogb a- e)voor constante e>0, dan T(n) = Q(nlogb a) Als f(n) = Q(nlogb a), dan T(n) = Q(nlogb a* lg n) Als f(n) = W(nlogb a+ e)voor constante e>0, ena f(n/b) £ c f(n) voor een constante c<1 danT(n) = Q(f(n)) Vb3: T(n)=3T(n/4)+n log n a=3 b=4 logb a = log4 3 < 1 Neem e = 1- log4 3 n log n = W(n) 3 (n/4) log (n/4) £ 3/4 n log n Dus neem c=3/4 Geval 3 is geldig: T(n) = Q(n log n) Toepassen van de master theoremvoorbeeld 3
Toepassing op algoritme int Voorbeeld (int[] A, int begin, int eind) • formaat = eind – begin + 1; • derdef = ë formaat / 3 û; • if (formaat < 3) then return A[begin] • else • int hulp = Voorbeeld(A, begin, begin + derdef) • hulp += Voorbeeld(A, begin+derdef+1, eind-derdef); • Return (hulp + Voorbeeld(A,eind-derdef,eind) • Schrijf n = eind – begin+1 • T(n) = …?
Toepassing op algoritme int Voorbeeld (int[] A, int begin, int eind) • formaat = eind – begin + 1; • derdef = ë formaat / 3 û; • if (formaat < 3) then return A[begin] • else • int hulp = Voorbeeld(A, begin, begin + derdef) • hulp += Voorbeeld(A, begin+derdef+1, eind-derdef); • Return (hulp + Voorbeeld(A,eind-derdef,eind) • Schrijf n = eind – begin+1 • T(n) = 3 T(n/3) + O(1) • Afrondingen kunnen we negeren
Toepassing op algoritme int Voorbeeld (int[] A, int begin, int eind) • formaat = eind – begin + 1; • derdef = ë formaat / 3 û; • if (formaat < 3) then return A[begin] • else • int hulp = Voorbeeld(A, begin, begin + derdef) • hulp += Voorbeeld(A, begin+derdef+1, eind-derdef); • Return (hulp + Voorbeeld(A,eind-derdef,eind) • Schrijf n = eind – begin+1 • T(n) = 3 T(n/3) + O(1) • Afrondingen kunnen we negeren • log33= 1 • O(1) = Q(n1-1) dus mastertheorem geeft: • T(n) = Q(n)
Over de mastertheorem • Bewijs in boek • Vaak handig en makkelijk te gebruiken als je ‘m eenmaal kent • Soms gevallen waar ‘t niet gaat • Bijvoorbeeld als T(n) = a T(n-1) + f(n) • Wat als je T(n) £aT(n/b)+f(n) hebt? • En wat als T(n) ³aT(n/b)+f(n) ? • Net zo, maar je krijgt alleen een O of W grens
Een exponentieel algoritme • Duur(n) • If n=1 dan O(1) werk • Ga in recursie met Duur(n-1) • Ga in recursie met Duur(n-1) • Doe O(n) werk Sommige problemenkosten veel tijd om opte lossen… Maar liever niet!
Conclusies • Wat technieken voor analyse van algoritmen • Recurrente betrekkingen oplossen • Gokken en controleren • Analyse van de recursieboom • Master-theorem • Inspectie loopstructuur • Analyse doen van binnen naar buiten • Soms: opschrijven van sommaties; ken en gebruik standaard sommaties