O Método de Akra-Bazzi na Resolução de Equações de Recorrência

Por
| 

O método de Akra-Bazzi é um dos métodos mais poderosos para solucionar relações de recorrência advindas de algoritmos de divisão e conquista. Tal método abrange uma quantidade muito maior de relações de recorrência que o Teorema Mestre.

Neste artigo, apresentarei o método de Akra-Bazzi do livro Algoritmos: teoria e prática com algumas simplificações.

Além do método, você verá, ao longo texto, algumas relações de recorrências clássicas resolvidas através do método de Akra-Bazzi, com o intuito de demonstrar o seu potencial. Também resolveremos algumas relações que o Teorema Mestre é incapaz de resolver.

Método de Akra-Bazzi

Aviso: esta página utiliza a biblioteca em JavaScript MathJax para renderização das fómulas matemáticas em LaTeX. Caso as fómulas não renderizem ou fiquem estranhas, recarregue a página.

Índice

O método

O método de Akra-Bazzi resolve relações de recorrência da forma T(n)={c0,n=x0ki=1aiT(bin)+f(n),n>x0(3)

onde

  1. ai>0;
  2. 0<bi<1;
  3. f(n) é uma função real, positiva e que satisfaz a condição de crescimento polinomial. De forma simplificada, se |f(n)| tiver como limitante superior algum polinômio, ou seja, |f(n)|=O(na), aN, então f(n) satisfaz a condição de crescimento polinomial;
  4. k1;
  5. c0R;
  6. x0N.

Assim, considerando tal relação de recorrência e, seja a constante p, a única raiz real da equação

ki=1aibpi=1,(4)

então,

T(n)=Θ(np+npnn0f(x)xp+1 dx),(5)

onde n0 é uma constante suficientemente grande. Podemos, por exemplo, escolher n0 de tal forma que o limite inferior da integral seja zero, ou seja, simplesmente o ignoramos, pois contribuirá apenas em um termo constante, que será "absorvido" por termos com maior ordem de grandeza.

Os dois pontos fundamentais da equação são justamente a equação (4) e a integral em (5). Em particular, nem sempre é possível resolver analiticamente a equação (4), o que nos leva a recorrer aos métodos numéricos. Por outro lado, a integral em (5) pode ser complicada de se resolver dependendo de como é a função f(n).

Todavia, o método de Akra-Bazzi é mais flexível e resolve qualquer relação de recorrência que o Teorema Mestre é capaz de resolver. Outro aspecto importante é que o Teorema Mestre só resolve relações de recorrência nas quais os subproblemas possuem o mesmo tamanho. Por outro lado, o método de Akra-Bazzi não possui tal restrição.

Ir para o índice

Exemplos Clássicos

Agora que o método de Akra-Bazzi foi apresentado, vamos utilizá-lo na resolução de algumas relações de recorrência clássicas.

A Busca Binária

A relação de recorrência da busca binária recursiva é dada por

T(n)={c0,n=1T(n/2)+c1,n>1

onde c0 e c1 são constantes. Por simplicidade, mas sem perda de generalidade, assumiremos que c0=c1=1, ou seja,

T(n)={1,n=1T(n/2)+1,n>1.

Pelo método de Akra-Bazzi, temos que k=1 (pois só há um termo envolvendo T(n)), f(n)=1, a1=1, b1=12. f(n) obviamente satisfaz a condição de crescimento polinomial, pois |f(n)|=0=O(1). Pela equação (4), temos

ki=1aibpi=a1bp1=1(12)p=1log2(12)p=log21plog2(12)=0p=0p=0.

Portanto, pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n0+n0nn01x0+1 dx)=Θ(1+1×nn01x dx)=Θ(1+nn01x dx)=Θ(1+lnx|nn0)=Θ(1+lnnlnn0)

escolhendo n0=1, temos

T(n)=Θ(1+lnn)=Θ(lnn),

que é um resultado já conhecido. Não devemos nos preocupar com a base do logaritmo, pois isso influencia apenas por fatores constantes (basta aplicar a propriedade da mudança de base dos logaritmos para verificar essa afirmação).

Ir para o índice

Merge Sort

De maneira simplificada, mas sem perda de generalidade, a relação de recorrência do algoritmo de ordenação por intercalação (Merge Sort) é dada por

T(n)={1,n=12T(n/2)+n,n>1.

Novamente, igualamos algumas das constantes a um, pois influenciariam apenas por fatores constantes.

Pelo método de Akra-Bazzi, temos que k=1 (pois só há um termo envolvendo T(n)), f(n)=n, a1=2, b1=12. f(n) obviamente satisfaz a condição de crescimento polinomial, pois |f(n)|=1=O(1). Pela equação (4), temos

ki=1aibpi=a1bp1=2×(12)p=1(12)p=12log2(12)p=log212plog2(12)=1p=1p=1

Portanto, pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n1+n1nn0xx1+1 dx)=Θ(n+nnn0xx2 dx)=Θ(n+nnn01x dx)=Θ(n+n(lnx|nn0))=Θ(n+nlnnnlnn0)

escolhendo n0=1, temos

T(n)=Θ(n+nlnn)=Θ(nlnn),

que é um resultado já conhecido. Já que nlnn é assintoticamente maior que n, então o termo n foi descartado. Novamente, não devemos nos preocupar com a base do logaritmo, pois isso influencia apenas por fatores constantes.

Repare que a mesma equação de recorrência é válida para o melhor caso do Quicksort, que ocorre quando o particionamento é balanceado.

Ir para o índice

Algoritmo de Strassen

O algoritmo de Strassen realiza multiplicações de matrizes utilizando o paradigma de divisão e conquista. A relação de recorrência de tal algoritmo é dada por

T(n)={1,n=17T(n/2)+n2,n>1

Algumas simplificações foram realizadas, mas o resultado final não será afetado.

Pelo método de Akra-Bazzi, temos que k=1, f(n)=n2, a1=7, b1=12. f(n) obviamente satisfaz a condição de crescimento polinomial, pois |f(n)|=2n=O(n). Pela equação (4), temos

ki=1aibpi=a1bp1=7×(12)p=1(12)p=17log2(12)p=log217plog2(12)=log27p=log27p=log27

Portanto, pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(nlog27+nlog27nn0x2xlog27+1 dx)=Θ(nlog27+nlog27nn0x2x×xlog27 dx)=Θ(nlog27+nlog27nn0xxlog27 dx)=Θ(nlog27+nlog27nn0x1log27 dx)=Θ(nlog27+nlog27(x2log272log27|nn0))=Θ(nlog27+nlog272log27(n2log27n2log270))=Θ(nlog27+12log27(n2n2log270nlog27))

para n0 suficientemente grande, temos

T(n)=Θ(nlog27+n22log27).

Como log27>2, então

T(n)=Θ(nlog27)=Θ(n2,807),

que é justamente a solução. Observamos que o algoritmo de Strassen é ligeiramente mais eficaz que o algoritmo clássico de multiplicação de matrizes, cuja complexidade é T(n)=Θ(n3).

Ir para o índice

Quicksort não balanceado

Até agora, todos os exemplos expostos podiam ser resolvidos através do Teorema Mestre. A partir deste exemplo, nenhuma relação de recorrência poderá ser resolvida através dele.

Suponhamos que, ao utilizar o Quicksort, a divisão do problema gera dois subproblemas: um cujo tamanho é igual um quinto do original e o outro igual a quatro quintos do original. Se a cada chamada recursiva essa subdivisão se manter, então a relação de recorrência simplificada será

T(n)={1,n=1T(n/5)+T(4n/5)+n,n>1

Tal relação de recorrência obviamente não pode ser resolvida pelo Teorema Mestre, muito menos pela árvore de recursão. Por outro lado, usar indução também não é uma boa ideia, pois para isso é necessário "chutar" a solução da recorrência e provar o "chute" via indução, ou seja, a indução não resolve a relação de recorrência. Felizmente, o método de Akra-Bazzi é capaz de resolver a recorrência e nos dar um resultado interessante.

Pelo método, temos que k=2 (pois há dois termos envolvendo T(n)), f(n)=n, a1=1, b1=15, a2=1, b2=45. f(n) obviamente satisfaz a condição de crescimento polinomial. Pela equação (4), temos

ki=1aibpi=a1bp1+a2bp2=1(15)p+(45)p=1.

Essa equação não pode ser resolvida por métodos convencionais. Mas é fácil de ver que se p=1, então ela é automaticamente satisfeita.

Portanto, pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n1+n1nn0xx1+1 dx)=Θ(n+nnn0xx2 dx),

que é igual exemplo do Merge Sort. Portanto,

T(n)=Θ(nlnn)

Ou seja, mesmo quando a divisão não é balanceada, ou seja, os subproblemas têm tamanhos desiguais, o Quicksort ainda tem complexidade Θ(nlnn). De forma geral, quando o particionamento não é balanceado, temos

T(n)={1,n=1T(b1n)+T(b2n)+n,n>1

onde b1,b2(0,1) e b1+b2=1. Pela equação (4), temos que p sempre será 1, independente dos valores de b1 e b2, pois teremos

bp1+bp2=1b1+b2=1, quando p=1.

Portanto, T(n) sempre será Θ(nlnn).

Ir para o índice

Exemplos Gerais

Vamos expor agora mais alguns exemplos de relações de recorrência que não podem ser resolvidas pelo Teorema Mestre.

Exemplo 1

Seja,

T(n)={1,n=13T(n/3)+nlnn,n>1.

Observação: a escolha de lnn no lugar de logn não influencia no resultado final, já que diferem apenas por um fator constante. O uso de lnn tem como objetivo facilitar o cálculo das integrais.

Pelo método de Akra-Bazzi, temos que k=1, f(n)=nlnn, a1=3, b1=13. f(n) obviamente satisfaz a condição de crescimento polinomial, pois |f(n)|=|lnn+1|=O(n). Pela equação (4), temos

ki=1aibpi=a1bp1=3×(13)p=1(13)p=13p=1

Portanto, pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n1+n1nn0xlnxx1+1 dx)=Θ(n+nnn0xlnxx2 dx)=Θ(n+nnn0lnxx dx).

Pelo método da substituição das integrais, temos que

u=lnx,du=1xdx,

u(n)=lnn,u(n0)=lnn0.

Logo,

T(n)=Θ(n+nlnnlnn0u du)=Θ(n+n(u22|lnnlnn0))=Θ(n+n2(ln2nln2n0)),

escolhendo n0=1, temos

T(n)=Θ(n+12nln2n)=Θ(nln2n).

Ir para o índice

Exemplo 2

Seja a relação de recorrência

T(n)={1,n=1T(n2)+T(n4)+T(n8)+1,n>1.

Pelo método de Akra-Bazzi, temos que k=3, f(n)=1, a1=1, b1=12, a2=1, b2=14, a3=1 e b3=18. f(n) obviamente satisfaz a condição de crescimento polinomial, pois |f(n)|=0=O(1). Pela equação (4), temos

ki=1aibpi=a1bp1+a2bp2+a3bp3=1(12)p+(14)p+(18)p=1.

Fazendo a mudança de variável x=(12)p, temos

x+x2+x3=1x3+x2+x1=0,

que é uma equação completa de terceiro grau, cuja solução exata pode ser obtida pela fórmula de Tartaglia-Cardano. A solução é dada por x=0,54368901 Logo,

(12)p=xlog2(12)p=log2xplog2(12)=log2xp=log2xp=log2xp=log20,54368901p=0,8791

Por simplicidade, trabalharemos apenas com três casas decimais, ou seja, p0,879. Pela equação (5)

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n0,879+n0,879nn01x0,879+1 dx)=Θ(n0,879+n0,879nn01x1,879 dx)=Θ(n0,879+n0,879nn0x1,879 dx)=Θ(n0,879+n0,879(x0,8790,879|nn0))=Θ(n0,879n0,8790,879(n0,879n0,8790))=Θ(n0,87910,879(1n0,8790n0,879)),

para n0 suficientemente grande, temos

T(n)=Θ(n0,87910,879)=Θ(n0,879).

Ir para o índice

Exemplo 3

Seja,

T(n)={15,n=1T(n/3)+T(n/2)+n,n>1.

Pelo método de Akra-Bazzi, temos que k=2, f(n)=n, a1=1, b1=13, a2=1, b2=12. f(n) satisfaz a condição de crescimento polinomial, pois |f(n)|=1=O(1). Pela equação (4), temos

ki=1aibpi=a1bp1+a2bp2=1(13)p+(12)p=1.

Resolvendo numericamente, obtemos p=0,787. Pela equação (5),

T(n)=Θ(np+npnn0f(x)xp+1 dx)=Θ(n0,787+n0,787nn0xx0,787+1 dx)=Θ(n0,787+n0,787nn0xx1,787 dx)=Θ(n0,787+n0,787nn0x0,787 dx)=Θ(n0,787+n0,78710,787(x10,787|nn0))=Θ(n0,787+n0,78710,787(n10,787n10,7870))=Θ(n0,787+110,787(nn10,7870n0,787)),

escolhendo n0=0, temos

T(n)=Θ(n0,787+n10,787)=Θ(n).

Ir para o índice

Conclusão

Conforme o texto apresenta, o método de Akra-Bazzi certamente é muito poderoso ao resolver relações de recorrência, sendo superior ao Teorema Mestre. As principais "dificuldades" encontradas em seu emprego são justamente a necessidade do cálculo de integrais e encontrar a constante p, utilizada pela fórmula do método.

É claro, tais dificuldades podem ser superadas facilmente, pois, para determinar p, pode-se optar pelo uso de algum método numérico ou de um sistema de computação algébrica. Por outro lado, no cálculo da integral, pode-se também utilizar um sistema de computação algébrica.

O método de Akra-Bazzi também pode ser visto como uma das inúmeras justificativas para o estudo de Cálculo Diferencial e Integral e Cálculo Numérico em cursos superiores de computação. Apesar do método consistir basicamente no emprego de fórmulas matemáticas que podem ser resolvidas facilmente num computador, é importante ter consciência de onde vem os resultados obtidos ao empregar o método.

Por fim, é importante lembrar que tal método não é capaz de resolver recorrências do tipo

T(n)=ki=0aiT(nbi)+f(n),

que surgem, por exemplo, ao analisar a versão recursiva do algoritmo da sequência de Fibonacci ou a versão recursiva do fatorial. Para tais casos, outros método devem ser empregados.

Ir para o índice

Leia também

Aproveite e leia também os seguintes artigos

Download em PDF

Se você tiver algum problema para visualizar as fórmulas matemáticas, você pode fazer o download da versão em PDF deste artigo neste link: Artigo em PDF.

Ir para o índice

Apêndice: Mudança de Base de Logaritmo

Seja logba, então logba=logcalogcb.

Exemplo:

lnn=logen=log10nlog10e=log2nlog2e=,

onde e é o número de Euler/Neper (e=2,71828182846)

Observação: estamos assumindo que a, b e c satisfazem as condições da definição dos logaritmos. Consulte um livro para maiores informações.

Ir para o índice

Referências

  • [1] CORMEN, T. H. et al. Algoritmos: teoria e prática. 3 ed. Rio de Janeiro: Elsevier, 2012.
  • [2] AKRA, M., BAZZI, L. (1998). On the solution of linear recurrence equations. Computational Optimization and Applications, 10(2), 195-210.

Sugestões de livros para estudantes de computação na Amazon (patrocinado): Lista de Livros

Obrigado pela leitura! Se você puder, considere apoiar financeiramente o Blog Cyberini, Chave Pix: cyberpix9@gmail.com

Doar com PayPal

Siga o blog

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

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

Este site usa cookies para fornecer serviços, analisar o tráfego e exibir publicidade personalizada, conforme a nossa política de privacidade. Seus dados, como IP e user agent, são compartilhados com nossos parceiros (como o Google). Saiba Mais

RecusarAceitar