Temos que provar que para algum c e n0, a definição é verdadeira. Suponha que c=3 (um chute!) 2n2+101010≤cn2=3n2≤n2≤n
Como 10≈3.16<4, a última expressão é verdadeira para n0=4
Portanto, se escolhermos c=3 e n0=4, temos que T(n)=O(n2).
Resolução de exercícios
Mostre que T(n)=n1/2 é O(n2/3)
Temos que provar que para algum c e n0, a definição é verdadeira. n1/2logn1/21/2logn1/2logn−2/3logn−1/6logn≤cn2/3≤logcn2/3≤logc+2/3logn≤logc≤logc
Como a função log é positiva para qualquer valor maior que 1, podemos escolhar c=1 e n0=1.
Resolução de exercícios
Mostre que T(n)=logan é O(logbn)
Temos que provar que para algum c e n0, a definição é verdadeira. loganlogxalogxnlogxalogxblogab≤clogbn≤clogxblogxn≤c≤c
Dados quaisquer valores de a e b, sempre é possível escolher uma constante c que é maior ou igual a logab, para qualquer n positivo.
Equação de recorrência
Na aula passada vimos que a equação o tempo de execução do algoritmo MergeSort é dado por T(n)={Θ(1),2T(n/2)+Θ(n),se n = 1se n> 1
Essa é uma equação de recorrência
Equação de recorrência
Uma equação de recorrência nos dá uma fórmula para T(n) em termos de T(algo menor que n)
O desafio é: Dada uma equação de recorrência para T(n), encontrar uma expressão fechada para T(n) (ou seja, uma expressão que não dependa de T(algo menor que n) )
Por exemplo, T(n)=O(nlogn)
Equação de recorrência
Na aula passada resolvemos a recorrência iterativamente "desdobrando" a equação T(n)T(2k)=2T(n/2)+n(assumindo que n=2k)=2T(2k−1)+2k=2×T(2k−1)2T(2k−2)+212k−1+2k=22×T(2k−2)2T(2k−3)+222k−2+212k−1+2k⋮=2kT(1)+2k−121+...+212k−1+2k=2k+2k−121+...+212k−1+2k
Nem sempre o método iterativo para resolução de recorrências funciona bem.
Quando o tempo de execução de um algoritmo é descrito por uma recorrência nao tao balanceada como a dos exemplos dados, pode ser difıcil aplicar esse metodo.
Outro ponto fraco é que rapidamente os calculos podem ficar complicados.
Método de substituição
Esse metodo consiste simplesmente em provar por indução matemática que uma recorrência T(n) é limitada (inferiormente e/ou superiormente) por alguma função g(n).
Um ponto importante é que, como é uma prova por indução, é necessario que se saiba qual é a funçao g(n) de antemão.
Método de substituição
Vamos provar por indução que T(n)=2T(n/2)+n é O(n2)
Temos que provar que existem constantes c e n0 tal que se n>n0, então T(n)≤cn2
Caso base: T(1)=1
Hipótese de indução: T(m)≤m2 para 1≤m<n
Passo de indução: T(n)≤n2
Método de substituição
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que: T(n)=2T(n/2)+n≤2(22n2)+n=(n2/2)+n≤n2
em que a última desigualdade vale sempre que n≥2, que é o caso.
Portanto, mostramos por indução que T(n)≤cn2 para c≥1 e n≥n0=1, de onde concluímos que T(n) é O(n2)
Método de substituição
Provamos por substituição que T(n)=2T(n/2)+n é O(n2)
Entretanto, utilizando o método iterativo, sabemos que T(n)=2T(n/2)+n é O(nlogn)
Como no método por substituição temos que saber de antemão quem é a g(n), eventualmente podemos não utilizar a g(n) com menor crescimento assintótico
Método de substituição
Vamos provar por indução que T(n)=2T(n/2)+n é O(nlogn)
Temos que provar que existem constantes c e n0 tal que se n>n0, então T(n)≤cnlogn
Caso base: T(1)=1. Entretanto, o se usarmos n=1 como caso base temos que 1<0 (que não é válido). Mas se usarmos n=2 como base da indução temos que T(2)=2T(1)+2=4≤c⋅2log2 para c>2
Hipótese de indução: T(m)≤cmlogm para 2≤m<n
Passo de indução: T(n)≤nlogn
Método de substituição
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que:
T(n)=2T(n/2)+n≤2(c(n/2)log(n/2))+n=cnlogn−cn+n≤cnlogn, para c≥1
Portanto temos que T(n)≤cnlogn para c≥2 e n≥n0=2, e temos que T(n)=O(nlogn)
Método de substituição
Uma outra possibilidade é mostrar que T(n)=nlogn+n. Para isso, temos que provar que existem constantes c e n0 tal que se n>n0, então T(n)≤cnlogn+n
Caso base: T(1)=1. Nesse caso temos que 1≤1log1+1
Hipótese de indução: T(m)≤cmlogm+m para 1≤m<n
Passo de indução: T(n)≤nlogn
Método de substituição
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que: T(n)=2T(n/2)+n≤2((n/2)log(n/2)+n/2)+n=nlog(n/2)+2n=nlogn−n+2n=nlogn+n
Portanto temos que T(n)=O(nlogn).
Método de substituição
Para garantir que não consiguimos diminiru a ordem de grandeza de T(n), temos que provar que T(n)=Ω(nlogn). Para isso, temos que provar que existem constantes c2 e n0 tal que se n>n0, então c2nlogn≤T(n)
Caso base: T(1)=1. Nesse caso temos que 1≥1log1
Hipótese de indução: T(m)≥mlogm para 1≤m<n,c2=1
Passo de indução: T(n)≥nlogn
Método de substituição
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que: T(n)=2T(n/2)+n≥2((n/2)log(n/2))+n=nlogn
Portanto temos que T(n)=Ω(nlogn)
Método de substituição
(exemplo )
Prove que T(n)=4T(n/2)+n3 é Θ(n3).
Primeiramente vamos mostrar que T(n)=O(n3), ou seja T(n)≤cn3 para alguma constate c e n>n0:
Caso base: T(1)=1. Nesse caso temos que 1≤c13,∀c≥1
Hipótese de indução: T(m)≥cm3 para 2≤m<n
Passo de indução: T(n)≤cn3
Método de substituição
(exemplo )
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que:
T(n)=4T(n/2)+n3≤84cn3+n3≤cn3
que é verdadeira sempre que c≥2. Portando escolher c=2 (ou qualquer valor maior), provamos por indução que T(n)=O(n3)
Método de substituição
(exemplo)
Para mostrar que T(n)=Ω(n3), ou seja T(n)≥c2n3 para alguma constate c2 e n>n0:
Caso base: T(1)=1. Nesse caso temos que 1≥c213,∀c2≤1
Hipótese de indução: T(m)≥c2m3 para 2≤m<n
Passo de indução: T(n)≥c2n3
Método de substituição
(exemplo )
Assumindo que a hipótese é verdadeira e tomando m=n/2, temos que:
T(n)=4T(n/2)+n3≥84c2n3+n3≥c2n3
que é verdadeira sempre que c2≤2. Portando escolher c2=1 , provamos por indução que T(n)=Ω(n3)