Programkonstruktion och Datastrukturer, lektion 7 Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet 9 Dec 2010
Vad har följande funktion för tidskomplexitet? fun pow2 0 = 1 pow2 n = pow2(n 1) + pow2(n 1) Vi definierar en komplexitetsfunktion T för pow2, som givet en problemstorlek returnerar hur lång tid ett problem av den storleken tar att lösa. Eftersom pow2 är rekursivt definierat, ter det sig naturligt att också definiera T rekursivt: {? om n = 0 T (n) =? annars 9 Dec 2010-2 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
fun pow2 0 = 1 pow2 n = pow2(n 1)+pow2(n 1) 9 Dec 2010-3 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
fun pow2 0 = 1 pow2 n = pow2(n 1)+pow2(n 1) Låt c 1 beteckna kostnaden för att beräkna basfallet pow2(0). 9 Dec 2010-3 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
fun pow2 0 = 1 pow2 n = pow2(n 1)+pow2(n 1) Låt c 1 beteckna kostnaden för att beräkna basfallet pow2(0). När n 1, låt c 2 beteckna kostnaden för mönstermatchning samt de rödmarkerade additionerna och subtraktionerna. 9 Dec 2010-3 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
fun pow2 0 = 1 pow2 n = pow2(n 1)+pow2(n 1) Låt c 1 beteckna kostnaden för att beräkna basfallet pow2(0). När n 1, låt c 2 beteckna kostnaden för mönstermatchning samt de rödmarkerade additionerna och subtraktionerna. T kan då{ uttryckas: c1 om n = 0 T (n) = c 2 + 2T (n 1) annars 9 Dec 2010-3 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
Nästa steg är att uttrycka T på sluten form, dvs utan rekursion. En metod är följande tvåstegsraket: 1 Gissa hur den slutna formen kommer se ut. 2 Visa att din gissning stämmer med induktion. Att hitta en bra gissning kan vara svårt. Om man inte vet var man ska börja, kan man testa sig fram tills man ser mönstret. 9 Dec 2010-4 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
Vi testar att plugga in några värden i T: { c1 om n = 0 T (n) = c 2 + 2T (n 1) annars T (0) = c 1 T (1) = c 2 + 2T (0) = c 2 + 2c 1 T (2) = c 2 + 2T (1) = c 2 + 2(c 2 + 2c 1 ) = 3c 2 + 4c 1 T (3) = c 2 + 2T (2) = c 2 + 2(3c 2 + 4c 1 ) = 7c 2 + 8c 1 Vart och ett av fallen vi testade stämmer överens med formeln: T (n) = (2 n 1)c 2 + 2 n c 1 Men stämmer det för alla n? Vi försöker oss på ett induktionsbevis. 9 Dec 2010-5 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
Teorem T (n) = (2 n 1)c 2 + 2 n c 1 Bevis Med induktion över n. I basfallet är T (0) = c 1 = 0c 2 + 1c 1 = (2 0 1)c 2 + 2 0 c 1. I induktionssteget antar vi att T (n) = (2 n 1)c 2 + 2 n c 1, och visar T (n + 1) = (2 n+1 1)c 2 + 2 n+1 c 1. Vi får då att T (n + 1) = c 2 + 2T (n) (definitionen av T) = c 2 + 2((2 n 1)c 2 + 2 n c 1 ) (induktionshypotes) = c 2 + (2 n+1 2)c 2 + 2 n+1 c 1 = (2 n+1 1)c 2 + 2 n+1 c 1 9 Dec 2010-6 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
Vi har visat att T (n) = (2 n 1)c 2 + 2 n c 1, men vi har mer information än vad vi behöver: konstanterna c 1 och c 2 intresserar oss inte. Nästa steg är att uttrycka T (n) med Θ-notation, och således abstrahera bort konstanterna. Även här fungerar tvåstegsraketen: 1 Gissa. 2 Visa att gissningen stämmer. En uppenbar gissning är T (n) = Θ(2 n ). 9 Dec 2010-7 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
Teorem (2 n 1)c 2 + 2 n c 1 = Θ(2 n ) Bevis Enligt definitionen av Θ räcker det med att visa att det finns positiva konstanter a, b, n 0 sådana att olikheten a2 n (2 n 1)c 2 + 2 n c 1 b2 n gäller för alla n n 0. Om vi väljer t ex a = c 1 + c 2 1 och b = c 1 + c 2 kan vi skriva om den vänstra olikheten till: 2 n c 2 och den högra till: c 2 0 Den högra blir då uppenbart sann eftersom c 2 är positiv. Den vänstra blir sann om vi väljer t ex n 0 = lg 2 (c 2 ). 9 Dec 2010-8 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet
I uppgift 2 står det ingenstans vilka tidsenheter tidskomplexitetsfunktionerna ni fått använder. I synnerhet kan ni inte anta att de använder CPU-timmar. 9 Dec 2010-9 - Johannes Åman Pohjola & William Sjöstedt, Uppsala Universitet