POSCOMP 2019: Questão 21 Resolvida (Complexidade de algoritmos)

Por
| 

Logotipo do POSCOMP 2019

Questão

Considere os seguintes algoritmos recursivos que resolvem o mesmo problema em uma entrada de tamanho $n$:

  • Algoritmo 1: Divide o problema em 3 partes de tamanho $n/4$ cada e gasta um tempo adicional $O(1)$ por chamada.
  • Algoritmo 2: Divide o problema em 3 partes de tamanho $n/2$ cada e gasta um tempo adicional $O(n^2)$ por chamada.
  • Algoritmo 3: Divide o problema em 3 partes de tamanho $n/3$ cada e gasta um tempo adicional de $O(n)$ por chamada.

A complexidade dos algoritmos 1, 2 e 3 é, respectivamente:

  • (A) $\Theta\left(n^{\log_4 3}\right), \Theta\left(n^2\right), \Theta\left(n\log n\right)$
  • (B) $\Theta\left(\cfrac{n}{4}\right), \Theta\left(\cfrac{n}{2}\right), \Theta\left(\cfrac{n}{3}\right)$
  • (C) $\Theta(1), \Theta\left(n^2\right), \Theta(n)$
  • (D) $\Theta\left(n^4\right), \Theta\left(n^2\right), \Theta\left(n^3\right)$
  • (E) $\Theta\left(n^{\log_4 3}\right), \Theta\left(n^{\log_2 3}\right), \Theta\left(n^{\log_3 3}\right)$

Resolução

Esta questão será resolvida por etapas.

Complexidade do primeiro algoritmo

Seja $T_1(n)$ o tempo de execução do primeiro algoritmo para uma entrada de tamanho $n$. A chamada recursiva $T_1(n)$ terá como custo $3T_1(n/4)$, o que significa que o problema foi dividido em 3 partes de tamanho $n/4$, além do custo $O(1)$ da chamada.

A equação de recorrência para esse caso será

$$T_1(n)=3T_1(n/4)+O(1).$$

A recorrência anterior pode ser resolvida por meio do teorema mestre ou pelo método de Akra-Bazzi. Utilizaremos o primeiro.

$$a=3,b=4,f(n)=1$$

Essa recorrência se enquadra no primeiro caso do teorema mestre, considerando, dentre inúmeras possibilidades, $\epsilon=\log_4 3$

$$\begin{align*}f(n)&=O\left(n^{\log_b a -\epsilon}\right)\\&=O\left(n^{\log_4 3 -\epsilon}\right)\\&=O\left(n^{\log_4 3 -\log_4 3}\right)\\&=O\left(n^{0}\right)\\&=O (1)\end{align*}$$

Ou seja, $T_1=\Theta\left(\log_b a \right)= \Theta\left(\log_4 3 \right)$.

Complexidade do segundo algoritmo

Para o segundo algoritmo, denota-se o tempo de execução como $T_2(n)$. Nesse caso, o problema é dividido em 3 partes de tamanho $n/2$ e o custo é de $3T_2(n/2)$ mais o custo adicional de $O(n^2)$.

A equação de recorrência, portanto, é

$$T_2(n)= 3T_2(n/2)+O(n^2)$$

Conforme o teorema mestre, para essa recorrência $a=3$, $b=2$ e $f(n)=n^2$, o que faz com que $T_2(n)$ se enquadre no terceiro caso do teorema mestre, que será demonstrado a seguir.

Escolhendo convenientemente $\epsilon = 2-\log_2 3\approx 0{,}41$, obtém-se

$$\begin{align*}f(n)&=\Omega\left(n^{\log_b a + \epsilon}\right)\\& =\Omega\left(n^{\log_2 3 + (2-\log_2 3)}\right)\\& =\Omega\left(n^{\log_2 3 + 2-\log_2 3}\right)\\&=\Omega\left(n^2\right)\end{align*}$$

Como $f(n)=n^2=\Omega\left(n^2\right)$ é verdadeiro, então o limite assintótico anterior está correto.

Porém, ainda é necessário provar a condição de regularidade $af(n/b)\leq cf(n)$ para algum $c<1$ e $n$ suficientemente grande.

$$\begin{gather}af(n/b)\leq cf(n)\\3f(n/2)\leq cf(n)\\3(n/2)^2\leq cn^2\\3n^2/4 \leq cn^2\\3/4 \leq c\end{gather}$$

A desigualdade anterior é satisfeita para qualquer $c\geq 3/4$, consequentemente todo $c$ tal que $3/4\leq c<1$ satisfaz a condição de regularidade.

Isso demonstra que a recorrência $T_2(n)$ satisfaz o terceiro caso do teorema mestre e que, portanto,

$$T_2(n)=\Theta(f(n))=\Theta(n^2).$$

Complexidade do terceiro algoritmo

O tempo de execução do terceiro algoritmo será denotada por $T_3(n)$. Nesse algoritmo, o problema é dividido em 3 partes de tamanho $n/3$ cujo o custo é de $3T(n/3)$. O custo adicional por chamada é $O(n)$.

A partir dessas informações, chega-se na seguinte equação de recorrência

$$T_3(n)=3T_3(n/3)+O(n).$$

A recorrência em questão se enquadra no segundo caso do teorema mestre, onde $a=3$, $b=3$ e $f(n)=n$.

A demonstração exige seja provado que $f(n)=\Theta\left(n^{\log_b a}\right)$, que é verdade, uma vez que $\log_b a=\log_3 3=1$ e, portanto, $f(n)=\Theta\left(n\right)$.

Ou seja, $T_3(n)=\Theta\left(n^{\log_b a}\log n\right)= \Theta\left(n\log n\right)$.

Conclusão

Finalmente, concluímos que o primeiro algoritmo tem complexidade $T_1=\Theta\left(\log_4 3 \right)$, o segundo tem complexidade $T_2(n)= \Theta(n^2)$ e o terceiro tem complexidade $T_3(n)= \Theta\left(n\log n\right)$.

Portanto, a alternativa correta é a A.

Mais questões

Se você deseja mais questões resolvidas do POSCOMP 2019, acesse a tag Questões do POSCOMP 2019.

Agora, se você procura questões, gabaritos e caderno de questões de outras edições, então acesse a página POSCOMP.

Resolverei as questões conforme o tempo permitir e de acordo com os meus conhecimentos. Como eu não sei resolver todas as questões, recomendo que você consulte também o gabarito oficial do exame.

Obrigado pela leitura! Se você puder, considere apoiar financeiramente o Blog Cyberini. Qualquer valor doado contribui muito para a difusão do conhecimento.

Doar com PagSeguroDoar com PayPal


Siga o blog

Redes sociais: Facebook, Twitter, YouTube, Pinterest, Instagram, Telegram

Receba notificações de novas postagens e novidades do blog por e-mail.

Importante: utilize o bom senso na hora de comentar. Acesse a política de privacidade para maiores informações sobre comentários.

Nenhum comentário:

Postar um comentário