Algoritmos de Ordenação: MergeSort

Documentos relacionados
Projeto de algoritmos: Algoritmos Gulosos

Algoritmos de Ordenação: QuickSort

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Complexidade de Algoritmos

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Análise e Complexidade de Algoritmos

Tabelas Hash Endereçamento Direto

Solução de Recorrências

Algoritmos de Ordenação

Algoritmos de Ordenação: Cota Inferior

BCC202 - Estrutura de Dados I

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Classes, Herança e Interfaces

Algoritmos de Ordenação: HeapSort

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

Análise de Algoritmos

Métodos de ordenação. Bubble sort:

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Métodos de Ordenação Parte 2

Algoritmos de ordenação Quicksort

Algoritmos de Ordenação: Tempo Linear

Projeto e Análise de Algoritmos

Hashing. ACH Introdução à Ciência da Computação II. Delano M. Beder

Técnicas de projeto de algoritmos: Indução

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

Técnicas de projeto de algoritmos: Indução

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

AED2 - Aula 11 Problema da separação e quicksort

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

Algoritmo MergeSort. Estrutura de Dados II Prof Jairo Francisco de Souza

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Centro de Informá-ca Universidade Federal de Pernambuco. Vinicius Cardoso Garcia 2011 Vinicius Cardoso Garcia

Aula 2. Divisão e conquista. Exemplo 1: Número de inversões de uma permutação (problema 2-4 do CLRS; veja também sec 5.4 do KT)

Estruturas de Dados 2

Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

Divisão e Conquista. Fernando Lobo. Algoritmos e Estrutura de Dados II. É uma técnica para resolver problemas (veremos outras técnicas mais adiante).

Ordenação de Dados (IV) MergeSort

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins

Linguagem C: Ordenação

Capacitação em Linguagem C Parte 2

Algoritmos de Ordenação

Algoritmos e Complexidade

Complexidade Assintótica

ALGORITMOS DE ORDENAÇÃO

SCC Capítulo 3 Análise de Algoritmos - Parte 2

INF111 Programação II Aulas 11, 12, 13 Ordenação

void subdivide (LISTA_ENC *pl, LISTA_ENC *pl1, LISTA_ENC *pl2) { int cont, k=1; for (cont=tam(*pl)/2;cont;cont--) {

Divisão e Conquista: Par de Pontos mais Próximo

Classificação por Intercalação

Algoritmos de Ordenação e Pesquisa. Marco Antonio Moreira de Carvalho Algoritmos e Estrutura de Dados

Projeto e Análise de Algoritmos

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

Análise de algoritmos

Endereçamento Aberto

ORDENAÇÃO POR INTERCALAÇÃO

Algoritmos de ordenação

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Aula 19: Métodos eficientes de ordenação

QuickSort CI/2015. Análise e Projeto de Algoritmos. - Prof. Lucídio A. F. Cabral

Análise de Algoritmos

Algoritimos e Estruturas de Dados III CIC210

Quicksort Letícia Rodrigues Bueno

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

Divisão e conquista. Eficiência de divisão e conquista

Algoritmos de ordenação Ordenação rápida ( Quicksort )

Análise de algoritmos

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Projeto e Análise de Algoritmos

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: ClaudioQuick F. M.

Divisão e conquista. Há divisão quando o algoritmo tem pelo menos 2 chamadas recursivas no corpo

Análise e Complexidade de Algoritmos

Métodos de Ordenação Parte 4

Ordenação por Intercalação Métodos de Ordenação Parte 4

1 a Lista de Exercícios

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Análise de Complexidade para algoritmos iterativos e recursivos

Paradigmas de Projetos de Algoritmos

6. Pesquisa e Ordenação

07 Ordenação em Memória Interna (parte 2) quicksort SCC201/501 - Introdução à Ciência de Computação II

Algoritmos de Ordenação em LISP

Projeto e Análise de Algoritmos

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO EM TEMPO LINEAR

Algoritmos e Estrutura de Dados. Aula 04 Recorrência Prof. Tiago A. E. Ferreira

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Bubble Sort. Tempo total O(n 2 )

Fabio G. Cozman, Thiago Martins 2017

Ordenação em Tempo Linear. Leitura: Cormen Capítulo 8

Aula 06: Análise matemática de algoritmos recursivos

Transcrição:

Algoritmos de Ordenação: MergeSort ACH2002 - Introdução à Ciência da Computação II Delano M. Beder Escola de Artes, Ciências e Humanidades (EACH) Universidade de São Paulo dbeder@usp.br 10/2008 Material baseado em slides do professor Marcos Chaim Delano M. Beder (EACH - USP) MergeSort ACH2002 1 / 24

Projeto por Indução Forte Hipótese de indução forte Sabemos ordenar um conjunto de 1 k < n inteiros. Caso base: n = 1. Um conjunto de um unico elemento está ordenado. Passo da Indução (Primeira Alternativa): Seja S um conjunto de n 2 inteiros. Podemos particionar S em dois conjuntos S 1 e S 2, de tamanhos n/2 e n/2. Como n 2, ambos S 1 e S 2 possuem menos do que n elementos. Por hipótese de indução, sabemos ordenar os conjuntos S 1 e S 2. Podemos então obter S ordenado intercalando os conjuntos ordenados S 1 e S 2. Delano M. Beder (EACH - USP) MergeSort ACH2002 2 / 24

Projeto por Indução Forte Esta indução dá origem ao algoritmo de divisão e conquista MergeSort. Na implementação do algoritmo, o conjunto S é um vetor de tamanho n. A operação de divisão é imediata, o vetor é dividido em dois vetores com metade do tamanho do original, que são ordenados recursivamente. O trabalho do algoritmo está concentrado na conquista: a intercalação dos dois subvetores ordenados. Para simplificar a implementação da operação de intercalação e garantir sua complexidade linear, usamos um vetor auxiliar. Delano M. Beder (EACH - USP) MergeSort ACH2002 3 / 24

Ordenação por Intercalação MergeSort Ordenação por intercalação/junção/fusão: mais conhecida como MergeSort. Dividir: divide a seqüência de n elementos a serem ordenados em duas subseqüências de tamanho n/2 e n/2. Conquistar: ordena as duas subseqüências recursivamente por intercalação. Combinar: faz a intercalação das duas seqüências ordenadas de modo a produzir a resposta ordenada. Delano M. Beder (EACH - USP) MergeSort ACH2002 4 / 24

Ordenação por Intercalação MergeSort Dividir é fácil. Basta dividir a seqüência em dois. Conquistar também não é difícil. Dividindo o problema em dois necessariamente vamos chegar a uma seqüencia de tamanho um cuja ordenação é trivial. Combinar, esse é o problema! Como combinar? Delano M. Beder (EACH - USP) MergeSort ACH2002 5 / 24

Fusão de Vetores No livro [2], foi apresentado um método para fusão de vetores: Fusão de Vetores int [] fusao(int [] a, int [] b) { int posa = 0, posb = 0, posc = 0; int [] c = new int [a.length + b.length]; // Enquanto nenhuma das seqüências está vazia... while (posa < a.length && posb < b.length) { // Pega o menor elemento das duas seqüências if(b[posb] <= a[posa]) { c[posc] = b[posb]; posb++; else { c[posc] = a[posa]; posa++; posc++; Delano M. Beder (EACH - USP) MergeSort ACH2002 6 / 24

Fusão de Vetores (continuação) Fusão de Vetores (continuação) // Completa com a seqüência que ainda não acabou while (posa < a.length) { c[posc] = a[posa]; posc++; posa++; while (posb < b.length) { c[posc] = b[posb]; posc++; posb++; return c; // retorna o valor resultado da fusão Delano M. Beder (EACH - USP) MergeSort ACH2002 7 / 24

Ordenação por Intercalação MergeSort Esse algoritmo não é exatamente o que desejamos. Ele retorna um novo arranjo que contém a fusão. O que queremos, no entanto, é realizar a fusão de subseqüências de um vetor. Algo assim: void merge(int [] A, int p, int q, int r) { // A subseqüência A[p...q] está ordenada // A subseqüência A[q+1...r] está ordenada // Faz a junção das duas subseqüências... // A subseqüência A[p...r] está ordenada Delano M. Beder (EACH - USP) MergeSort ACH2002 8 / 24

Ordenação por Intercalação MergeSort Utilizando a mesma idéia da fusão de dois arranjos, com a assinatura e restrições definidas acima, tem-se: Fusão void merge(int [] A, int p, int q, int r) { // A subseqüência A[p...q] está ordenada // A subseqüência A[q+1...r] está ordenada 1: int i, j, k; // Faz cópias - seq1 = A[p...q] e seq2 = A[q+1...r] 2: int tamseq1 = q - p + 1; // tamanho da subseqüência 1 3: int tamseq2 = r - q; // tamanho da subseqüência 2 4: int [] seq1 = new int [tamseq1]; 5: for(i=0; i < seq1.length; i++) { seq1[i] = A[p+i]; 6: int [] seq2 = new int [tamseq2]; 7: for(j=0; j < seq2.length; j++) { seq2[j] = A[q+j+1]; Delano M. Beder (EACH - USP) MergeSort ACH2002 9 / 24

Ordenação por Intercalação MergeSort Fusão (Continuação) // Faz a junção das duas subseqüências 8: k = p; i = 0; j = 0; 9: while (i < seq1.length && j < seq2.length) { // Pega o menor elemento das duas seqüências 10: if(seq2[j] <= seq1[i]) { 11: A[k] = seq2[j]; 12: j++; else { 13: A[k] = seq1[i]; 14: i++; 15: k++; Delano M. Beder (EACH - USP) MergeSort ACH2002 10 / 24

Ordenação por Intercalação MergeSort Fusão (Continuação 2) // Completa com a seqüência que ainda não acabou 16: while (i < seq1.length) { 17: A[k] = seq1[i]; 18: k++; 19: i++; 20: while (j < seq2.length) { 21: A[k] = seq2[j]; 22: k++; 23: j++; // A subseqüência A[p...r] está ordenada Delano M. Beder (EACH - USP) MergeSort ACH2002 11 / 24

Ordenação por Intercalação MergeSort Agora que já sabemos como combinar (merge), podemos terminar o algoritmo de ordenação por intercalação: void mergesort(int [] numeros, int ini, int fim) { if(ini < fim) { //Divisao 1: int meio = (ini + fim)/2; // Conquista 2: mergesort(numeros, ini, meio); 3: mergesort(numeros, meio+1, fim); // Combinação 4: merge(numeros, ini, meio, fim); // Solução trivial: ordenacao de um único número. Delano M. Beder (EACH - USP) MergeSort ACH2002 12 / 24

MergeSort 1. MergeSort (A, 0, 7) 1.1. MergeSort (A, 0, 3) 2 8 7 1 3 5 6 4 ini = 0, fim = 7, meio = 3 1.1.1. MergeSort (A, 0, 1) 2 8 7 1 3 5 6 4 ini = 0, fim = 3, meio = 1 2/2 8 7 1 3 5 6 4 ini = 0, fim = 1, meio = 0 1.1.1.1. MergeSort (A, 0, 0) 1.1.1.2. MergeSort (A, 1, 1) 1.1.1.3. Merge (A, 0, 1) 2 8 7 1 3 5 6 4 2 8 7 1 3 5 6 4 Delano M. Beder (EACH - USP) MergeSort ACH2002 13 / 24

MergeSort 1.1.2. MergeSort (A, 2, 3) 2 8 7/7 1 3 5 6 4 ini = 2, fim = 3, meio = 2 1.1.2.1. MergeSort (A, 2, 2) 1.1.2.2. MergeSort (A, 3, 3) 1.1.2.3. Merge (A, 2, 3) 1.1.3. Merge (A, 0, 3) 2 8 7 1 3 5 6 4 2 8 1 7 3 5 6 4 2 8 1 7 3 5 6 4 1 2 7 8 3 5 6 4 Delano M. Beder (EACH - USP) MergeSort ACH2002 14 / 24

MergeSort 1.2. MergeSort (A, 4, 7) 1 2 7 8 3 5 6 4 ini = 4, fim = 7, meio = 5 1.2.1. MergeSort (A, 4, 5) 1 2 7 8 3/3 5 6 4 ini = 4, fim = 5, meio = 4 1.2.1.1. MergeSort (A, 4, 4) 1.2.1.2. MergeSort (A, 5, 5) 1.2.1.3. Merge (A, 4, 5) 1 2 7 8 3 5 6 4 1 2 7 8 3 5 6 4 Delano M. Beder (EACH - USP) MergeSort ACH2002 15 / 24

MergeSort 1.2.2. MergeSort (A, 6, 7) 1 2 7 8 3 5 6/6 4 ini = 6, fim = 7, meio = 6 1.2.2.1. MergeSort (A, 6, 6) 1.2.2.2. MergeSort (A, 7, 7) 1.2.2.3. Merge (A, 6, 7) 1.2.3. Merge (A, 4, 7) 1.3. Merge (A, 0, 7) 1 2 7 8 3 5 6 4 1 2 7 8 3 5 4 6 1 2 7 8 3 5 4 6 1 2 7 8 3 4 5 6 1 2 7 8 3 4 5 6 1 2 3 4 5 6 7 8 Delano M. Beder (EACH - USP) MergeSort ACH2002 16 / 24

Análise da Fusão (Merge) Complexidada temporal: T(Linhas 1-3): O(1). T(Linhas 4-7): O(seq1.length + seq2.length) T(Linhas 9-23): O(seq1.length + seq2.length) Como é uma seqüência, T(1-23) = O(seq1.length + seq2.length) + O(seq1.length + seq2.length) + O(1) T(1-23) = O(max(seq1.length + seq2.length, seq1.length + seq2.length, 1)) T(1-23) = O(seq1.length + seq2.length) Se fizermos n 1 = seq1.length e n 2 = seq2.length T(1-23) = O(n 1 + n 2 ). Delano M. Beder (EACH - USP) MergeSort ACH2002 17 / 24

Análise da ordenação por intercalação MergeSort Ordenação por intercalação utiliza a abordagem dividir e conquistar. Então podemos antes fazer análise genérica dos algoritmos que utilizam essa abordagem. Dividir e conquistar envolve três passos: 1 Dividir 2 Conquistar 3 Combinar Portanto, a complexidade de tempo de algoritmos dividir e conquistar para um entrada de tamanho n é: T (n) = Dividir(n) + Conquistar(n) + Combinar(n). Delano M. Beder (EACH - USP) MergeSort ACH2002 18 / 24

Análise da ordenação por intercalação MergeSort Para entradas pequenas, isto é, para n c, podemos assumir que T (n) = O(1). Vamos supor que o problema seja dividido em a subproblemas, cada um com 1/b do tamanho original. Se levamos D(n) para dividir o problema em subproblemas e C(n) para combinar as soluções dados aos subproblemas, então tem-se a recorrência T (n) tal que: { O(1) se n 0 T (n) = at (n/b) + D(n) + C(n) caso contrário Delano M. Beder (EACH - USP) MergeSort ACH2002 19 / 24

Análise da ordenação por intercalação MergeSort Sem perda de generalidade, podemos supor que n é uma potência de 2: n = 2 i para i 0. Para n = 1, isto é, a ordenação de um vetor com um único elemento, a complexidade temporal é T (1) = O(1), pois é o caso base e não requer fusão. Delano M. Beder (EACH - USP) MergeSort ACH2002 20 / 24

Análise da ordenação por intercalação MergeSort Dividir: a etapa de dividir simplesmente calcula o ponto médio do subvetor, o que demora um tempo constante. D(n) = O(1) Conquistar: resolvemos recursivamente dois subproblemas; cada um tem o tamanho n/2 Contribui com 2T (n/2) para o tempo de execução Combinar: Já foi calculado que o método merge em um subvetor de tamanho n C(n) = n 1 + n 2 é O(n). Delano M. Beder (EACH - USP) MergeSort ACH2002 21 / 24

Análise da ordenação por intercalação MergeSort Portanto, a complexidade T (n) para o algoritmo de ordenação por intercalação MergeSort é: { O(1) se n = 1 T (n) = 2T (n/2) + n 1 caso contrário Teorema Mestre (CLRS): temos que a = 2, b = 2 e f (n) = n. Desta forma n log b a = n log 2 2 = n 1 = n. Desde que f (n) Θ(n log 2 2 ) = Θ(n), nós podemos aplicar o caso 2 do Teorema Mestre. T (n) = Θ(n log b a log n) = Θ(n log 2 2 log n) = Θ(n log n). Logo, a solução é T (n) Θ(n log n). Delano M. Beder (EACH - USP) MergeSort ACH2002 22 / 24

Análise da ordenação por intercalação MergeSort É possível fazer a intercalação dos subvetores ordenados sem o uso de vetor auxiliar? Sim! Basta deslocarmos os elementos de um dos subvetores, quando necessário, para dar lugar ao mínimo dos dois subvetores. No entanto, a etapa de intercalação passa a ter complexidade Θ(n 2 ), resultando na seguinte recorrência: { O(1) se n = 1 T (n) = 2T (n/2) + n 2 caso contrário Ou seja, a complexidade do MergeSort passa a ser Θ(n 2 ). Como era de se esperar, a eficiência da etapa de intercalação é crucial para a eficiência do MergeSort. Delano M. Beder (EACH - USP) MergeSort ACH2002 23 / 24

Referências Referências utilizadas: [1] (páginas 21-48). [1] T. H. Cormen, C. E. Leiserson, R. L. Rivest & C. Stein. Algoritmos - Tradução da 2a. Edição Americana. Editora Campus, 2002. [2] F. Kon, A. Goldman, P.J.S. Silva. Introdução à Ciência de Computação com Java e Orientado a Objetos, IME - USP, 2005. Delano M. Beder (EACH - USP) MergeSort ACH2002 24 / 24