Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista...

34
Ordenação: MergeSort Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 – Aula 14 Algoritmos e Estruturas de Dados I

Transcript of Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista...

Page 1: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Ordenação: MergeSort Prof. Túlio Toffolo http://www.toffolo.com.br

BCC202 – Aula 14

Algoritmos e Estruturas de Dados I

Page 2: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

DIVISÃO E CONQUISTA

Page 3: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Motivação

•  É preciso revolver um problema com uma entrada grande

•  Para facilitar a resolução do problema, a entrada é quebrada em pedaços menores (DIVISÃO)

•  Cada pedaço da entrada é então tratado separadamente (CONQUISTA)

•  Ao final, os resultados parciais são combinados para gerar o resultado final procurado

3

Page 4: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

A técnica de Divisão e Conquista

A técnica de divisão e conquista consiste de 3 passos:

•  Divisão: Dividir o problema original em subproblemas menores

•  Conquista: Resolver cada subproblema recursivamente

•  Combinação: Combinar as soluções encontradas, compondo uma solução para o problema original

4

Page 5: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

A técnica de Divisão e Conquista

•  Algoritmos baseados em divisão e conquista são, em geral, recursivos.

•  A maioria dos algoritmos de divisão e conquista divide o problema em a subproblemas da mesma natureza, de tamanho n/b.

•  Vantagens:

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

•  São altamente paralelizáveis. Se existirem vários processadores disponíveis, a estratégia propiciará eficiência.

5

Page 6: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Quando utilizar?

•  Existem três condições que indicam que a estratégia de divisão e conquista pode ser utilizada com sucesso:

•  Deve ser possível decompor uma instância em sub-instâncias

•  A combinação dos resultados dever ser eficiente (trivial se possível)

•  As sub-instâncias devem ser mais ou menos do mesmo tamanho

6

Page 7: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Algoritmo Genérico

def divisao_e_conquista(x): if x é pequeno ou simples: return resolve(x) else: decompor x em n conjuntos menores x0,x1,...,xn-1 for i in [0,1,...,n-1]: yi = divisao_e_conquista(xi) combinar y0,y1,...,yn-1 em y return y

7

Page 8: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

ORDENAÇÃO POR INTERCALAÇÃO

MERGESORT

Page 9: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Abordagem com Balanceamento

•  Métodos de ordenação que fazem divisão e conquista

•  QuickSort (pior caso?)

•  MergeSort

•  Principal diferença:

•  QuickSort utiliza o conceito de elemento pivô para dividir o problema em subproblemas

•  MergeSort sempre divide o problema de forma balanceada (gerando subproblemas de mesmo tamanho)

9

Page 10: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Execução

•  A execução do MergeSort pode ser facilmente descrita por uma árvore binária •  Cada nó representa uma chamada recursiva do MergeSort

•  O nó raiz é a chamada inicial

•  Os nós folhas são vetores de 1 ou 2 números (casos bases)

10

7 2 ⏐ 9 4 → 2 4 7 9

7 ⏐ 2 → 2 7 9 ⏐ 4 → 4 9

7 → 7 2 → 2 9 → 9 4 → 4

Page 11: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução

•  Partição do problema (sempre no meio do vetor)

11

7 2 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 12: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Chamada recursiva para primeira partição

12

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 13: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Chamada recursiva

13

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 14: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Chamada recursiva: caso base encontrado

14

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 15: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Chamada recursiva: caso base encontrado

15

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 16: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Operação de merge (intercalação)

16

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 17: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Chamadas recursivas, casos bases e merge (intercalação)

17

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

9 → 9 4 → 4

Page 18: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Operação de merge (intercalação)

18

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 19: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Execução do MergeSort para a outra partição

19

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 6 8

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 20: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort: Exemplo de Execução (cont.)

•  Finalmente o último merge (intercalação)

20

7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 6 8

7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6

7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1

7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9

Page 21: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MERGESORT

ANÁLISE DO ALGORITMO

Page 22: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Análise do MergeSort

•  A altura h da árvore de execução é O(log n)

•  A quantidade de operações em cada nível da árvore é assintoticamente igual a O(n)

•  Logo: algoritmo é O(n log n)

22

h = O(log n)

Page 23: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MERGESORT

IMPLEMENTAÇÃO RECURSIVA

Page 24: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

/* ordena o vetor v[0..n-1] */void mergeSort(TItem *v, int n) { mergeSort_ordena(v, 0, n-1);}/* ordena o vetor v[esq..dir] */void mergeSort_ordena(TItem *v, int esq, int dir) { if (esq == dir) return; int meio = (esq + dir) / 2; mergeSort_ordena(v, esq, meio); mergeSort_ordena(v, meio+1, dir); mergeSort_intercala(v, esq, meio, dir); return;}

Algoritmo MergeSort

24

Page 25: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

/* intercala os vetores v[esq..meio] e v[meio+1..dir] */void mergeSort_intercala(TItem *v, int esq, int meio, int dir) { int i, j, k; int a_tam = meio-esq+1; int b_tam = dir-meio; TItem *a = (TItem*) malloc(sizeof(TItem) * a_tam); TItem *b = (TItem*) malloc(sizeof(TItem) * b_tam); for (i = 0; i < a_tam; i++) a[i] = v[i+esq]; for (i = 0; i < b_tam; i++) b[i] = v[i+meio+1]; for (i = 0, j = 0, k = esq; k <= dir; k++) { if (i == a_tam) v[k] = b[j++]; else if (j == b_tam) v[k] = a[i++]; else if (a[i].chave < b[j].chave) v[k] = a[i++]; else v[k] = b[j++]; } free(a); free(b);}

Algoritmo MergeSort

25

Page 26: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Implementação do MergeSort

•  O procedimento Intercala requer o uso de um segundo arranjo, B, para receber os dados ordenados.

•  Note que no retorno de Mergesort com um arranjo de tamanho 1, a resposta encontra-se no arranjo A (o arranjo original de entrada).

•  No próximo nível (arranjo de comprimento 2) o resultado da intercalação estará no arranjo B.

26

Page 27: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Implementação do MergeSort

•  Podemos administrar este problema de duas maneiras:

•  Copiando a porção do arranjo referente ao resultado de volta para o arranjo A

•  Utilizando uma chave para indicar a “direção” dos movimentos de Intercala.

27

Page 28: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MERGESORT

VANTAGENS/DESVANTAGENS

Page 29: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MergeSort

•  Vantagens •  MergeSort é O(n log n)

•  Indicado para aplicações que tem restrição de tempo (executa sempre em um determinado tempo para n)

•  Passível de ser transformado em estável §  Tomando certos cuidados na implementação da intercalação

•  Fácil Implementação

•  Desvantagens •  Utiliza memória auxiliar – O(n)

•  Na prática é mais lento que QuickSort no caso médio

29

Page 30: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MERGESORT

IMPLEMENTAÇÃO NÃO-RECURSIVA

Page 31: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

/* ordena o vetor v[0..n-1] - MergeSort iterativo */void mergeSort_iter(TItem *v, int n) { int esq, dir; int salto = 1; while (salto < n) { esq = 0; while (esq + salto < n) { dir = esq + 2*salto; if (dir > n) dir = n; mergeSort_intercala(v, esq, esq+salto-1, dir-1); esq = esq + 2*salto; } salto = 2*salto; }}

MergeSort Não Recursivo

31

Page 32: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Perguntas?

32

Page 33: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

MERGESORT

EXERCÍCIO

Page 34: Ordenação: MergeSort · A técnica de Divisão e Conquista A técnica de divisão e conquista consiste de 3 passos: • Divisão: Dividir o problema original em subproblemas menores

Exercício

•  Dada a sequência de números:

3 4 9 2 5 1 8 Ordene em ordem crescente utilizando o algoritmo MergeSort, apresentado a sequência dos números a cada passo do algoritmo.

34