Você está na página 1de 54

Técnicas de projeto de algoritmos - divisão e conquista

Profª. Amália Vasconcelos


Q amalia.soares@sga.pucminas.br

Disciplina: Fundamentos de Projeto e Análise de Algoritmos

Curso: Sistemas de Informação


Pontifı́cia Universidade Católica de Minas Gerais

Betim, 1º semestre de 2023


Aula 9 - Técnicas de projeto de algoritmos 1/ 54
Sumário

1 Divisão e conquista
2 Exemplos

Aula 9 - Técnicas de projeto de algoritmos 2/ 54


Divisão e conquista

Dividir o problema em partes menores;

Encontrar soluções para essas partes;

E combiná-las em uma solução global;

Geralmente leva a soluções eficientes e elegantes, principalmente se


forem recursivas.

Aula 9 - Técnicas de projeto de algoritmos 3/ 54


Divisão e conquista

Divisão: particionar o problema original em subproblemas (subcon-


juntos do problema);

Conquista: resolver cada subproblema (em geral, recursivamente);

Combinação: combinar as soluções encontradas, compondo uma solução


para o problema original.

Aula 9 - Técnicas de projeto de algoritmos 4/ 54


Divisão e conquista

Vantagens:
Resolução de problemas difı́ceis;

Pode gerar algoritmos eficientes, com forte tendência a complexidade


logarı́tmica;

Requerem um número menor de acessos à memória.

São altamente paralelizáveis.

Aula 9 - Técnicas de projeto de algoritmos 5/ 54


Divisão e conquista

Problemas:
Recursão ou pilha explı́cita;
Número de chamadas recursivas e/ou armazenadas na pilha pode ser
um inconveniente.

Dificuldade na seleção dos casos bases;

Repetição de subproblemas.

Aula 9 - Técnicas de projeto de algoritmos 6/ 54


Divisão e conquista

Quando usar?
Deve ser possı́vel decompor uma instância em sub-instâncias;

A combinação dos resultados dever ser eficiente;

As sub-instâncias devem ser balanceadas.

Aula 9 - Técnicas de projeto de algoritmos 7/ 54


Algoritmo geral

Divisao_e_conquista(x):
if (x é pequeno) return Resolve(x);
else
decompor x em n conjuntos menores: x1, x2,..., xn
para cada(i em [1...N])
yi = Divisao_e_conquista(xi);
combinar y0, y1, y2,..., yn em Y
retornar Y

Aula 9 - Técnicas de projeto de algoritmos 8/ 54


Complexidade

Algoritmo normalmente relacionado a uma equação de recorrência:

n
T (n) = aT + f (n)
b

em que:
a: número de subproblemas gerados;

b: o tamanho de cada um deles;

f(n): o custo para fazer a divisão.

Aula 9 - Técnicas de projeto de algoritmos 9/ 54


Exemplo: MaxMin4

Seja A um vetor de aleatório de inteiros, A[1...n];

Determine o maior e o menor elementos deste vetor usando divisão e


conquista;

Determine o custo (número de comparações) para achar estes dois


elementos, considerando que A possui n elementos.

Aula 9 - Técnicas de projeto de algoritmos 10/ 54


Exemplo: MaxMin4

Aula 9 - Técnicas de projeto de algoritmos 11/ 54


Exemplo: MaxMin4

08 23 16 42 15 95 04 77

08 23 16 42 15 95 04 77

08 23 16 42 15 95 04 77

Min 08 Min 16 Min 15 Min 04


Max 23 Max 42 Max 95 Max 77

Min 08 Min 04
Max 42 Max 95

Min 04
Max 95

Aula 9 - Técnicas de projeto de algoritmos 12/ 54


Exemplo: MaxMin4

Aula 9 - Técnicas de projeto de algoritmos 13/ 54


Exemplo: MaxMin4

Aula 9 - Técnicas de projeto de algoritmos 14/ 54


Exemplo: MaxMin4

T (1) = 1

T (n) = 2T (n/2) + 2

A considerar:
Variáveis locais na recursividade;

Comparação da condição de parada.

Aula 9 - Técnicas de projeto de algoritmos 15/ 54


Exemplo: ordenação - mergesort

1 4 8 3 6 5 2 7

1 4 8 3 6 5 2 7

1 4 8 3 6 5 2 7

1 4 8 3 6 5 2 7

1 4 3 8 5 6 2 7

1 3 4 8 2 5 6 7

1 2 3 4 5 6 7 8

Aula 9 - Técnicas de projeto de algoritmos 16/ 54


Exemplo: exponenciação

Calcular an , para todo real a e inteiro n ⩾ 0.


n ⩾ 0, a0 = 1, a1 = a;

a3 = a ∗ a ∗ a;

a3 = a ∗ a2 .

Aula 9 - Técnicas de projeto de algoritmos 17/ 54


Exemplo: exponenciação

Calcular an , para todo real a e inteiro n ⩾ 0.


n ⩾ 0, a0 = 1, a1 = a;

a3 = a ∗ a ∗ a;

a3 = a ∗ a2 .

double expo(double x, int n)


{
if (n == 0) return 1;
if (n == 1) return x;

return x * expo(x, n - 1);


}

Aula 9 - Técnicas de projeto de algoritmos 18/ 54


Exemplo: exponenciação

expo(2,4) = ?

expo(2,4) = 2 * expo(2, 3)

expo(2,3) = 2 * expo(2, 2)

expo(2,2) = 2 * expo(2, 1)

expo(2,1) = 2

Aula 9 - Técnicas de projeto de algoritmos 19/ 54


Exemplo: exponenciação

expo(2,4) = ?

16 expo(2,4) = 2 * expo(2, 3)

8 expo(2,3) = 2 * expo(2, 2)

4 expo(2,2) = 2 * expo(2, 1)

expo(2,1) = 2

Aula 9 - Técnicas de projeto de algoritmos 20/ 54


Exemplo: exponenciação divisão e conquista

Se o expoente n é par, an = an/2 × an/2 .

double expo2(double x, int n){


if (n == 0) return 1;
if (n == 1) return x;

double p = expo2(x, n/2);

if (n % 2 == 0) return p * p;
else return x * p * p;
}

Aula 9 - Técnicas de projeto de algoritmos 21/ 54


Exemplo: exponenciação divisão e conquista

expo(2,4) = ?

expo(2,4) → p = expo(2, 2)

expo(2,2) → p = expo(2, 1)

expo(2,1) = 2

Aula 9 - Técnicas de projeto de algoritmos 22/ 54


Exemplo: exponenciação divisão e conquista

expo(2,4) = ?

expo(2,4) → p = expo(2, 2); p*p = 16

expo(2,2) → p = expo(2, 1); p*p = 4

expo(2,1) = 2

Aula 9 - Técnicas de projeto de algoritmos 23/ 54


Exemplo: ordenação - quicksort

Em contraste com o mergesort, no quicksort a operação de divisão é


a mais custosa:
Escolhemos o pivô;

Separamos os elementos do vetor maiores que o pivô dos menores que


o pivô.

Aula 9 - Técnicas de projeto de algoritmos 24/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Item i < pivô?


Se sim, avançar Part, trocar i com Part e avançar i;

Se não, avançar i.

Ao final, avançar Part e trocar pivô com Part.

Aula 9 - Técnicas de projeto de algoritmos 25/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 26/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 27/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 28/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 29/ 54


Exemplo: ordenação - quicksort

23 95 8 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 30/ 54


Exemplo: ordenação - quicksort

23 8 95 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 31/ 54


Exemplo: ordenação - quicksort

23 8 95 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 32/ 54


Exemplo: ordenação - quicksort

23 8 95 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 33/ 54


Exemplo: ordenação - quicksort

23 8 95 4 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 34/ 54


Exemplo: ordenação - quicksort

23 8 4 95 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 35/ 54


Exemplo: ordenação - quicksort

23 8 4 95 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 36/ 54


Exemplo: ordenação - quicksort

23 8 4 95 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 37/ 54


Exemplo: ordenação - quicksort

23 8 4 95 15 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 38/ 54


Exemplo: ordenação - quicksort

23 8 4 15 95 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 39/ 54


Exemplo: ordenação - quicksort

23 8 4 15 95 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 40/ 54


Exemplo: ordenação - quicksort

23 8 4 15 95 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 41/ 54


Exemplo: ordenação - quicksort

23 8 4 15 95 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 42/ 54


Exemplo: ordenação - quicksort

23 8 4 15 95 77 16 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 43/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 77 95 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 44/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 77 95 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 45/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 77 95 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 46/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 77 95 42

Part i

Aula 9 - Técnicas de projeto de algoritmos 47/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 42 95 77

Part i

Aula 9 - Técnicas de projeto de algoritmos 48/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 42 95 77

Part

Aula 9 - Técnicas de projeto de algoritmos 49/ 54


Exemplo: ordenação - quicksort

23 8 4 15 16 42 95 77

Agora, executamos recursivamente nos dois trechos do vetor;

A conquista é imediata.

Aula 9 - Técnicas de projeto de algoritmos 50/ 54


Divisão e conquista

É importante procurar sempre manter o balanceamento na subdivisão


de um problema em partes menores.
Exemplo: pior caso do quicksort.

Aula 9 - Técnicas de projeto de algoritmos 51/ 54


Exemplo: ordenação - quicksort

Exemplo: pior caso do quicksort.

5 4 3 2 1

4 3 2 1 5

3 2 1 4 5

2 1 3 4 5

1 2 3 4 5

1 2 3 4 5

Aula 9 - Técnicas de projeto de algoritmos 52/ 54


Aula 9 - Técnicas de projeto de algoritmos 53/ 54
Referências

ADRIANO, J.C.S.O.. Divisão e conquista. 2020. Belo Horizonte.


54 p. Notas de aula.

CORMEN, Thomas H. et al. Algoritmos: teoria e prática. Rio de


Janeiro: Elsevier, 2012. (para mais informações leia os capı́tulos 2,
15, 16 e 17).

LEVITIN, Anany. Introduction to the Design & Analysis of Al-


gorithms. 3rd ed. Pearson, 2012.

ZIVIANI, Nı́vio. Projeto de Algoritmos: com implementação em


Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.

Aula 9 - Técnicas de projeto de algoritmos 54/ 54

Você também pode gostar