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.

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=x0∑ki=1aiT(bin)+f(n),n>x0(3)
- ai>0;
- 0<bi<1;
- 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), a∈N, então f(n) satisfaz a condição de crescimento polinomial;
- k≥1;
- c0∈R;
- x0∈N.
Assim, considerando tal relação de recorrência e, seja a constante p, a única raiz real da equação
k∑i=1aibpi=1,(4)
então,
T(n)=Θ(np+np∫nn0f(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.
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
k∑i=1aibpi=a1bp1=1(12)p=1log2(12)p=log21plog2(12)=0−p=0p=0.
Portanto, pela equação (5)
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(n0+n0∫nn01x0+1 dx)=Θ(1+1×∫nn01x dx)=Θ(1+∫nn01x dx)=Θ(1+lnx|nn0)=Θ(1+lnn−lnn0)
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).
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
k∑i=1aibpi=a1bp1=2×(12)p=1(12)p=12log2(12)p=log212plog2(12)=−1−p=−1p=1
Portanto, pela equação (5)
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(n1+n1∫nn0xx1+1 dx)=Θ(n+n∫nn0xx2 dx)=Θ(n+n∫nn01x dx)=Θ(n+n(lnx|nn0))=Θ(n+nlnn−nlnn0)
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.
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
k∑i=1aibpi=a1bp1=7×(12)p=1(12)p=17log2(12)p=log217plog2(12)=−log27−p=−log27p=log27
Portanto, pela equação (5)
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(nlog27+nlog27∫nn0x2xlog27+1 dx)=Θ(nlog27+nlog27∫nn0x2x×xlog27 dx)=Θ(nlog27+nlog27∫nn0xxlog27 dx)=Θ(nlog27+nlog27∫nn0x1−log27 dx)=Θ(nlog27+nlog27(x2−log272−log27|nn0))=Θ(nlog27+nlog272−log27(n2−log27−n2−log270))=Θ(nlog27+12−log27(n2−n2−log270nlog27))
para n0 suficientemente grande, temos
T(n)=Θ(nlog27+n22−log27).
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).
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
k∑i=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+np∫nn0f(x)xp+1 dx)=Θ(n1+n1∫nn0xx1+1 dx)=Θ(n+n∫nn0xx2 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=1⇔b1+b2=1, quando p=1.
Portanto, T(n) sempre será Θ(nlnn).
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
k∑i=1aibpi=a1bp1=3×(13)p=1(13)p=13p=1
Portanto, pela equação (5)
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(n1+n1∫nn0xlnxx1+1 dx)=Θ(n+n∫nn0xlnxx2 dx)=Θ(n+n∫nn0lnxx dx).
Pelo método da substituição das integrais, temos que
u=lnx,du=1xdx,
Logo,
T(n)=Θ(n+n∫lnnlnn0u du)=Θ(n+n(u22|lnnlnn0))=Θ(n+n2(ln2n−ln2n0)),
escolhendo n0=1, temos
T(n)=Θ(n+12nln2n)=Θ(nln2n).
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
k∑i=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+x−1=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)=log2x−p=log2xp=−log2xp=−log20,54368901…p=0,8791…
Por simplicidade, trabalharemos apenas com três casas decimais, ou seja, p≅0,879. Pela equação (5)
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(n0,879+n0,879∫nn01x0,879+1 dx)=Θ(n0,879+n0,879∫nn01x1,879 dx)=Θ(n0,879+n0,879∫nn0x−1,879 dx)=Θ(n0,879+n0,879(x−0,879−0,879|nn0))=Θ(n0,879−n0,8790,879(n−0,879−n−0,8790))=Θ(n0,879−10,879(1−n−0,8790n0,879)),
para n0 suficientemente grande, temos
T(n)=Θ(n0,879−10,879)=Θ(n0,879…).
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
k∑i=1aibpi=a1bp1+a2bp2=1(13)p+(12)p=1.
Resolvendo numericamente, obtemos p=0,787…. Pela equação (5),
T(n)=Θ(np+np∫nn0f(x)xp+1 dx)=Θ(n0,787+n0,787∫nn0xx0,787+1 dx)=Θ(n0,787+n0,787∫nn0xx1,787 dx)=Θ(n0,787+n0,787∫nn0x−0,787 dx)=Θ(n0,787+n0,7871−0,787(x1−0,787|nn0))=Θ(n0,787+n0,7871−0,787(n1−0,787−n1−0,7870))=Θ(n0,787+11−0,787(n−n1−0,7870n0,787)),
escolhendo n0=0, temos
T(n)=Θ(n0,787+n1−0,787)=Θ(n).
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)=k∑i=0aiT(n−bi)+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.
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.
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.
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.
Nenhum comentário:
Postar um comentário