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)=log⁡nf(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))

log⁡n≤clog⁡(100n)log⁡n1/2≤clog⁡(100n)12×log⁡nlog⁡(100n)≤c12×log⁡nlog⁡(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 n≥1n\geq 1, o termo log⁡nlog⁡(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 n0≥1n_0 \geq 1

Resolução de exercícios

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

  • Vamos provar por absurdo.

n!≤cnlog⁡nn(n−1)(n−2)!≤cnlog⁡nn(n−1)(n−2)!≤cn(n−1)(n−2)!≤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 (n−2)!(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=nlog⁡nT4=nlog⁡n\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/2≤cnlog⁡nn3/2nlog⁡n≤cnlog⁡n≤c\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 log⁡n\log n para nn grande (lim⁡n→∞nplog⁡n=∞,∀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
    nlog⁡n≤cnlog⁡nnlog⁡nnlog⁡n≤cnlog⁡n−1log⁡n≤c\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}

  • nlog⁡n−1n^{\log n -1} é maior que log⁡n\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
    2n≤cnlog⁡n2nnlog⁡n≤c\begin{aligned} 2^{n} & \leq c n \log n \\ \frac{2^n}{n \log n} & \leq c\\ \end{aligned}

  • 2n2^n é maior que nlog⁡nn \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
    nlog⁡n≤cn3/2nlog⁡nn3/2≤cnlog⁡n−3/2≤c\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
    2n≤cn3/22nn3/2≤cn−32log⁡n≤log⁡c\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
    2n≤cnlog⁡n2nnlog⁡n≤cn−log⁡nlog⁡n≤log⁡c\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 log⁡nlog⁡n\log{n}\log{n} é menor que nn=n\sqrt{n}\sqrt{n} = n, então nn cresce mais rápido que log⁡nlog⁡n\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=0log⁡nn=nlog⁡n+n=Θ(nlog⁡n)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=0log⁡nn2t=2n−1=Θ(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=0log⁡n4tn2t=n∑t=0log⁡n2t=n(2n−1)=Θ(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Θ(nlog⁡b(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):

at⋅c⋅(nbt)d=c⋅nd⋅(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)=c⋅nd⋅∑t=0log⁡bn(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)=c⋅nd⋅∑t=0log⁡b(n)(abd)t=c⋅nd⋅∑t=0log⁡b(n)1=c⋅nd⋅(log⁡b(n)+1)=c⋅nd⋅(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=0log⁡b(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+1−1x−1≤1−xN+11−x≤11−x=Θ(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=0log⁡b(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)=c⋅nd⋅∑t=0log⁡b(n)(abd)t=c⋅nd⋅(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+1−1x−1≤1−xN+11−x≤xN(xx−1)=Θ(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)=c⋅nd⋅∑t=0log⁡b(n)(abd)t=Θ(nd(abd)log⁡b(n))=Θ(nlog⁡b(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=Θ(ndlog⁡n)=Θ(nlog⁡n)\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=Θ(nlog⁡24)=Θ(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)={Θ(nlog⁡ba) se f(n)=O(nlog⁡ba−ϵ),ϵ>0Θ(nlog⁡balog⁡n) se f(n)=Θ(nlog⁡ba)Θ(f(n)) se f(n)=Ω(nlog⁡ba+ϵ),ϵ>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