Análise de Algoritmos

Ronaldo Cristiano Prati

Bloco A, sala 513-2

ronaldo.prati@ufabc.edu.br

Resolução de exercícios

  • Dado que f(n)=lognf(n) = \log \sqrt{n} e g(n)=log(100n)g(n) = \log (100 n), mostre que f(n)=O(g(n))f(n) = O(g(n))

lognclog(100n)logn1/2clog(100n)12×lognlog(100n)c12×lognlog(100)+log(n)c\begin{aligned} \log\sqrt{n} & \leq c \log(100 n) \\ \log n^{1/2} & \leq c \log(100n)\\ \frac{1}{2}\times\frac{\log n}{\log (100n)} & \leq c\\ \frac{1}{2}\times\frac{\log n}{\log (100) + \log(n)} & \leq c \end{aligned}

  • Observe que para n1n\geq 1, o termo lognlog(100)+log(n)\frac{\log n}{\log (100) + \log(n)} está constrito entre 0 e 1, portanto, podemos escolher c>1/2c>1/2 para um n01n_0 \geq 1

Resolução de exercícios

  • Dado que f(n)=n!f(n) = n! e g(n)=nlogng(n) = n \log n, mostre que f(n)f(n) não é O(g(n))O(g(n))

  • Vamos provar por absurdo.

n!cnlognn(n1)(n2)!cnlognn(n1)(n2)!cn(n1)(n2)!c\begin{aligned} n! & \leq c n \log n \\ n(n-1)(n-2)! & \leq c n \log n\\ n(n-1)(n-2)! & \leq c n (n-1)\\ (n-2)! & \leq c \end{aligned}

  • O quer claramente não é possível para n0>2n_0 > 2, uma vez que n!n! (e por consequência (n2)!(n-2)!) é sempre crescente, e não pode ser limita por uma constante.

Resolução de exercícios

  • Ordene as funções a seguir em ordem crescente de taxa de crescimento:

T1=2nT2=n3/2T3=nlognT4=nlogn\begin{aligned} T_1 & = 2^n \\ T_2 & = n^{3/2} \\ T_3 & = n \log n \\ T_4 & = n^{\log n} \end{aligned}

Resolução de exercícios

  • Afirmação 1: T3T_3 é (assintoticamente) a menor delas, pois nenhuma delas é O(T3)O(T_3)

  • T2T_2 não é O(T3)O(T_3). Vamos assumir que é, então
    n3/2cnlognn3/2nlogncnlognc\begin{aligned} n^{3/2} & \leq c n \log n \\ \frac{n^{3/2}}{n \log n} & \leq c\\ \frac{\sqrt{n}}{\log n} & \leq c \end{aligned}

  • n\sqrt{n} é maior que logn\log n para nn grande (limnnplogn=,p>0\lim_{n\rightarrow \infty}\frac{n^p}{\log n}=\infty, \forall p>0 ), portanto não é possível ser limitada por uma constante

Resolução de exercícios

  • Afirmação 1: T3T_3 é (assintoticamente) a menor delas, pois nenhuma delas é O(T3)O(T_3)

  • T4T_4 não é O(T3)O(T_3). Vamos assumir que é, então
    nlogncnlognnlognnlogncnlogn1lognc\begin{aligned} n^{\log n} & \leq c n \log n \\ \frac{n^{\log n}}{n \log n} & \leq c\\ \frac{n^{\log n -1 }}{\log n} & \leq c \end{aligned}

  • nlogn1n^{\log n -1} é maior que logn\log n para nn grande, portanto não é possível ser limitada por uma constante

Resolução de exercícios

  • Afirmação 1: T3T_3 é (assintoticamente) a menor delas, pois nenhuma delas é O(T3)O(T_3)

  • T1T_1 não é O(T3)O(T_3). Vamos assumir que é, então
    2ncnlogn2nnlognc\begin{aligned} 2^{n} & \leq c n \log n \\ \frac{2^n}{n \log n} & \leq c\\ \end{aligned}

  • 2n2^n é maior que nlognn \log n para nn grande, portanto não é possível ser limitada por uma constante

Resolução de exercícios

  • Afirmação 2: A segunda (assintoticamente) menor é T2T_2, pois T4T_4 e T1T_1 não são O(T2)O(T_2)

  • T4T_4 não é O(T2)O(T_2). Vamos assumir que é, então
    nlogncn3/2nlognn3/2cnlogn3/2c\begin{aligned} n^{\log n} & \leq c n^{3/2} \\ \frac{n^{\log n}}{n^{3/2}} & \leq c\\ n^{\log n - 3/2 } & \leq c \end{aligned}

  • que não é possível ser limitada por uma constante

Resolução de exercícios

  • Afirmação 2: A segunda (assintoticamente) menor é T2T_2, pois T4T_4 e T1T_1 não são O(T2)O(T_2)

  • T1T_1 não é O(T2)O(T_2). Vamos assumir que é, então
    2ncn3/22nn3/2cn32lognlogc\begin{aligned} 2^{n} & \leq c n^{3/2} \\ \frac{2^n}{n^{3/2}} & \leq c\\ n - \frac{3}{2}\log{n} & \leq \log c \end{aligned}

  • que não é possível ser limitada por uma constante

Resolução de exercícios

  • Afirmação3: T4T_4 é (assintoticamente) menor que T1T_1, pois T1T_1 não é O(T4)O(T_4). Vamos assumir que é, então
    2ncnlogn2nnlogncnlognlognlogc\begin{aligned} 2^{n} & \leq c n^{\log n} \\ \frac{2^n}{n^{\log n}} & \leq c\\ n - \log{n}\log{n} & \leq \log c \end{aligned}

  • Observe que lognlogn\log{n}\log{n} é menor que nn=n\sqrt{n}\sqrt{n} = n, então nn cresce mais rápido que lognlogn\log{n}\log{n}, e não é possível limitar por uma constante

Resolução de exercícios

  • Juntanto as afirmações 1, 2 e 3 temos que (assintoticamente):

T3<T2<T4<T1T_3 < T_2 < T_4 < T_1

Árvore de recursão

  • Árvore de recursão é um método muito útil para estimar a solução de uma recorrência
  • Uma vez obtida a estimativa, podemos usar o método da substituição para prová-la
  • A ideia consiste em representar o desenvolvimento da recorrência por meio de um diagrama (geralmente uma árvore), em que cada nó representa um subproblema, e somar os custos por nível

Árvore de recursão

  • Considere por exemplo a relação de recorrência

T(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + \Theta(n)

T(n)=t=0lognn=nlogn+n=Θ(nlogn)T(n) = \sum_{t=0}^{\log n} n = n \log n + n = \Theta(n \log n)

Árvore de recursão

  • Considere por exemplo a relação de recorrência

T(n)=T(n/2)+Θ(n)T(n) = T(n/2) + \Theta(n)

T(n)=t=0lognn2t=2n1=Θ(n)T(n) = \sum_{t=0}^{\log n} \frac{n}{2^t} = 2n-1 = \Theta(n )

Árvore de recursão

  • Considere por exemplo a relação de recorrência

T(n)=4T(n/2)+Θ(n)T(n) = 4T(n/2) + \Theta(n)

T(n)=t=0logn4tn2t=nt=0logn2t=n(2n1)=Θ(n2)T(n) = \sum_{t=0}^{\log n} 4^t\frac{n}{2^t} = n \sum_{t=0}^{\log n} 2^t =n(2n-1) = \Theta(n^2)

Método Mestre (simplificado)

  • O método mestre provê uma fórmula que pode ser aplicada a equações de recorrência do tipo:
    T(n)=aT(nb)+Θ(nd)T(n) = a T\left(\frac{n}{b}\right)+\Theta(n^d)
  • em que:
    • aa é o número de suproblemas
    • bb fator em que o tamanho da entrada diminui
    • dd é necessário fazer ndn^d trabalho adicional para criar os subproblemas e combinar as soluções

Método Mestre (simplificado)

  • Seja:
    T(n)=aT(nb)+Θ(nd)T(n) = a T\left(\frac{n}{b}\right)+\Theta(n^d)
  • Então
    T(n)={Θ(ndlog(n)) se a=bdΘ(nd) se a<bdΘ(nlogb(a)) se a>bdT(n)=\left\{\begin{array}{ll}{\Theta\left(n^{d} \log (n)\right)} & {\text { se } a=b^{d}} \\ {\Theta\left(n^{d}\right)} & {\text { se } a<b^{d}} \\ {\Theta\left(n^{\log_{b}(a)}\right)} & {\text { se } a>b^{d}}\end{array}\right.

Método Mestre (simplificado)

T(n)=aT(nb)+Θ(nd)T(n) = a T\left(\frac{n}{b}\right)+\Theta(n^d)

Método Mestre (simplificado)

  • O número de computção no nível tt é (no máixmo):

atc(nbt)d=cnd(abd)ta_t \cdot c \cdot \left(\frac{n}{b^t}\right)^d = c\cdot n^d \cdot \left(\frac{a}{b^d}\right)^t

  • Em que:
    • ata_t: número de subproblemas no nível tt
    • (nbt)\left(\frac{n}{b^t}\right): tamanho de cada suproblema
    • c(nbt)dc \left(\frac{n}{b^t}\right)^d: a quatidade de trabalho para cada subproblema

Método Mestre (simplificado)

  • Somando sobre todos os níveis temos que o total de trabalho é (no máximo):

T(n)=cndt=0logbn(abd)tT(n) = c\cdot n^d \cdot \sum_{t=0}^{\log_b n} \left(\frac{a}{b^d}\right)^t

Caso 1

  • Nesse caso, a=bda = b^d

T(n)=cndt=0logb(n)(abd)t=cndt=0logb(n)1=cnd(logb(n)+1)=cnd(log(n)log(b)+1)=Θ(ndlog(n))\begin{aligned} T(n) &=c \cdot n^{d} \cdot \sum_{t=0}^{\log_{b}(n)}\left(\frac{a}{b^{d}}\right)^{t} \\ &=c \cdot n^{d} \cdot \sum_{t=0}^{\log_{b}(n)} 1 \\ &=c \cdot n^{d} \cdot\left(\log_{b}(n)+1\right) \\ &=c \cdot n^{d} \cdot\left(\frac{\log (n)}{\log (b)}+1\right) \\ &=\Theta\left(n^{d} \log (n)\right) \end{aligned}

Caso 2

  • Nesse caso, a<bda < b^d
  • O termo abd\frac{a}{b^{d}} é menor que 1, e t=0logb(n)(abd)t\sum_{t=0}^{\log_{b}(n)}\left(\frac{a}{b^{d}}\right)^{t} converge para alguma constante menor que 1 :

i=0Nxt=xN+11x11xN+11x11x=Θ(1)\sum_{i=0}^N x^t = \frac{x^{N+1}-1}{x-1} \leq \frac{1-x^{N+1}}{1-x} \leq \frac{1}{1-x} = \Theta(1)

Caso 2

  • Nesse caso, a<bda < b^d
  • O termo abd\frac{a}{b^{d}} é menor que 1, e t=0logb(n)(abd)t\sum_{t=0}^{\log_{b}(n)}\left(\frac{a}{b^{d}}\right)^{t} converge para alguma constante menor que 1:

T(n)=cndt=0logb(n)(abd)t=cnd(alguma constate)=Θ(nd)\begin{aligned} T(n) &=c \cdot n^{d} \cdot \sum_{t=0}^{\log_{b}(n)}\left(\frac{a}{b^{d}}\right)^{t} \\ &=c \cdot n^{d} \cdot (\text{alguma constate}) \\ & = \Theta(n^d) \end{aligned}

Caso 3

  • Nesse caso, a>bda > b^d
  • O termo abd\frac{a}{b^{d}} é maior que 1:

i=0Nxt=xN+11x11xN+11xxN(xx1)=Θ(xN)\sum_{i=0}^N x^t = \frac{x^{N+1}-1}{x-1} \leq \frac{1-x^{N+1}}{1-x} \leq x^N\left(\frac{x}{x-1}\right) = \Theta(x^N)

Caso 3

  • Nesse caso, a>bda > b^d
  • O termo abd\frac{a}{b^{d}} é maior que 1:

T(n)=cndt=0logb(n)(abd)t=Θ(nd(abd)logb(n))=Θ(nlogb(a))\begin{aligned} T(n)=& c \cdot n^{d} \cdot \sum_{t=0}^{\log_{b}(n)}\left(\frac{a}{b^{d}}\right)^{t} \\ &=\Theta\left(n^{d}\left(\frac{a}{b^{d}}\right)^{\log_{b}(n)}\right) \\ &=\Theta\left(n^{\log_{b}(a)}\right) \end{aligned}

Método mestre

  • Em uma recorrência, temos dois fatores conflitantes:
    • A divisão faz com que o número de problemas exploda!
      • A maior parte do trabalho é feita na parte inferior da árvore
    • Os problemas mais abaixo na árvore são menores
      • A maior parte do trabalho está no topo da árvore

Método mestre

  • Vamos considerar 3 exemplos para entender o método Mestre
    • T1(n)=2T(n/2)+nT_1(n) = 2T(n/2) + n
    • T2(n)=T(n/2)+nT_2(n) = T(n/2) + n
    • T4(n)=4T(n/2)+nT_4(n) = 4T(n/2) + n

Método mestre - Caso 1

  • A quatidade de trabalho é similar em cada nivel, e a complexidade é proporcional ao número de níveis vezes o trabalho por nível (caso 1)

    T2(n)=2T(n/2)+n,a=bd=Θ(ndlogn)=Θ(nlogn)\begin{aligned} T_2(n) & = 2T(n/2) + n, a = b^d \\ & = \Theta(n^d \log n) = \Theta(n \log n ) \end{aligned}

Método mestre - Caso 2

  • A maioria do trabalho é feita no topo (o maior problema), que é maior que o trabalho em qualquer nível e domina a recorrência (caso 2)

T2(n)=T(n/2)+n,a<bd=Θ(nd)=Θ(n)\begin{aligned} T_2(n) & = T(n/2) + n, a < b^d \\ & = \Theta(n^d) = \Theta(n) \end{aligned}

Método mestre - Caso 3

  • Há um grande número de folhas e o tempo é proporcional a processar as folhas (caso 3)

T2(n)=4T(n/2)+n,a>bd=Θ(nlog24)=Θ(n2)\begin{aligned} T_2(n) & = 4T(n/2) + n, a > b^d \\ & = \Theta(n^{\log_2 4} ) = \Theta(n^2) \end{aligned}

Método Mestre (generalizado)

  • O método mestre provê uma fórmula que pode ser aplicada a equações de recorrência do tipo:
    T(n)=aT(nb)+f(n)T(n) = a T\left(\frac{n}{b}\right)+f(n)
  • em que:
    • aa é o número de suproblemas
    • bb fator em que o tamanho da entrada diminui
    • f(n)f(n) uma função

Método Mestre (caso geral)

  • Seja:
    T(n)=aT(nb)+f(n)T(n) = a T\left(\frac{n}{b}\right)+f(n)
  • Então
    T(n)={Θ(nlogba) se f(n)=O(nlogbaϵ),ϵ>0Θ(nlogbalogn) se f(n)=Θ(nlogba)Θ(f(n)) se f(n)=Ω(nlogba+ϵ),ϵ>0 e af(n/b)cf(n),c<1T(n)=\left\{\begin{array}{ll}{\Theta\left(n^{\log_b a}\right)} & {\text { se } f(n)=O(n^{\log_b a-\epsilon}), \epsilon > 0 } \\ {\Theta\left(n^{\log_b a}\log n\right)} & {\text { se } f(n)=\Theta(n^{\log_b a})} \\ {\Theta\left(f(n)\right)} & {\text { se } f(n)=\Omega(n^{\log_b a+\epsilon}), \epsilon > 0 \text{ e } af(n/b)\leq cf(n), c < 1}\end{array}\right.

Método mestre

  • O método mestre facilita a nossa vida
  • Mas ele é basicamente uma mecanização dos cálculos que poderíamos fazer na mão se quisémos
  • Nem sempre pode ser aplicado