Datastructuren Analyse van Algoritmen en O College 6
Dit onderwerp Nog twee voorbeelden van analyse van loopstructuren Analyse van algoritmen met recurrente betrekkingen Oplossen van recurrente betrekkingen Master-theorem
Loop-structuur-analyse soms met sommaties Voorbeeld 1: for i=1 to n do for j=1 to i do O(1) werk Voorbeeld 2: i=n while (i>1) do i=i/2 for j=1 to i do O(1) werk Voorbeeld 3:
Analyse van algoritmen met recurrente betrekkingen Merge-sort if n>1 then 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?
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: Als n>1 dan
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: Selection sort: Binary search: 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)
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))
Toepassen van de master theorem voorbeeld 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, en a f(n/b) £ c f(n) voor een constante c<1 dan T(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 theorem voorbeeld 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, en a f(n/b) £ c f(n) voor een constante c<1 dan T(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 theorem voorbeeld 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, en a f(n/b) £ c f(n) voor een constante c<1 dan T(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 theorem voorbeeld 3 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, en a f(n/b) £ c f(n) voor een constante c<1 dan T(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)
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)
Vaak handig en makkelijk te gebruiken als je ‘m eenmaal kent 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) Doe O(n) werk Sommige problemen kosten veel tijd om op te lossen… Maar liever niet!
Wat technieken voor analyse van algoritmen 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