Divide and Conquer
Robson Cruz
Guilherme Dellatin
Conceitos
"Divide and Conquer"?
- É um paradigma para resolução de algoritmos que se aproveita da recursão para melhor desempenho;
- Propõe a subdivisão de um problema em problemas menores;
- Seus primeiros exemplos datam do começo do século XIX;
- Divide and Conquer é confundido com "decrease-and-conquer"
Vantagens
- Máquinas multicore tiram bom proveito dessa técnica;
- A simplificação de problemas complexos;
- Fácil implementação;
- Excelente para problemas com restrição de tempo
DesVantagens
- Tamanho da pilha;
- Necessita de memória auxiliar;
- Alta repetição de subproblemas;
Método
if (x é pequeno ou simples) then
return resolver(x)
else
decompor x em conjuntos menores x0, x1,..., xn
for i ← 0 to n do
yi ← DivideConquer(xi)
i ← i +1
combinar yi’s
return y
Aplicações
- Modelagem de problemas;
- Teoria de Jogos;
- Algoritmos Matemáticos;
- Robótica;
Algoritmos assintóticos
- Algoritmos asintóticos são mais eficientes quando utilizamos maiores números;
Quicksort
O que é
- É um algoritmo de ordenação por comparação não estável extremamente eficiente;
- Criado por C.A.R. Hoare em 1960;
- Foi criado por "acidente";
- É uma versão otimizada de uma árvore binária ordenada;
- A cada iteração faz as mesma comparações, mas em ordem diferente.
Como funciona
A escolha do Pivot
- Mediana entre 3 elementos;
- O primeiro/último elemento do array;
Aplicações
- Método de "sort" em Pearl;
- Organização de grandes volumes de informação a partir do índice;
Multiplicação de Karatsuba
O que é?
- É um algoritmo assintótico de multiplicação de números gigantes;
- Foi desenvolvido em 1960 por Anatoly Alexeevitch Karatsuba;
- Existem outros algoritmos do tipo que são mais rápidos, mas Karatsuba é mais usado;
Método
1) x = x_1 * B^m + x_2 \;\;\;y = y_1 * B^m + y_2
1)x=x1∗Bm+x2y=y1∗Bm+y2
2) xy = (x_1 * B^m + x_2)(y_1 * B^m + y_2) =>
2)xy=(x1∗Bm+x2)(y1∗Bm+y2)=>
a = x_1*y_1;\;\;\;
b = x_1*y_2+x_2*y_1;\;\;\;
c = x_2*y_2
a=x1∗y1;b=x1∗y2+x2∗y1;c=x2∗y2
3)xy = a*B^2m + b*B^m + c
3)xy=a∗B2m+b∗Bm+c
O diferencial
- Karatsuba conseguiu eliminar uma operação com a seguinte equação:
b = (x_1 + x_2)(y_1 + y_2)-a-c
b=(x1+x2)(y1+y2)−a−c
Aplicação
- Criptografia Bancária
Algoritmo de Strassen
O que é?
- É um algoritmo assintótico de multiplicação de matrizes;
- Embora eficiente, ainda é mais lento que o algoritmo de Coppersmith-Winogard;
- Foi publicado em 1969;
- Seu autor (Volker Strassen) foi o primeiro a perceber que a abordagem usual não era a melhor.
Método
- Como podemos dividir uma matriz em submatrizes, primeiro dividimos cada matriz em 4 matrizes;
Método
- Em seguida estabelecemos a seguinte relação:
O Preço de Strassen
- Existe um preço pela eficiência do algoritmo de Strassen, que é uma redução da estabilidade numérica.
Demonstração
Resultados
Quicksort
Karatsuba
Strassen
Strassen
- Strassen é um algoritmo que trabalha melhor com matrizes esparsas;
- Sua eficiência fica mais evidente quando dimensão
- Um ponto a se considerar é a grande quantidade de zeros que são incluidos no processo de resolução, que por consequência comprometem, em parte o resultado.
N>=500
N>=500
Fim
Divide and Conquer
By Robson Cruz
Divide and Conquer
- 85