Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a...
Transcript of Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a...
![Page 1: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/1.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 1/83
Estruturas de Dados 2
Técnicas de Projeto de Algoritmos
Dividir e Conquistar
![Page 2: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/2.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 2/83
Dividir e Conquistar● Projeto de Algoritmos por Divisão e Conquista
● Introdução● Busca “Recursiva”● Ordenação: InsertionSort, MergeSort, HeapSort e
QuickSort● Resumo
![Page 3: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/3.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 3/83
Dividir e Conquistar● Introdução
● “Dividir e Conquistar” é uma técnica de projeto de
algoritmos que consiste em resolver um problema a
partir da solução de “sub-problemas menores” do
mesmo tipo.
![Page 4: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/4.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 4/83
Dividir e Conquistar● Introdução
● “Dividir e Conquistar” é uma técnica de projeto de
algoritmos que consiste em resolver um problema a
partir da solução de “sub-problemas menores” do
mesmo tipo.● Se os sub-problemas obtidos após a “divisão” ainda
são muito grandes para a solução “direta”, aplica-se
novamente a “divisão”, até ter problemas pequenos o
suficiente para terem solução trivial ou direta.
![Page 5: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/5.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 5/83
Dividir e Conquistar● Introdução
● Após o processo de “divisão” em sub-problemas
menores, e sua “conquista”, basta “combinar” os
resultados dos sub-problemas menores, para obter a
solução para o problema como um todo.
![Page 6: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/6.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 6/83
Dividir e Conquistar Passos para “divisão e conquista”:1. Divisão: propor uma forma de dividir o problema
original em sub-problemas iguais, porém menores
(recursivamente);
2. Conquista: ao se obter sub-problemas “pequenos o
suficiente”, resolvê-los diretamente;
3. Combinação: combinar as soluções de forma a obter
a solução ao problema original.
![Page 7: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/7.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 7/83
Dividir e Conquistar● Vantagens
● Solução “direta” do ponto de vista da recursividade;● Elegância;● Usualmente produz algoritmos eficientes
(complexidade logarítmica!!!)● Desvantagem
● Recursão!!!!
![Page 8: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/8.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 8/83
Dividir e Conquistar● Como aplicar?
● Processo “Indutivo” ao projeto de algoritmos(recursão)● Aplicável sempre que for possível obter “sub-
problemas menores independentes entre si”● Procurar uma divisão “igualitária” de um problema em
diversos sub-problemas.......● Deve ser possível (e de preferência simples e rápido)
combinar os resultados dos sub-problemas....
![Page 9: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/9.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 9/83
Dividir e Conquistar● Justificativa
● Esta técnica pode ser empregada em diversas
situações comuns porém importantes:● Somar N números;● Encontrar um elemento em um vetor ordenado;
![Page 10: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/10.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 10/83
Dividir e Conquistar● Exemplo da aplicação da técnica:
● Como somar N números, a1, a
2, ..., a
n?
● Se n é 1, a soma é o próprio a1.
● Se n>1, podemos dividir o problema em dois sub-problemas menores:1.Somar os números de a
1 até a
n/2 ;
2.Somar os número de an/2
até an ;
3.Somar os resultados!!!
![Page 11: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/11.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 11/83
Dividir e Conquistar● Exemplo da aplicação da técnica:
● Como somar N números, a1, a
2, ..., a
n?
● Eficiência????
![Page 12: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/12.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 12/83
Dividir e Conquistar● Exemplo da aplicação da técnica:
● Como somar N números, a1, a
2, ..., a
n?
● Eficiência????● O(n)......(Melhor que uma abordagem “exaustiva”????)
![Page 13: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/13.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 13/83
Dividir e Conquistar● Exemplo da aplicação da técnica:
● Como somar N números, a1, a
2, ..., a
n?
● Eficiência????● O(n)......(Melhor que uma abordagem “exaustiva”????)● Claramente NÃO!!!!
![Page 14: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/14.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 14/83
Dividir e Conquistar● Exemplo da aplicação da técnica:
● Como somar N números, a1, a
2, ..., a
n?
● Eficiência????● O(n)......(Melhor que uma abordagem “exaustiva”????)● Claramente NÃO!!!!● Portanto, aplicar “Divisão e Conquista” não garante,
por si só, a obtenção de algoritmos eficientes!
![Page 15: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/15.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 15/83
Dividir e Conquistar● OUTRO exemplo: Buscar um elemento!
● Como encontrar o elemento em um vetor de tamanho N: a
1, a
2, ..., a
n?
● Se n é 1, e o elemento a1 é o procurado, achou,
senão não achou!● Se n>1, podemos dividir o problema em dois sub-
problemas menores:1.Encontrar o elemento no vetor de a
1 até a
n/2
2.Encontrar o elemento no vetor de an/2
até an
![Page 16: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/16.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 16/83
Dividir e Conquistar● Mas esta técnica não consegue gerar resultados melhores que a “Força Bruta”???
![Page 17: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/17.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 17/83
Dividir e Conquistar● Mas esta técnica não consegue gerar resultados melhores que a “Força Bruta”???●Pode sim.....
![Page 18: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/18.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 18/83
Dividir e Conquistar● Mas esta técnica não consegue gerar resultados melhores que a “Força Bruta”???●Pode sim.....●Basta aplicá-la “adequadamente”......!
![Page 19: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/19.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 19/83
Dividir e Conquistar● Mas esta técnica não consegue gerar resultados melhores que a “Força Bruta”???●Pode sim.....●Basta aplicá-la “adequadamente”......!●Exemplo de uso adequado: “Busca Binária”.
![Page 20: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/20.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 20/83
Dividir e Conquistar●Busca Binária:● Encontrar um determinado elemento (chave) em um vetor
ordenado de tamanho N: a1, a
2, ..., a
n?:
● Verificar se a chave está na posição ax = a
n/2:
● Se estiver, encontrou!● Se não estiver, realizar a busca binária nos vetores:
a1 até a
x-1,se chave < a
x ,
ou em ax+1
até an se chave > a
x.
![Page 21: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/21.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 21/83
Dividir e Conquistar●Busca Binária: Exemplo:Encontrar o número 12 na lista:
3 5 7 8 9 11 12 19
![Page 22: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/22.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 22/83
Dividir e Conquistar●Busca Binária: Exemplo:Encontrar o número 12 na lista:
3 5 7 8 9 11 12 19
3 5 7 8 9 11 12 19 (está na posição X=n/2?)Ñ!
![Page 23: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/23.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 23/83
Dividir e Conquistar●Busca Binária: Exemplo:Encontrar o número 12 na lista:
3 5 7 8 9 11 12 19
3 5 7 8 9 11 12 19 (está na posição X=n/2?)Ñ!
3 5 7 8 9 11 12 19 (está na posição X=n/2?)S!
![Page 24: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/24.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 24/83
Dividir e Conquistar●Busca Binária:● Tá, mas e daí????
● Bem, a eficiência deste algoritmo é Θ(lg n).... ● Muito mais eficiente que a abordagem “Força Bruta”.....●....pena que o vetor precisa estar ordenado.......●....mas podemos aplicar a técnica de Divisão e Conquista
para ordenar vetores também!!!!!
![Page 25: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/25.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 25/83
Dividir e Conquistar● Ordenação com Divisão e Conquista:
● Problema: Ordenar um vetor de tamanho N: a1, a
2, ...,
an
● Um vetor de um elemento já está ordenado!● Um vetor de tamanho n pode ser ordenado pela
“intercalação” de dois sub-vetores:1.Um vetor de a
1 até a
n/2
2.Outro vetor de an/2
até an
![Page 26: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/26.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 26/83
Dividir e Conquistar● Ordenação com Divisão e Conquista:
● Problema: Ordenar um vetor de tamanho N: a1, a
2, ...,
an
● Um vetor de um elemento já está ordenado!● Um vetor de tamanho n pode ser ordenado pela
“intercalação” de dois sub-vetores:1.Um vetor de a
1 até a
n/2
2.Outro vetor de an/2
até an
● Esta maneira de ordenar dá origem ao algoritmo recursivo de ordenação “MergeSort”!!!
![Page 27: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/27.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 27/83
Dividir e Conquistar● Ordenação com Divisão e Conquista:
● Problema: Ordenar um vetor de tamanho N: a1, a
2, ...,
an
● Um vetor de um elemento já está ordenado!● Um vetor de tamanho n pode ser ordenado pela
“intercalação” de dois sub-vetores:1.Um vetor de a
1 até a
n/2
2.Outro vetor de an/2
até an
● Esta maneira de ordenar dá origem ao algoritmo recursivo de ordenação “MergeSort”!!!
● Isto é projetar um algoritmo por divisão e conquista!!!
![Page 28: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/28.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 28/83
Dividir e Conquistar● MergeSort:
● Se a função “intercala” for eficiente=O(n)● Detalhe: para conseguir implementar a intercalação de
forma eficiente, é necessário um “vetor auxiliar”, o que
aumenta a memória necessária para o algoritmo...não é
uma ordenação “in-place”,como a Ordenação por
Seleção● T(n) = 2T(n/2) + O(n)● Logo, Mergesort é Θ(n lg n) (Master)
![Page 29: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/29.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 29/83
Dividir e Conquistar● MergeSort(A, e, d): : Pseudo-Código
![Page 30: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/30.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 30/83
Dividir e Conquistar● Intercala(A, e, d): Pseudo-Código
![Page 31: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/31.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João 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.
![Page 32: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/32.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João 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.
![Page 33: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/33.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João 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 hipótese de indução, sabemos ordenar os conjuntos S1 e S2.
![Page 34: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/34.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João 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 hipótese de indução, sabemos ordenar os conjuntos S1 e S2.
● Podemos obter S ordenado concatenando S1 ordenado, x e S2 ordenado.
![Page 35: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/35.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 35/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 hipótese de indução, 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”!!!
![Page 36: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/36.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 36/83
Dividir e Conquistar● Em contraste ao Mergesort, no Quicksort é a operação de divisão 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.
![Page 37: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/37.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 37/83
Dividir e Conquistar● Em contraste ao Mergesort, no Quicksort é a operação de divisão 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 divisão com (n) operações: 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.
![Page 38: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/38.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 38/83
Dividir e Conquistar● Em contraste ao Mergesort, no Quicksort é a operação de divisão 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 divisão com (n) operações: 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.●Após essa etapa basta ordenarmos os dois trechos do vetor recursivamente para obtermos o vetor ordenado, ou seja, a conquista é imediata.
![Page 39: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/39.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 39/83
Dividir e Conquistar● Quicksort(A,e,d) - Pseudo-Código:
![Page 40: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/40.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 40/83
Dividir e Conquistar● Quicksort(A,e,d) - Pseudo-Código(cont):
![Page 41: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/41.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 41/83
Dividir e Conquistar
Quicksort- Idéia Base1. Selecionar um elemento para ser o pivô2. Rearranjar a lista de modo que todos os elementos nas posições 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 posição final.4. Ordenar as duas sub-listas.
![Page 42: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/42.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 42/83
Dividir e Conquistar●QuickSort – Exemplo
5 3 1 9 8 2 4 7partition
2 3 1 4 5 8 9 7 2 3 1 4
partition 1 2 3 4
partition 13 4 partition 4
8 9 7partition 7 8 9
7 9
![Page 43: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/43.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 43/83
Dividir e Conquistar● Quicksort – Análise da Complexidade ● Quantas comparações e quantas trocas o algoritmo
Quicksort executa no pior caso ?
![Page 44: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/44.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 44/83
Dividir e Conquistar● Quicksort – Análise da Complexidade ● Quantas comparações e quantas trocas o algoritmo
Quicksort executa no pior caso ?● Certamente a operação de divisão tem complexidade (n),
mas o tamanho dos dois subproblemas depende do pivô escolhido.
![Page 45: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/45.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 45/83
Dividir e Conquistar● Quicksort – Análise da Complexidade ● Quantas comparações e quantas trocas o algoritmo
Quicksort executa no pior caso ?● Certamente a operação de divisão tem complexidade (n),
mas o tamanho dos dois subproblemas depende do pivô escolhido.
● No pior caso, cada divisão sucessiva do Quicksort separa um único elemento dos demais, recaindo na recorrência:
T(n) =
)
0, se n = 1T(n) = T(n − 1) + n, se n > 1,
![Page 46: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/46.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 46/83
Dividir e Conquistar● Quicksort – Análise da Complexidade ● Quantas comparações e quantas trocas o algoritmo
Quicksort executa no pior caso ?● Certamente a operação de divisão tem complexidade (n),
mas o tamanho dos dois subproblemas depende do pivô escolhido.
● No pior caso, cada divisão sucessiva do Quicksort separa um único elemento dos demais, recaindo na recorrência:
T(n) =
)
0, se n = 1T(n) = T(n − 1) + n, se n > 1,
● Portanto, (n2) comparações e trocas são executadas no pior caso!!!!!!
![Page 47: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/47.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 47/83
Dividir e Conquistar● Mas o Quicksort não era o algoritmo de ordenação mais eficiente????
![Page 48: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/48.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 48/83
Dividir e Conquistar● Mas o Quicksort não era o algoritmo de ordenação mais eficiente????● Então, o algoritmo Quicksort é assintoticamente menos
eficiente que o Mergesort no pior caso.
![Page 49: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/49.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 49/83
Dividir e Conquistar● Mas o Quicksort não era o algoritmo de ordenação mais eficiente????● Então, o algoritmo Quicksort é assintoticamente menos
eficiente que o Mergesort no pior caso.● Entretanto, no caso médio, o Quicksort efetua (n log n)
comparações e trocas.
![Page 50: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/50.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 50/83
Dividir e Conquistar● Mas o Quicksort não era o algoritmo de ordenação mais eficiente????● Então, o algoritmo Quicksort é assintoticamente menos
eficiente que o Mergesort no pior caso.● Entretanto, no caso médio, o Quicksort efetua (n log n)
comparações e trocas.● Assim, na prática, o Quicksort é bastante eficiente, com
uma vantagem adicional em relação ao Mergesort: é “in place”, isto é, não utiliza um vetor auxiliar.
![Page 51: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/51.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 51/83
Dividir e Conquistar● Considerando que o pior caso não ocorre com freqüência, pois usualmente, pegando um “pivô” aleatório, é “muito difícil” 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....
![Page 52: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/52.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 52/83
Dividir e Conquistar● Considerando que o pior caso não ocorre com freqüência, pois usualmente, pegando um “pivô” aleatório, é “muito difícil” 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 divisão do vetor de tamanho n em dois sub-vetores (n/2), e considerando o tempo de separação entre os maiores e os menores que o pivô sendo O(n)....
![Page 53: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/53.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 53/83
Dividir e Conquistar● Considerando que o pior caso não ocorre com freqüência, pois usualmente, pegando um “pivô” aleatório, é “muito difícil” 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 divisão do vetor de tamanho n em dois sub-vetores (n/2), e considerando o tempo de separação entre os maiores e os menores que o pivô sendo O(n)....●O tempo médio T(n)=2T(n/2)+O(n) = O(n lg n)
![Page 54: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/54.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 54/83
Dividir e Conquistar● Ordenação: Mas não há um algoritmo que seja eficiente em todos os casos, e “in place” ao mesmo tempo?
![Page 55: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/55.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 55/83
Dividir e Conquistar● Ordenação: Mas não há um algoritmo que seja eficiente em todos os casos, e “in place” ao mesmo tempo?● Vocês tinham que perguntar?????
![Page 56: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/56.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 56/83
Dividir e Conquistar● Ordenação: Mas não há um algoritmo que seja eficiente em todos os casos, e “in place” ao mesmo tempo?● Vocês tinham que perguntar?????● Este algoritmo chama-se “HeapSort”.
![Page 57: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/57.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 57/83
Dividir e Conquistar● Ordenação: Mas não há um algoritmo que seja eficiente em todos os casos, e “in place” ao mesmo tempo?● Vocês 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 ordenação “in-place” e Θ(n lg n)!!!!● (Mas o Quicksort ainda é mais rápido!!!!)
![Page 58: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/58.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 58/83
Dividir e Conquistar● Ordenação por Heap(HeapSort):● Tarefa: Implementar a estrutura de dados “Heap” para podermos utilizá-la para fazer uma ordenação “in-place” e Θ(n lg n)!!!!
![Page 59: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/59.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 59/83
Dividir e Conquistar● Ordenação por Heap(HeapSort):● Tarefa: Implementar a estrutura de dados “Heap” para podermos utilizá-la para fazer uma ordenação “in-place” e Θ(n lg n)!!!!● Mas o que é um Heap???
![Page 60: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/60.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 60/83
Dividir e Conquistar● Ordenação por Heap(HeapSort):● Tarefa: Implementar a estrutura de dados “Heap” para podermos utilizá-la para fazer uma ordenação “in-place” e Θ(n lg n)!!!!● Mas o que é um Heap???● É uma “simulação” de uma árvore binária completa utilizando um vetor!!!!
![Page 61: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/61.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 61/83
Dividir e Conquistar● Heap:● Vetor que apresenta as seguintes características:● Vetor A de tamanho N (lenght(A) = nº de nodos da árvore)● A[1] = raiz da árvore binária (primeira posição do vetor)● Para calcular a posição de qualquer nodo, utilizamos as funções PARENT, LEFT E RIGHT:PARENT(i)
return i/2 ⌊ ⌋LEFT(i)
return 2i RIGHT(i)
return 2i + 1
![Page 62: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/62.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 62/83
Dividir e Conquistar● Heap: (Cormen)
![Page 63: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/63.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 63/83
Dividir e Conquistar● Heap: ● Característica que distingue um Heap de uma árvore binária :● A[PARENT(i)] ≥ A[i] (Max-Heap)
![Page 64: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/64.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 64/83
Dividir e Conquistar● Como utilizar um Heap para Ordenar????● O Heap permite que o elemento máximo 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 número de trocas de elementos proporcional à altura da árvore.
● O algoritmo Heapsort consiste então da construção de um heap com os elementos a serem ordenados, seguida de sucessivas trocas do primeiro com o último elemento e rearranjos do heap.
![Page 65: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/65.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 65/83
Dividir e Conquistar● HeapSort(A, n) - Pseudo-Código:
![Page 66: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/66.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 66/83
Dividir e Conquistar● AjustaHeap(A, i, n) - Pseudo-Código:
![Page 67: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/67.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 67/83
Dividir e Conquistar●Exemplo do Funcionamento de AjustaHeap(A,2,10):
![Page 68: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/68.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 68/83
Dividir e Conquistar●Exemplo do Funcionamento de AjustaHeap(A,2,10):
![Page 69: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/69.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 69/83
Dividir e Conquistar●Exemplo do Funcionamento de AjustaHeap(A,2,10):
![Page 70: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/70.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 70/83
Dividir e Conquistar● Complexidade do HeapSort:● Quantas comparações e quantas trocas são
executadas no pior caso na etapa de ordenação do algoritmo Heapsort?
● No pior caso, a função AjustaHeap efetua (h) comparações e trocas, onde h é a altura do heap que contém os elementos que resta ordenar.
● Como o heap representa uma árvore binária completa, então h ∈ Θ(log i ), onde i é o número de elementos do heap.
![Page 71: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/71.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 71/83
Dividir e Conquistar● Complexidade do HeapSort:● Logo, a complexidade da etapa de ordenação do
Heapsort é:
● Portanto, no pior caso, a etapa de ordenação efetua O(n log n) comparações e trocas!
● Mas e a construção do Heap????
![Page 72: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/72.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 72/83
Dividir e Conquistar● ConstroiHeap()\
●Se o trecho de 1 a i do vetor tem estrutura de Heap, é fácil 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 construção do Heap.
![Page 73: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/73.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 73/83
Dividir e Conquistar● ConstroiHeap(A, n) – Pseudo-Código (Top-Down):
![Page 74: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/74.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 74/83
Dividir e Conquistar● ConstroiHeap(A, n) – (Top-Down):● Quantas comparações e quantas trocas são
executadas no pior caso na construção do heap pela abordagem top-down ?
● O rearranjo do heap na iteração i efetua (h) comparações 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 número de comparações e trocas efetuadas construção do Heap por esta abordagem é:
![Page 75: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/75.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 75/83
Dividir e Conquistar● Então, o algoritmo Heapsort efetua ao todo Θ (n log n) comparações e trocas no pior caso.
![Page 76: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/76.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 76/83
Dividir e Conquistar● Então, o algoritmo Heapsort efetua ao todo Θ (n log n) comparações e trocas no pior caso.●(Bem....sendo mais preciso, executa 2 n log n comparações e trocas......)
![Page 77: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/77.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 77/83
Dividir e Conquistar● Então, o algoritmo Heapsort efetua ao todo Θ (n log n) comparações e trocas no pior caso.●(Bem....sendo mais preciso, executa 2 n log n comparações e trocas......)●Mas existe maneira mais eficiente de construir um Heap?
![Page 78: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/78.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 78/83
Dividir e Conquistar● Suponha que o trecho de i a n do vetor é tal que, para
todo j , i ≤ j ≤ n, a subárvore 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● binária de n elementos.● Podemos então 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 construção do Heap.
![Page 79: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/79.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 79/83
Dividir e Conquistar● ConstroiHeap(A, n) – Pseudo-Código Alternativo...:
![Page 80: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/80.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 80/83
Dividir e Conquistar● ConstroiHeap(A, 6) – Exemplo: A=[2,9,7,6,5,8]
![Page 81: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/81.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 81/83
Dividir e Conquistar● ConstroiHeap – Complexidade:● Quantas comparações e quantas trocas são executadas
no pior caso na construção do Heap pela abordagem bottom-up ?
● O(n lo g n)!● Mas é possível 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)
![Page 82: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/82.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 82/83
Dividir e Conquistar● Parte Prática:● Implementar os algoritmos “MergeSort”, “QuickSort” e “HeapSort” apresentados, rodar uma “batelada” de testes para medir os tempos de execução e a quantidade de comparações executada por cada algoritmo, comparando os resultados!
![Page 83: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/83.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 83/83
Dividir e Conquistar - Conclusão:● Estes slides são baseados no material
disponibilizado pelos profs. Cid Carvalho de Souza e Cândida Nunes da Silva, da UNICAMP.
● Qualquer incorretude é, entretanto, de inteira responsabilidade do prof. João Alberto Fabro, da UTFPR.
![Page 84: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/84.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 84/83
Dividir e Conquistar - Prós e Contras:
● Prós:●
![Page 85: Estruturas de Dados 2fabro/IF64C/Dividir_e_conquistar+Busca.… · Se não estiver, realizar a busca binária nos vetores: a 1 até a x-1,se chave < a x, ou em a x+1 até a n se](https://reader034.fdocument.pub/reader034/viewer/2022050508/5f98fc46a804144ea521bd2d/html5/thumbnails/85.jpg)
IF64C – Estruturas de Dados 2 – Engenharia da Computação – Prof. João Alberto Fabro - Slide 85/83
Dividir e Conquistar - Prós e Contras:
● Contras:●