Dividir e Conquistar+Busca

download Dividir e Conquistar+Busca

of 85

Transcript of Dividir e Conquistar+Busca

Estruturas de Dados 2

Tcnicas de Projeto de Algoritmos Dividir e Conquistar

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 1/83

Dividir e Conquistar

Projeto de Algoritmos por Diviso e Conquista

Introduo Busca Recursiva Ordenao: InsertionSort, MergeSort, HeapSort e QuickSort Resumo

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 2/83

Dividir e Conquistar

Introduo

Dividir e Conquistar uma tcnica de projeto de algoritmos que consiste em resolver um problema a partir da soluo de sub-problemas menores do mesmo tipo.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 3/83

Dividir e Conquistar

Introduo

Dividir e Conquistar uma tcnica de projeto de algoritmos que consiste em resolver um problema a partir da soluo de sub-problemas menores do mesmo tipo. Se os sub-problemas obtidos aps a diviso ainda so muito grandes para a soluo direta, aplica-se novamente a diviso, at ter problemas pequenos o suficiente para terem soluo trivial ou direta.IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 4/83

Dividir e Conquistar

Introduo

Aps o processo de diviso em sub-problemas menores, e sua conquista, basta combinar os resultados dos sub-problemas menores, para obter a soluo para o problema como um todo.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 5/83

Dividir e ConquistarPassos para diviso e conquista: 1. Diviso: propor uma forma de dividir o problema original em sub-problemas iguais, porm menores (recursivamente); 2. Conquista: ao se obter sub-problemas pequenos o suficiente, resolv-los diretamente; 3. Combinao: combinar as solues de forma a obter a soluo ao problema original.IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 6/83

Dividir e Conquistar

Vantagens

Soluo direta do ponto de vista da recursividade; Elegncia; Usualmente produz algoritmos eficientes (complexidade logartmica!!!)

Desvantagem

Recurso!!!!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 7/83

Dividir e Conquistar

Como aplicar?

Processo Indutivo ao projeto de algoritmos(recurso) Aplicvel sempre que for possvel obter subproblemas menores independentes entre si Procurar uma diviso igualitria de um problema em diversos sub-problemas....... Deve ser possvel (e de preferncia simples e rpido) combinar os resultados dos sub-problemas....IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 8/83

Dividir e Conquistar

Justificativa

Esta tcnica pode ser empregada em diversas situaes comuns porm importantes:

Somar N nmeros; Encontrar um elemento em um vetor ordenado;

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 9/83

Dividir e Conquistar

Exemplo da aplicao da tcnica:

Como somar N nmeros, a1, a2, ..., an?

Se n 1, a soma o prprio a1. Se n>1, podemos dividir o problema em dois subproblemas menores: 1.Somar os nmeros de a1 at an/2 ;

2.Somar os nmero de an/2 at an ; 3.Somar os resultados!!!IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 10/83

Dividir e Conquistar

Exemplo da aplicao da tcnica:

Como somar N nmeros, a1, a2, ..., an? Eficincia????

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 11/83

Dividir e Conquistar

Exemplo da aplicao da tcnica:

Como somar N nmeros, a1, a2, ..., an? Eficincia???? O(n)......(Melhor que uma abordagem exaustiva????)

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 12/83

Dividir e Conquistar

Exemplo da aplicao da tcnica:

Como somar N nmeros, a1, a2, ..., an? Eficincia???? O(n)......(Melhor que uma abordagem exaustiva????) Claramente NO!!!!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 13/83

Dividir e Conquistar

Exemplo da aplicao da tcnica:

Como somar N nmeros, a1, a2, ..., an? Eficincia???? O(n)......(Melhor que uma abordagem exaustiva????) Claramente NO!!!! Portanto, aplicar Diviso e Conquista no garante, por si s, a obteno de algoritmos eficientes!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 14/83

Dividir e Conquistar

OUTRO exemplo: Buscar um elemento!

Como encontrar o elemento em um vetor de tamanho N: a1, a2, ..., an? Se n 1, e o elemento a o procurado, achou, 1 seno no achou! Se n>1, podemos dividir o problema em dois subproblemas menores: 1.Encontrar o elemento no vetor de a1 at an/2 2.Encontrar o elemento no vetor de an/2 at an

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 15/83

Dividir e Conquistar

Mas esta tcnica no consegue gerar

resultados melhores que a Fora Bruta???

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 16/83

Dividir e Conquistar

Mas esta tcnica no consegue gerar

resultados melhores que a Fora Bruta???

Pode sim.....

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 17/83

Dividir e Conquistar

Mas esta tcnica no consegue gerar

resultados melhores que a Fora Bruta???

Pode sim..... Basta aplic-la adequadamente......!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 18/83

Dividir e Conquistar

Mas esta tcnica no consegue gerar

resultados melhores que a Fora Bruta???

Pode sim..... Basta aplic-la adequadamente......! Exemplo de uso adequado: Busca Binria.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 19/83

Dividir e Conquistar

Busca Binria:Encontrar um determinado elemento (chave) em um vetor

ordenado de tamanho N: a1, a2, ..., an?:

Verificar se a chave est na posio ax = an/2:

Se estiver, encontrou! Se no estiver, realizar a busca binria nos vetores:a1 at ax-1,se chave < ax , ou em ax+1 at an se chave > ax.IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 20/83

Dividir e Conquistar

Busca Binria: Exemplo: 3 5 7 8 9 11 12 19

Encontrar o nmero 12 na lista:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 21/83

Dividir e Conquistar

Busca Binria: Exemplo: 3 5 7 8 9 11 12 19 3 5 7 8 9 11 12 19 (est na posio X=n/2?)!

Encontrar o nmero 12 na lista:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 22/83

Dividir e Conquistar

Busca Binria: Exemplo: 3 5 7 8 9 11 12 19 3 5 7 8 9 11 12 19 (est na posio X=n/2?)! 3 5 7 8 9 11 12 19 (est na posio X=n/2?)S!

Encontrar o nmero 12 na lista:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 23/83

Dividir e Conquistar

Busca Binria:T, mas e da???? Bem, a eficincia deste algoritmo (lg n).... Muito mais eficiente que a abordagem Fora Bruta.....

....pena que o vetor precisa estar ordenado....... ....mas podemos aplicar a tcnica de Diviso e Conquista

para ordenar vetores tambm!!!!!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 24/83

Dividir e Conquistar

Ordenao com Diviso e Conquista: Problema: Ordenar um vetor de tamanho N: a , a , ..., 1 2 an Um vetor de um elemento j est ordenado! Um vetor de tamanho n pode ser ordenado pela intercalao de dois sub-vetores: 1.Um vetor de a1 at an/2 2.Outro vetor de an/2 at an

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 25/83

Dividir e Conquistar

Ordenao com Diviso e Conquista: Problema: Ordenar um vetor de tamanho N: a , a , ..., 1 2 an Um vetor de um elemento j est ordenado! Um vetor de tamanho n pode ser ordenado pela intercalao de dois sub-vetores: 1.Um vetor de a1 at an/2 2.Outro vetor de an/2 at an Esta maneira de ordenar d origem ao algoritmo recursivo de ordenao MergeSort!!!IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 26/83

Dividir e Conquistar

Ordenao com Diviso e Conquista: Problema: Ordenar um vetor de tamanho N: a , a , ..., 1 2 an Um vetor de um elemento j est ordenado! Um vetor de tamanho n pode ser ordenado pela intercalao de dois sub-vetores: 1.Um vetor de a1 at an/2 2.Outro vetor de an/2 at an Esta maneira de ordenar d origem ao algoritmo recursivo de ordenao MergeSort!!! Isto projetar um algoritmo por diviso e conquista!!!IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 27/83

Dividir e Conquistar

MergeSort:

Se a funo intercala for eficiente=O(n)Detalhe: para conseguir implementar a intercalao de forma eficiente, necessrio um vetor auxiliar, o que aumenta a memria necessria para o algoritmo...no uma ordenao in-place,como a Ordenao por Seleo

T(n) = 2T(n/2) + O(n) Logo, Mergesort (n lg n) (Master)IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 28/83

Dividir e Conquistar

MergeSort(A, e, d): : Pseudo-Cdigo

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 29/83

Dividir e Conquistar

Intercala(A, e, d): Pseudo-Cdigo

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 30/83

Dividir e Conquistar

Aplicando Dividir e Conquistar de outra forma: Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 31/83

Dividir e Conquistar

Aplicando Dividir e Conquistar de outra forma: Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S. Sejam S1 e S2 os subconjuntos de {S x} dos elementos menores ou iguais a x e maiores que x, respectivamente.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 32/83

Dividir e Conquistar

Aplicando Dividir e Conquistar de outra forma: Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S. Sejam S1 e S2 os subconjuntos de {S x} dos elementos menores ou iguais a x e maiores que x, respectivamente. Ambos S1 e S2 possuem menos de n elementos. Por hiptese de induo, sabemos ordenar os conjuntos S1 e S2.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 33/83

Dividir e Conquistar

Aplicando Dividir e Conquistar de outra forma: Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S. Sejam S1 e S2 os subconjuntos de {S x} dos elementos menores ou iguais a x e maiores que x, respectivamente. Ambos S1 e S2 possuem menos de n elementos. Por hiptese de induo, sabemos ordenar os conjuntos S1 e S2. Podemos obter S ordenado concatenando S1 ordenado, x e S2 ordenado.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 34/83

Dividir e Conquistar

Aplicando Dividir e Conquistar de outra forma: Seja S um conjunto de n 2 inteiros e x um elemento qualquer de S. Sejam S1 e S2 os subconjuntos de {S x} dos elementos menores ou iguais a x e maiores que x, respectivamente. Ambos S1 e S2 possuem menos de n elementos. Por hiptese de induo, sabemos ordenar os conjuntos S1 e S2. Podemos obter S ordenado concatenando S1 ordenado, x e S2 ordenado. Esta abordagem d origem ao algoritmo QuickSort!!!IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 35/83

Dividir e ConquistarEm contraste ao Mergesort, no Quicksort a operao de diviso que mais custosa: depois de escolhermos o piv(x), temos que separar os elementos do vetor maiores que o x dos menores ou iguais a x.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 36/83

Dividir e ConquistarEm contraste ao Mergesort, no Quicksort a operao de diviso que mais custosa: depois de escolhermos o piv(x), temos que separar os elementos do vetor maiores que o x dos menores ou iguais a x. Conseguimos fazer essa diviso com (n) operaes: basta varrer o vetor com dois apontadores, um varrendo da direita para a esquerda e outro da esquerda para a direita, em busca de elementos situados na parte errada do vetor, e trocar um par de elementos de lugar quando encontrado.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 37/83

Dividir e ConquistarEm contraste ao Mergesort, no Quicksort a operao de diviso que mais custosa: depois de escolhermos o piv(x), temos que separar os elementos do vetor maiores que o x dos menores ou iguais a x. Conseguimos fazer essa diviso com (n) operaes: basta varrer o vetor com dois apontadores, um varrendo da direita para a esquerda e outro da esquerda para a direita, em busca de elementos situados na parte errada do vetor, e trocar um par de elementos de lugar quando encontrado. Aps essa etapa basta ordenarmos os dois trechos do vetor recursivamente para obtermos o vetor ordenado, ou seja, a conquista imediata.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 38/83

Dividir e Conquistar

Quicksort(A,e,d) - Pseudo-Cdigo:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 39/83

Dividir e Conquistar

Quicksort(A,e,d) - Pseudo-Cdigo(cont):

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 40/83

Dividir e Conquistar1. Selecionar um elemento para ser o piv 2. Rearranjar a lista de modo que todos os elementos nas posies a esquerda do piv sejam menores ou iguais a ele, e aqueles a direita do piv sejam maiores que ele. 3. Permutar o piv com o ltimo elemento da primeira sub-lista(menores ou iguais). Agora o piv est em sua posio final. 4. Ordenar as duas sub-listas.

Quicksort- Idia Base

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 41/83

Dividir e Conquistar

QuickSort Exemplo5 3 1 9 8 2 4 7 partition 2 3 1 4 5 8 9 7 2 3 1 4 partition 1 2 3 4 partition 1 3 4 partition 4

8 9 7 partition 7 8 9 7 9

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 42/83

Dividir e Conquistar

Quicksort Anlise da ComplexidadeQuantas comparaes e quantas trocas o algoritmo Quicksort executa no pior caso ?

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 43/83

Dividir e Conquistar

Quicksort Anlise da ComplexidadeQuantas comparaes e quantas trocas o algoritmo Quicksort executa no pior caso ? Certamente a operao de diviso tem complexidade (n), mas o tamanho dos dois subproblemas depende do piv escolhido.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 44/83

Dividir e Conquistar

Quicksort Anlise da ComplexidadeQuantas comparaes e quantas trocas o algoritmo Quicksort executa no pior caso ? Certamente a operao de diviso tem complexidade (n), mas o tamanho dos dois subproblemas depende do piv escolhido. No pior caso, cada diviso sucessiva do Quicksort separa um nico elemento dos demais, recaindo na recorrncia: T(n) = 0, se n = 1 T(n) = T(n 1) + n, se n > 1,

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 45/83

Dividir e Conquistar

Quicksort Anlise da ComplexidadeQuantas comparaes e quantas trocas o algoritmo Quicksort executa no pior caso ? Certamente a operao de diviso tem complexidade (n), mas o tamanho dos dois subproblemas depende do piv escolhido. No pior caso, cada diviso sucessiva do Quicksort separa um nico elemento dos demais, recaindo na recorrncia: T(n) = 0, se n = 1 T(n) = T(n 1) + n, se n > 1, Portanto, (n2) comparaes e trocas so executadas no pior caso!!!!!!IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 46/83

Dividir e ConquistarMas o Quicksort no era o algoritmo de ordenao mais eficiente????

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 47/83

Dividir e ConquistarMas o Quicksort no era o algoritmo de ordenao mais eficiente????

Ento, o algoritmo Quicksort assintoticamente menos eficiente que o Mergesort no pior caso.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 48/83

Dividir e ConquistarMas o Quicksort no era o algoritmo de ordenao mais eficiente????

Ento, o algoritmo Quicksort assintoticamente menos eficiente que o Mergesort no pior caso. Entretanto, no caso mdio, o Quicksort efetua (n log n) comparaes e trocas.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 49/83

Dividir e ConquistarMas o Quicksort no era o algoritmo de ordenao mais eficiente????

Ento, o algoritmo Quicksort assintoticamente menos eficiente que o Mergesort no pior caso. Entretanto, no caso mdio, o Quicksort efetua (n log n) comparaes e trocas. Assim, na prtica, o Quicksort bastante eficiente, com uma vantagem adicional em relao ao Mergesort: in place, isto , no utiliza um vetor auxiliar.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 50/83

Dividir e ConquistarConsiderando que o pior caso no ocorre com freqncia, pois usualmente, pegando um piv aleatrio, muito difcil escolher sempre um piv que divida o vetor de tamanho n em dois vetores, um dos menores e outro dos maiores que o piv, com tamanhos (n-1) e 1....

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 51/83

Dividir e ConquistarConsiderando que o pior caso no ocorre com freqncia, pois usualmente, pegando um piv aleatrio, muito difcil escolher sempre um piv que divida o vetor de tamanho n em dois vetores, um dos menores e outro dos maiores que o piv, com tamanhos (n-1) e 1.... Desta forma, supondo uma diviso do vetor de tamanho n em dois sub-vetores (n/2), e considerando o tempo de separao entre os maiores e os menores que o piv sendo O(n)....IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 52/83

Dividir e ConquistarConsiderando que o pior caso no ocorre com freqncia, pois usualmente, pegando um piv aleatrio, muito difcil escolher sempre um piv que divida o vetor de tamanho n em dois vetores, um dos menores e outro dos maiores que o piv, com tamanhos (n-1) e 1.... Desta forma, supondo uma diviso do vetor de tamanho n em dois sub-vetores (n/2), e considerando o tempo de separao entre os maiores e os menores que o piv sendo O(n).... O tempo mdio T(n)=2T(n/2)+O(n) = O(n lg n)IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 53/83

Dividir e ConquistarOrdenao: Mas no h um algoritmo que seja eficiente em todos os casos, e in place ao mesmo tempo?

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 54/83

Dividir e ConquistarOrdenao: Mas no h um algoritmo que seja eficiente em todos os casos, e in place ao mesmo tempo? Vocs tinham que perguntar?????

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 55/83

Dividir e ConquistarOrdenao: Mas no h um algoritmo que seja eficiente em todos os casos, e in place ao mesmo tempo? Vocs tinham que perguntar????? Este algoritmo chama-se HeapSort.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 56/83

Dividir e ConquistarOrdenao: Mas no h um algoritmo que seja eficiente em todos os casos, e in place ao mesmo tempo? Vocs tinham que perguntar????? Este algoritmo chama-se HeapSort. E baseado numa estrutura de dados inteligente denominada Heap..... implementa uma fila de prioridades.... Podermos utiliz-la para fazer uma ordenao inplace e (n lg n)!!!! (Mas o Quicksort ainda mais rpido!!!!)

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 57/83

Dividir e ConquistarOrdenao por Heap(HeapSort): Tarefa: Implementar a estrutura de dados Heap para podermos utiliz-la para fazer uma ordenao in-place e (n lg n)!!!!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 58/83

Dividir e ConquistarOrdenao por Heap(HeapSort): Tarefa: Implementar a estrutura de dados Heap para podermos utiliz-la para fazer uma ordenao in-place e (n lg n)!!!! Mas o que um Heap???

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 59/83

Dividir e ConquistarOrdenao por Heap(HeapSort): Tarefa: Implementar a estrutura de dados Heap para podermos utiliz-la para fazer uma ordenao in-place e (n lg n)!!!! Mas o que um Heap??? uma simulao de uma rvore binria completa utilizando um vetor!!!!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 60/83

Dividir e ConquistarHeap: Vetor que apresenta as seguintes caractersticas: Vetor A de tamanho N (lenght(A) = n de nodos da rvore) A[1] = raiz da rvore binria (primeira posio do vetor) Para calcular a posio de qualquer nodo, utilizamos as funes PARENT, LEFT E RIGHT: PARENT(i) return i/2 LEFT(i) return 2i RIGHT(i) return 2i + 1

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 61/83

Dividir e Conquistar

Heap: (Cormen)

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 62/83

Dividir e ConquistarHeap: Caracterstica que distingue um Heap de uma rvore binria : A[PARENT(i)] A[i] (Max-Heap)

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 63/83

Dividir e Conquistar

Como utilizar um Heap para Ordenar????O Heap permite que o elemento mximo do conjunto seja determinado e corretamente posicionado no vetor em tempo constante, trocando o primeiro elemento do heap com o ltimo. O trecho restante do vetor (do ndice 1 ao n 1), que pode ter deixado de ter a estrutura de heap, volte a t-la com nmero de trocas de elementos proporcional altura da rvore. O algoritmo Heapsort consiste ento da construo de um heap com os elementos a serem ordenados, seguida de sucessivas trocas do primeiro com o ltimo elemento e rearranjos do heap.IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 64/83

Dividir e Conquistar

HeapSort(A, n) - Pseudo-Cdigo:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 65/83

Dividir e Conquistar

AjustaHeap(A, i, n) - Pseudo-Cdigo:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 66/83

Dividir e Conquistar

Exemplo do Funcionamento de AjustaHeap(A,2,10):

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 67/83

Dividir e Conquistar

Exemplo do Funcionamento de AjustaHeap(A,2,10):

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 68/83

Dividir e Conquistar

Exemplo do Funcionamento de AjustaHeap(A,2,10):

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 69/83

Dividir e Conquistar

Complexidade do HeapSort: Quantas comparaes e quantas trocas so executadas no pior caso na etapa de ordenao do algoritmo Heapsort? No pior caso, a funo AjustaHeap efetua (h) comparaes e trocas, onde h a altura do heap que contm os elementos que resta ordenar. Como o heap representa uma rvore binria completa, ento h (log i ), onde i o nmero de elementos do heap.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 70/83

Dividir e Conquistar

Complexidade do HeapSort: Logo, a complexidade da etapa de ordenao do Heapsort :

Portanto, no pior caso, a etapa de ordenao efetua O(n log n) comparaes e trocas! Mas e a construo do Heap????

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 71/83

Dividir e Conquistar

ConstroiHeap()\

Se o trecho de 1 a i do vetor tem estrutura de Heap, fcil adicionar a folha i + 1 ao Heap e em seguida rearranj-lo,garantindo que o trecho de 1 a i + 1 tem estrutura de Heap. Esta a abordagem top-down para construo do Heap.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 72/83

Dividir e Conquistar

ConstroiHeap(A, n) Pseudo-Cdigo (Top-Down):

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 73/83

Dividir e Conquistar

ConstroiHeap(A, n) (Top-Down): Quantas comparaes e quantas trocas so executadas no pior caso na construo do heap pela abordagem top-down ? O rearranjo do heap na iterao i efetua (h) comparaes e trocas no pior caso, onde h a altura da rvore representada pelo trecho do Heap de 1 a i . Logo, h (log i ). Portanto, o nmero de comparaes e trocas efetuadas construo do Heap por esta abordagem :

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 74/83

Dividir e ConquistarEnto, o algoritmo Heapsort efetua ao todo (n log n) comparaes e trocas no pior caso.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 75/83

Dividir e ConquistarEnto, o algoritmo Heapsort efetua ao todo (n log n) comparaes e trocas no pior caso. (Bem....sendo mais preciso, executa 2 n log n comparaes e trocas......)

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 76/83

Dividir e ConquistarEnto, o algoritmo Heapsort efetua ao todo (n log n) comparaes e trocas no pior caso. (Bem....sendo mais preciso, executa 2 n log n comparaes e trocas......) Mas existe maneira mais eficiente de construir um Heap?

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 77/83

Dividir e Conquistar

Suponha que o trecho de i a n do vetor tal que, para todo j , i j n, a subrvore de raiz j representada por esse trecho do vetor tem estrutura de heap. Note que, em particular, o trecho de n/2 + 1 a n do vetor satisfaz a propriedade, pois inclui apenas folhas da rvore binria de n elementos. Podemos ento executar AjustaHeap(A, i 1, n), garantindo assim que o trecho de i 1 a n satisfaz a propriedade. Esta a abordagem bottom-up para construo do Heap.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 78/83

Dividir e Conquistar

ConstroiHeap(A, n) Pseudo-Cdigo Alternativo...:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 79/83

Dividir e Conquistar

ConstroiHeap(A, 6) Exemplo: A=[2,9,7,6,5,8]

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 80/83

Dividir e Conquistar

ConstroiHeap Complexidade:Quantas comparaes e quantas trocas so executadas no pior caso na construo do Heap pela abordagem bottom-up ? O(n lo g n )! Mas possvel provar matematicamente que este pior caso O(n).... utilizando o conhecimento sobre a altura de cada sub-rvore aonde se executa o AjustaHeap(). Ainda assim, o algoritmo HeapSort() continua sendo

(n lo g n )IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 81/83

Dividir e ConquistarParte Prtica: Implementar os algoritmos MergeSort, QuickSort e HeapSort apresentados, rodar uma batelada de testes para medir os tempos de execuo e a quantidade de comparaes executada por cada algoritmo, comparando os resultados!

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 82/83

Dividir e Conquistar - Concluso:

Estes slides so baseados no material disponibilizado pelos profs. Cid Carvalho de Souza e Cndida Nunes da Silva, da UNICAMP. Qualquer incorretude , entretanto, de inteira responsabilidade do prof. Joo Alberto Fabro, da UTFPR.

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 83/83

Dividir e Conquistar - Prs e Contras:

Prs:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 84/83

Dividir e Conquistar - Prs e Contras:

Contras:

IF64C Estruturas de Dados 2 Engenharia da Computao Prof. Joo Alberto Fabro - Slide 85/83