Neste post, apresentaremos uma implementação eficiente para o problema da exponenciação. Faremos a descrição indutiva do problema e em seguida implementaremos uma solução em Java. No post anterior (ver post), utilizamos a indução fraca, agora vamos usar a indução forte para descrever o mesmo problema. Para revisar os conceitos básicos referentes ao uso da indução matemática na construção de algoritmos, veja o post: Indução Matemática - Visão Geral.
Matematicamente, temos o seguinte:
$a^n = (a^{\frac{n}{2}})^2$ , se n for par
$a^n = a * a^{n-1}$ , se n for ímpar
$a^n = a * a^{n-1}$ , se n for ímpar
Descrição indutiva:
- Caso Base: Para n = 0, temos que $a^0 = 1$.
- Hipótese de Indução: Vamos assumir que temos o valor de $a^{\frac{n}{2}}$.
- Caso Geral: Simples, basta elevar ao quadrado o resultado encontrado na hipótese de indução.
- Implementação em Java:
public class Potenciacao {
public static int fastExp(int base, int exp) {
if (exp == 0)
return 1;
else if (exp % 2 == 0)
return (int) Math.pow(fastExp(base, exp / 2), 2);
else
return (int) (Math.pow(fastExp(base, exp - 1), 2) * base);
}
public static void main(String[] args) {
System.out.println(fastExp(2, 3));
}
}
Complexidade
A solução apresentada acima é mais eficiente que a solução utilizada no post anterior. A relação de recorrência $T(n) = T(\frac{n}{2}) + 1$ mostra que o algoritmo possui complexidade O(log n).
@inductioncode
Nenhum comentário:
Postar um comentário