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=x1Bm+x2y=y1Bm+y2
2) xy = (x_1 * B^m + x_2)(y_1 * B^m + y_2) =>
2)xy=(x1Bm+x2)(y1Bm+y2)=>
a = x_1*y_1;\;\;\; b = x_1*y_2+x_2*y_1;\;\;\; c = x_2*y_2
a=x1y1;b=x1y2+x2y1;c=x2y2
3)xy = a*B^2m + b*B^m + c
3)xy=aB2m+bBm+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)ac

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

  • 87