Datastrukturer och algoritmer - Tidskomplexitet
Jag har en fråga (egentligen två där den andra finns i ett annat inlägg) om tidskomplexitet. Uppgiften jag försöker lösa lyder:
Anta g(n) = 3n^2 + 2n +6. Visa att g(n) = O(n2).
Har fått följande förklarad till mig:
För att visa att g(n) = O(n^2), måste vi visa att det finns en konstant c och en gräns n0 så att g(n) <= c * n^2 för alla n >= n0.
Vi kan välja c = 3 och n0 = 1. Då får vi:
g(n) = 3n^2 + 2n + 6 <= 3 * n^2 ( * ) för alla n >= 1.
Detta visar att g(n) = O(n^2).
Fast på ( * ) raden tycker jag att det borde vara omvänt håll på olikhetstecknet eller tänker jag fel, hur kan man i så fall dra den slutsatsen?
Olikheten (*) är en falsk utsaga för alla n>=1. Så den ska du inte dra några slutsatser ifrån alls. Däremot förväntas du hitta ett c och ett n0, precis som du säger. Du ska hitta ett andragradspolynom som hela tiden är större än g(n) för alla n>=n0. Polynomet 3n2 duger inte. Det är hela tiden mindre än g(n) för alla n>=1.
Formella beviset av att polynom av grad n alltid begränsas av ett monom av grad n följer från triangelolikheten |a+b|<|a|+|b| och att xp<xq om x>1 och p<q (eftersom upprepad multiplikation med ett tal med ett tal som är större än 1 ger ett successivt större tal.
Såtter man ihop de påståendena får man
1. Triangelolikheten
|p(x)|=|anxn+an-1xn-1+...+a1x+a0|≤
Därefter
Så ett polynom av grad är alltid mindre än om är summan av absolutbeloppen hos koefficienterna (om x > 1)