Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

Prévia do material em texto

Estrutura de dados: Heap
 
SST
DAURICIO, J. S.; FRANCISCO, L. F. C.
Estrutura de dados: Heap / Juliana Schiavetto Dauricio; 
Luciano Furtado Correa Francisco 
Ano: 2020
nº de p.: 810 páginas
Copyright © 2020. Delinea Tecnologia Educacional. Todos os direitos reservados.
3
Estrutura de dados: Heap
Apresentação
Vamos agora conhecer mais sobre uma das estruturas de dados que podemos 
utilizar em nossas soluções computadorizadas. Essa estrutura é o heap. 
O heap traz a proposta de organizar os dados em uma estrutura semelhante a uma 
árvore. Vamos conhecer mais sobre isso neste material.
Heap
Heap é uma estrutura de dados que considera um arranjo em forma de árvore binária 
completa, conhecida como heap (binário):
Cada nó da árvore corresponde a um elemento do arranjo que armazena o 
valor no nó. A árvore está completamente preenchida em todos os níveis, 
exceto talvez no nível mais baixo, que é preenchido a partir da esquerda 
até certo ponto. Um arranjo A que representa um heap é um objeto com 
dois atributos: comprimento [A], que é o número de elementos no arranjo, 
e tamanho-do-heap [A], o número de elementos no heap armazenado 
dentro do arranjo A. Ou seja, embora A[1... comprimento [A]] possa conter 
números válidos, nenhum elemento além de A [tamanho-do-heap [A], 
onde tamanho-do-heap [A] comprimento [A], é um elemento do heap. 
A raiz da árvore é A [1] e, dado o índice i de um nó, os índices de seu 
pai PARENT(i), do filho da esquerda LEFT(i) e do filho da direita RIGHT(i) 
podem ser calculados de modo simples. (CORMEN et al., 2012, p. 103).
A situação posta pode ser ilustrada conforme a figura a seguir.
4
Heap máximo visto como (a) uma árvore binária e (b) um arranjo
Fonte: Cormen et al. (2012, p. 104).
O número dentro de cada círculo (nó) corresponde ao valor armazenado de cada nó 
dessa árvore. Já o número em cima de cada nó é o índice correspondente no arranjo. 
Nesse arranjo, encontramos algumas linhas que indicam o relacionamento pai-filho. 
Os pais estão sempre à esquerda de seus filhos. A árvore tem altura três; o nó no 
índice 4, cujo valor é 8, tem altura um.
Tais asserções são tão relevantes quanto às de Cormen et al. (2012), quando os 
autores descrevem a aplicação dessas estruturas de dados:
Visualizando um heap como uma árvore, definimos a altura de um nó em 
um heap como o número de arestas no caminho descendente simples 
mais longo desde o nó até uma folha, e definimos a altura do heap como a 
altura de sua raiz. Tendo em vista que um heap de n elementos é baseado 
em uma árvore binária completa, sua altura é O(log n). Veremos que as 
operações básicas sobre heaps são executadas em um tempo máximo 
proporcional à altura da árvore, e assim demoram um tempo O(log n). 
(CORMEN et al., 2012, p. 105). “Uma árvore binária com raiz R é uma ABB 
se: a chave (informação) de cada nó da subárvore esquerda de R é menor 
do que a chave do nó R (em ordem alfabética, por exemplo) a chave de 
cada nó da subárvore direita de R é maior do que a chave do nó R as 
subárvores esquerda e direita também são ABBs”.
Neste link: http://wiki.icmc.usp.br/images/f/fa/%C3%81rvores_AVL.
pdf, você encontra descrições, aprofundamentos e exemplos 
implementados do conceito de árvore AVL.
Saiba mais
16
10
93
1
67
3
( a )
 3 1729 416 
 6 7 89 10 4 51 2 3
(b )
http://wiki.icmc.usp.br/images/f/fa/%C3%81rvores_AVL.pdf
http://wiki.icmc.usp.br/images/f/fa/%C3%81rvores_AVL.pdf
5
MAX-HEAPIFY
Cormen et al. (2012) trazem ainda uma importante contribuição acerca do modo de 
se manter uma estrutura de dados heap, chamada de MAX-HEAPIFY, a qual consiste 
em uma sub-rotina de extrema importância no que tange à manipulação de heaps 
máximos, considerando como entradas um determinado arranjo A e um índice “i” 
para esse arranjo:
O menor elemento em um heap mínimo está na raiz. Para o algoritmo 
de heapsort, usamos heaps máximos. Heaps mínimos são comumente 
empregados em filas de prioridades [...] Seremos precisos ao especificar se 
necessitamos de um heap máximo ou de um heap mínimo para qualquer 
aplicação específica e, quando as propriedades se aplicarem tanto a 
heaps máximos quanto a heaps mínimos, simplesmente usaremos o 
termo “heap”. (CORMEN et al., 2012, p. 104).
Assim que a sub-rotina MAX-HEAPIFY é chamada — supondo-se que as árvores 
binárias em uso contêm raízes LEFT(i) e RIGHT(i) e que são heaps máximos, A[i] 
poderá ser menor do que seus filhos, com isso, viola um dos princípios de heap 
máximo; é então que a função MAX-HEAPIFY é chamada:
Em cada passo, o maior entre os elementos A[i], A[LEFT(i) e A[RIGHT(i) é 
determinado, e seu índice é armazenado em maior. Se A[i] é maior, então a 
subárvore com raiz no nó i é um heap máximo e o procedimento termina. 
Caso contrário, um dos dois filhos tem o maior elemento, e A[i] é trocado 
por A[maior], o que faz o nó i e seus filhos satisfazerem a propriedade 
de heap máximo. Porém, agora o nó indexado por maior tem o valor 
original A[i] e, desse modo, a subárvore com raiz em maior pode violar 
a propriedade de heap máximo. Em consequência disso, MAX-HEAPIFY 
deve ser chamado recursivamente nessa subárvore. O tempo de execução 
de MAX-HEAPIFY em uma subárvore de tamanho n com raiz em um dado 
nó i é o tempo Θ (i) para corrigir os relacionamentos entre os elementos 
A[i], A[LEFT(i)] e A[RIGHT(i), mais o tempo para executar MAX-HEAPIFY 
em uma subárvore com raiz em um dos filhos do nó i. As subárvores de 
cada filho têm tamanho máximo igual a 2n/3 - o pior caso ocorre quando 
a última linha da árvore está exatamente metade cheia - e o tempo de 
execução de MAX-HEAPIFY pode então ser descrito pela recorrência.
T(n) T(2n/3) + Θ1 .
A solução para essa recorrência, de acordo com o caso 2 do teorema 
mestre, é T(n) = O(log n). Como alternativa, podemos caracterizar o tempo 
de execução de MAX-HEAPIFY em um nó de altura h como O(h). (CORMEN 
et al., 2012, p. 106-107).
6
Nesse momento, a sub-rotina MAX-HEAPIFY permitirá que o valor contido em A[i ] 
caia, ou flutue para baixo no heap máximo, possibilitando que a subárvore com que a 
raiz no índice “i” se torne também um heap máximo. 
Construindo um heap
Observe o exemplo e a figura a seguir.
MAX-HEAPIFY(A, i) 
1. l ← LEFT(i) 
2. r RIGHT(i) 
3. se l < tamanho-do-heap[A] e A[I] > A[i] 
4. então maior ← I 
5. senão maior ← i 
6. se r tamanho-do-heap[A] e A [r] > A[maior] 
7. então maior ← r 
8. se maior # i 
9. então trocar A[i] e A[maior] 
10. MAX-HEAPIFY(A, maior)
 
A ação de MAX-HEAPIFY(A, 2), em que tamanho-do-heap [A] = 10
Fonte: Cormen et al. (2012, p. 106).
7
Explicando a imagem anterior:
(a) A configuração inicial, com A[2] no nó i = 2, violando a propriedade de heap 
máximo, pois ele não é maior que ambos os filhos. A propriedade de heap máximo 
é restabelecida para o nó 2 em (b) pela troca de A[2] por A[4], o que destrói a 
propriedade de heap máximo para o nó 4. A chamada recursiva MAX-HEAPIFY(A, 
4) agora define i = 4. Após a troca de A[4] por A[9], como mostramos em (c), o nó 
4 é corrigido, e a chamada recursiva a MAX-HEAPIFY (A, 9) não produz nenhuma 
mudança adicional na estrutura de dados.
Fechamento
O heap é uma das estruturas que podem ser utilizadas para armazenar dados, 
estabelecendo entre eles relações que são representadas em forma de árvore, o 
que facilita a exploração lógica do conjunto armazenado.
8
Referências
CORMEN, T. H. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: Elsevier, 2012.

Mais conteúdos dessa disciplina