O documento descreve heaps, que são estruturas de dados definidas como árvores binárias quase completas onde cada nó satisfaz certas propriedades em relação aos seus filhos. São definidos heaps máximos, onde cada nó tem valor maior ou igual aos filhos, e heaps mínimos, onde cada nó tem valor menor ou igual aos filhos. Visualizações de heaps máximos e mínimos são apresentadas para ilustrar como a estrutura atende às definições.
O documento descreve o conceito de endereçamento aberto em tabelas de hash. Ele explica que o endereçamento aberto usa posições vazias em uma tabela de tamanho fixo para resolver colisões, examinando sistematicamente a tabela até encontrar um espaço vazio ou determinar que a chave não está presente. A inclusão de um elemento requer sondar a tabela até encontrar um espaço vazio, usando uma função de hash que leva em conta o número da sondagem para gerar a próxima posição a ser examinada.
O documento discute a construção de heaps. Explica que as folhas de um heap estão nos índices de n/2 a n-1 e que podemos construir o heap de baixo para cima, considerando cada elemento nessa região como um heap de 1 elemento e depois aplicando refazHeapMax para construir o resto do heap de forma incremental.
O documento descreve a técnica de endereçamento direto para implementar dicionários dinâmicos. Ele explica como mapear chaves diretamente para posições de um array, permitindo buscas, inserções e remoções em tempo constante. No entanto, essa abordagem funciona bem apenas para conjuntos pequenos de chaves, pois pode ocorrer colisões para conjuntos maiores.
O documento descreve o modelo incremental para projetar algoritmos de ordenação por indução fraca. Ele apresenta o padrão geral seguido por algoritmos incrementais, que ordenam incrementalmente subconjuntos de tamanho crescente dos dados de entrada. Como exemplo, é descrito o algoritmo de inserção, que ordena um conjunto de tamanho n inserindo recursivamente o elemento restante em um conjunto já ordenado de tamanho n-1.
O documento descreve o algoritmo de ordenação QuickSort, que utiliza a técnica de divisão e conquista. QuickSort divide o arranjo de entrada em dois sub-arranjos, ordena os sub-arranjos recursivamente e combina os resultados para ordenar o arranjo completo. O particionamento do arranjo é a etapa chave que divide o problema em subproblemas menores.
O documento descreve a estrutura de dados Skip List, incluindo seus conceitos, operações como pesquisa, inserção e remoção, e espaço necessário. Skip List pode ser usada como alternativa às árvores balanceadas com complexidade de tempo comparável para a maioria das operações.
O documento apresenta um resumo sobre casamento de padrões. Ele introduz o problema de casamento de padrões, definindo texto, padrão e alfabeto. Também descreve as principais categorias de algoritmos para casamento exato de padrões: (1) Algoritmo Naive, que não pré-processa o padrão e tem complexidade O(mn); (2) Algoritmos baseados em autômatos finitos, que pré-processam o padrão e tem complexidade O(n).
O documento descreve o conceito de endereçamento aberto em tabelas de hash. Ele explica que o endereçamento aberto usa posições vazias em uma tabela de tamanho fixo para resolver colisões, examinando sistematicamente a tabela até encontrar um espaço vazio ou determinar que a chave não está presente. A inclusão de um elemento requer sondar a tabela até encontrar um espaço vazio, usando uma função de hash que leva em conta o número da sondagem para gerar a próxima posição a ser examinada.
O documento discute a construção de heaps. Explica que as folhas de um heap estão nos índices de n/2 a n-1 e que podemos construir o heap de baixo para cima, considerando cada elemento nessa região como um heap de 1 elemento e depois aplicando refazHeapMax para construir o resto do heap de forma incremental.
O documento descreve a técnica de endereçamento direto para implementar dicionários dinâmicos. Ele explica como mapear chaves diretamente para posições de um array, permitindo buscas, inserções e remoções em tempo constante. No entanto, essa abordagem funciona bem apenas para conjuntos pequenos de chaves, pois pode ocorrer colisões para conjuntos maiores.
O documento descreve o modelo incremental para projetar algoritmos de ordenação por indução fraca. Ele apresenta o padrão geral seguido por algoritmos incrementais, que ordenam incrementalmente subconjuntos de tamanho crescente dos dados de entrada. Como exemplo, é descrito o algoritmo de inserção, que ordena um conjunto de tamanho n inserindo recursivamente o elemento restante em um conjunto já ordenado de tamanho n-1.
O documento descreve o algoritmo de ordenação QuickSort, que utiliza a técnica de divisão e conquista. QuickSort divide o arranjo de entrada em dois sub-arranjos, ordena os sub-arranjos recursivamente e combina os resultados para ordenar o arranjo completo. O particionamento do arranjo é a etapa chave que divide o problema em subproblemas menores.
O documento descreve a estrutura de dados Skip List, incluindo seus conceitos, operações como pesquisa, inserção e remoção, e espaço necessário. Skip List pode ser usada como alternativa às árvores balanceadas com complexidade de tempo comparável para a maioria das operações.
O documento apresenta um resumo sobre casamento de padrões. Ele introduz o problema de casamento de padrões, definindo texto, padrão e alfabeto. Também descreve as principais categorias de algoritmos para casamento exato de padrões: (1) Algoritmo Naive, que não pré-processa o padrão e tem complexidade O(mn); (2) Algoritmos baseados em autômatos finitos, que pré-processam o padrão e tem complexidade O(n).
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
O documento descreve as bases de dados em lógica de primeira ordem, como interagir com elas fazendo buscas (queries) por meio de sentenças lógicas em LPO, e como qualquer query que possa ser inferida logicamente pela base de dados será respondida afirmativamente. As bases de dados contêm axiomas com informações básicas e teoremas derivados dos axiomas, e o documento discute técnicas como forward chaining, backward chaining e resolução para realizar inferência nas bases de dados.
O documento descreve uma aula sobre lógica de primeira ordem. Apresenta os elementos básicos da lógica de primeira ordem, incluindo termos, predicados e a gramática formal para construir sentenças. Também explica como modelos e interpretações funcionam na lógica de primeira ordem, diferentemente da lógica proposicional.
O documento discute inferência em lógica proposicional, incluindo tipos de provas como verificação de modelos e aplicação de regras de inferência. Ele explica como aplicar regras de inferência como modus ponens e modus tollens para derivar novas sentenças a partir de premissas, formando uma prova.
O documento descreve um algoritmo de busca retroativa para resolver problemas de satisfação de restrições, utilizando forward checking e heurísticas como valores restantes mínimos, grau e valor menos restritivo. O algoritmo é demonstrado passo a passo em um exemplo de coloração de grafos, definindo variáveis, valores e propagando escolhas.
O documento descreve problemas de satisfação de restrições (CSPs), definidos por um conjunto de variáveis, domínios de valores para cada variável, e restrições sobre combinações de valores de variáveis. Apresenta exemplos de agendamento de aulas e coloração de mapas como CSPs, definindo suas variáveis, domínios e restrições.
O documento discute algoritmos genéticos e representação de cromossomos. Ele explica que os cromossomos podem ser representados de várias formas, incluindo binária, valores inteiros e reais. A representação binária é a mais simples, onde o cromossomo consiste de uma sequência de bits. A mutação e o cruzamento ocorrem durante o algoritmo genético para gerar novas soluções.
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
O documento descreve as bases de dados em lógica de primeira ordem, como interagir com elas fazendo buscas (queries) por meio de sentenças lógicas em LPO, e como qualquer query que possa ser inferida logicamente pela base de dados será respondida afirmativamente. As bases de dados contêm axiomas com informações básicas e teoremas derivados dos axiomas, e o documento discute técnicas como forward chaining, backward chaining e resolução para realizar inferência nas bases de dados.
O documento descreve uma aula sobre lógica de primeira ordem. Apresenta os elementos básicos da lógica de primeira ordem, incluindo termos, predicados e a gramática formal para construir sentenças. Também explica como modelos e interpretações funcionam na lógica de primeira ordem, diferentemente da lógica proposicional.
O documento discute inferência em lógica proposicional, incluindo tipos de provas como verificação de modelos e aplicação de regras de inferência. Ele explica como aplicar regras de inferência como modus ponens e modus tollens para derivar novas sentenças a partir de premissas, formando uma prova.
O documento descreve um algoritmo de busca retroativa para resolver problemas de satisfação de restrições, utilizando forward checking e heurísticas como valores restantes mínimos, grau e valor menos restritivo. O algoritmo é demonstrado passo a passo em um exemplo de coloração de grafos, definindo variáveis, valores e propagando escolhas.
O documento descreve problemas de satisfação de restrições (CSPs), definidos por um conjunto de variáveis, domínios de valores para cada variável, e restrições sobre combinações de valores de variáveis. Apresenta exemplos de agendamento de aulas e coloração de mapas como CSPs, definindo suas variáveis, domínios e restrições.
O documento discute algoritmos genéticos e representação de cromossomos. Ele explica que os cromossomos podem ser representados de várias formas, incluindo binária, valores inteiros e reais. A representação binária é a mais simples, onde o cromossomo consiste de uma sequência de bits. A mutação e o cruzamento ocorrem durante o algoritmo genético para gerar novas soluções.
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24, Pr Henrique, EBD NA TV, Lições Bíblicas, 2º Trimestre de 2024, adultos, Tema, A CARREIRA QUE NOS ESTÁ PROPOSTA, O CAMINHO DA SALVAÇÃO, SANTIDADE E PERSEVERANÇA PARA CHEGAR AO CÉU, Coment Osiel Gomes, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, de Almeida Silva, tel-What, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique, https://ebdnatv.blogspot.com/
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, Central Gospel, Os Mortos Em Cristo, 1Tr24, Pr Henrique, EBD NA TV, Revista ano 11, nº 1, Revista Estudo Bíblico Jovens E Adultos, Central Gospel, 2º Trimestre de 2024, Professor, Tema, Os Grandes Temas Do Fim, Comentarista, Pr. Joá Caitano, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
(ACH2002) Introdução à Análise de Algoritmos - Aula 16
1. Aula 16 – Heaps
Norton Trevisan Roman
norton@usp.br
16 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 1 / 27
2. Heaps
Defini¸c˜ao
Estrutura de dados definida como uma sequˆencia S
de itens com valores S[1], S[2], . . . , S[n] tais que
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
3. Heaps
Defini¸c˜ao
Estrutura de dados definida como uma sequˆencia S
de itens com valores S[1], S[2], . . . , S[n] tais que
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
4. Heaps
Defini¸c˜ao
Se, contudo, quisermos um heap m´ınimo, basta
mudarmos a defini¸c˜ao para
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 3 / 27
5. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
6. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
7. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
8. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
raiz
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
9. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
folhas
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
10. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Profundidade de
um n´o: distˆancia
do n´o `a raiz, em
n´umero de arestas
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
11. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Altura de um n´o:
distˆancia descendente
(em arestas) do
maior caminho entre
esse n´o e uma folha
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
12. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
A altura da ´arvore ser´a
a altura de sua raiz
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
14. Heaps
Visualiza¸c˜ao
Relaxemos agora para uma ´arvore bin´aria quase
completa
Ou seja, uma ´arvore bin´aria completa, com poss´ıvel exce¸c˜ao
do n´ıvel mais baixo, que ´e preenchido da esquerda at´e um
certo ponto
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 27
15. Heaps
Visualiza¸c˜ao
Relaxemos agora para uma ´arvore bin´aria quase
completa
Ou seja, uma ´arvore bin´aria completa, com poss´ıvel exce¸c˜ao
do n´ıvel mais baixo, que ´e preenchido da esquerda at´e um
certo ponto
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 27
16. Heaps
Visualiza¸c˜ao
Note que, se seguirmos
essa ordem de cria¸c˜ao da
´arvore (1 a n) e o ´ultimo
n´ıvel da ´arvore n˜ao estiver
cheio, ent˜ao as folhas
aparecer˜ao em 2 n´ıveis
adjacentes
1
2 3
4 5
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 6 / 27
17. Heaps
Visualiza¸c˜ao
Note que, se seguirmos
essa ordem de cria¸c˜ao da
´arvore (1 a n) e o ´ultimo
n´ıvel da ´arvore n˜ao estiver
cheio, ent˜ao as folhas
aparecer˜ao em 2 n´ıveis
adjacentes
1
2 3
4 5
Com as mais baixas `a esquerda
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 6 / 27
19. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
20. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
Os n´os 2k e 2k + 1 s˜ao os
filhos `a esquerda e `a
direita do n´o k,
1 ≤ k ≤ n/2
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
21. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
Os n´os 2k e 2k + 1 s˜ao os
filhos `a esquerda e `a
direita do n´o k,
1 ≤ k ≤ n/2
1
2 3
4 5 6
E que rela¸c˜ao isso tem com os valores permitidos
em um heap?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
23. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
24. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Montando a ´arvore dessa maneira, em que o valor de cada
n´o ´e maior ou igual ao valor dos filhos, ela satisfar´a a
condi¸c˜ao do heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
25. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
S1
R2 O3
E4 N5 A6 D7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Montando a ´arvore dessa maneira, em que o valor de cada
n´o ´e maior ou igual ao valor dos filhos, ela satisfar´a a
condi¸c˜ao do heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
26. Heaps
Visualiza¸c˜ao: Heap M´ınimo
Para o heap m´ınimo, basta fazermos com que o
valor de cada n´o seja menor ou igual ao de seus
filhos
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 9 / 27
27. Heaps
Visualiza¸c˜ao: Heap M´ınimo
Para o heap m´ınimo, basta fazermos com que o
valor de cada n´o seja menor ou igual ao de seus
filhos
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
i = 1, 2, . . . , n/2
A1
D2 E3
N4 O5 R6 S7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 9 / 27
28. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
29. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Heap M´aximo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≥ S[i]
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
30. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Heap M´aximo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≥ S[i]
Heap M´ınimo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≤ S[i]
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
32. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
33. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
34. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i e 2i + 1,
caso existam
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
35. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i e 2i + 1,
caso existam
O pai de um n´o i estar´a
na posi¸c˜ao i/2
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
36. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
37. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
38. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i + 1 e
2i + 2, caso existam
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
39. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i + 1 e
2i + 2, caso existam
O pai de um n´o i estar´a
na posi¸c˜ao (i − 1)/2
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
40. Heaps
Representa¸c˜ao
Um heap ´e ent˜ao uma
´arvore bin´aria quase
completa na qual cada
n´o satisfaz a condi¸c˜ao
do heap
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 13 / 27
41. Heaps
Representa¸c˜ao
Um heap ´e ent˜ao uma
´arvore bin´aria quase
completa na qual cada
n´o satisfaz a condi¸c˜ao
do heap
S1
R2 O3
E4 N5 A6 D7
No caso do heap
m´aximo, a maior chave
estar´a sempre na
primeira posi¸c˜ao
S R O E N A D
1 2 3 4 5 6 7
(heap m´aximo)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 13 / 27
42. Heaps
Representa¸c˜ao
J´a no heap m´ınimo, a
menor chave ´e que
estar´a sempre na
primeira posi¸c˜ao
A1
D2 E3
N4 O5 R6 S7
A D E N O R S
1 2 3 4 5 6 7
(heap m´ınimo)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 14 / 27
43. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
44. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
45. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
46. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
47. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
48. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
49. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
50. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
51. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo 16
1
15
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
52. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
53. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
Pode deixar valor do pai
menor que o dos filhos
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
54. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
Pode deixar valor do pai
menor que o dos filhos
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Como restaurar essa propriedade?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
55. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
56. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
57. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
58. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
Ou no pr´oprio n´o
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
59. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
Ou no pr´oprio n´o –
falhou aqui
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
60. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
61. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
62. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
63. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
64. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
65. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Empurramos assim o elemento problem´atico para baixo no
heap, at´e seu devido lugar
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
66. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
67. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Arranjo representando o heap
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
68. Heaps
Mantendo a Propriedade do Heap (M´aximo)
´Indice do elemento poten-
cialmente problem´atico
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
69. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Tamanho do heap (arranjo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
70. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Retorna o ´ındice no arranjo
da sub´arvore `a esquerda de i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
71. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Retorna o ´ındice no arranjo
da sub´arvore `a direita de i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
72. Heaps
Mantendo a Propriedade do Heap (M´aximo)
refazHeapMax assume
que essas sub´arvores
correspondem a heaps
m´aximos, e que A[i] pode
ser menor que seus filhos
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
73. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se o filho `a es-
querda existe, e se ´e
maior que seu pai i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
74. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se o filho `a direita
existe, e se ´e maior
que seu pai ou irm˜ao
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
75. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Troca i de lugar com o
filho maior que ele, se houver
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
76. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se essa troca n˜ao
gerou nova viola¸c˜ao do
heap nessa sub´arvore
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
77. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
78. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
79. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
80. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
81. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
82. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
83. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
84. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
85. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
86. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
87. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
88. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
89. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
90. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
91. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
92. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
93. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
94. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
95. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
96. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
97. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
98. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
99. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
100. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
101. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
102. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
103. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
104. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
105. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
int esquerda(int i) {
return(2*i+1);
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
106. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
int esquerda(int i) {
return(2*i+1);
}
int direita(int i) {
return(2*i+2);
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
107. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E por que passar o
tamanho por parˆametro
em vez de usar
A.length?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 22 / 27
108. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E por que passar o
tamanho por parˆametro
em vez de usar
A.length?
Na pr´oxima aula
veremos...
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 22 / 27
109. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
110. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Θ(1)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
111. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Θ(1)
T(???)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
112. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
113. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
O pior caso sendo quando
a ´ultima camada est´a
metade cheia
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
114. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
O pior caso sendo quando
a ´ultima camada est´a
metade cheia
Caso em que uma
sub´arvore ter´a 1/3 e a
outra 2/3 dos n´os
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
115. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
116. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
E a rela¸c˜ao de recorrˆencia
fica
T(n) = T(2n/3) + Θ(1)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
117. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
E a rela¸c˜ao de recorrˆencia
fica
T(n) = T(2n/3) + Θ(1)
Que, pelo Teorema
Mestre (caso 2), tem
solu¸c˜ao T(n) = O(log n)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
118. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
119. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
120. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
E como fazemos para construir um heap?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
121. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
E como fazemos para construir um heap?
Na pr´oxima aula...
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
122. Referˆencias
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Slides dos professores Delano Beder e Marcos Chain
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 27 / 27