Escolar Documentos
Profissional Documentos
Cultura Documentos
Eduardo Camponogara
6 de abril de 2009
Heaps e Árvores Binárias 2 / 59
Sumário
Introdução
Heapsort
Árvores Binárias
Heaps e Árvores Binárias 3 / 59
Introdução
Sumário
Introdução
Heapsort
Árvores Binárias
Heaps e Árvores Binárias 4 / 59
Introdução
Introdução
Heap
Heap Sort é algoritmo de ordenação
◮ Como o Merge Sort, Heap Sort ordena n números em tempo
Θ(n lg n)
◮ Ordena no local, necessitando apenas um número constante
de variáveis de armazenamento.
A estrutura de dados heap, além de permitir a implementação
do algoritmo Heap Sort, também pode ser utilizada como uma fila
de prioridades eficiente.
Heaps e Árvores Binárias 5 / 59
Heapsort
Sumário
Introdução
Heapsort
Árvores Binárias
Heaps e Árvores Binárias 6 / 59
Heapsort
Heaps
Heaps
Um heap (binário) é uma estrutura de dados que pode ser vista
como uma árvore binária completa.
1
16
2 3
14 10
4 5 6 7 1 2 3 4 5 6 7 8 9 10
8 7 9 3 16 14 10 8 7 9 3 2 4 1
8 9 10
2 4 1
Heaps e Árvores Binárias 7 / 59
Heapsort
Heaps
Heaps
Heaps
◮ Cada nó da árvore corresponde a um elemento do vetor que
amazena o valor do nó.
◮ A árvore é completa em todos os nı́veis com excessão do nı́vel
mais baixo, o qual é completado da esquerda para a direita.
Heaps e Árvores Binárias 8 / 59
Heapsort
Heaps
Heaps
Representação de Um Heap
Um vetor A que armazena um heap é um objeto com dois
atributos:
◮ length[A]: número de elementos do vetor
◮ heap size[A]: número de elementos do heap armazenados em
A.
Heaps e Árvores Binárias 9 / 59
Heapsort
Heaps
Heaps
Representação de Um Heap
Parent(i)
return ⌊i/2⌋
Left Child(i)
return 2i
Right Child(i)
return 2i + 1
Heaps e Árvores Binárias 10 / 59
Heapsort
A Propriedade Heap
A Propriedade Heap
Propriedade Heap
Para que um vetor A seja heap, cada nó i, com excessão da raiz,
deve satisfazer a seguinte propriedade:
A[i] ≤ A[Parent(i)]
A Propriedade Heap
Altura da Árvore
◮ altura de um nó da árvore é o número de arestas no caminho
mais longo do nó até uma folha da árvore.
◮ altura da árvore é a altura do nó raiz.
◮ Uma vez que um heap induz uma árvore binária completa, sua
altura é Θ(lg n).
Heaps e Árvores Binárias 12 / 59
Heapsort
A Propriedade Heap
A Propriedade Heap
A Propriedade Heap
Heapify
Heapify(A, i)
l ← Left Child(i)
r ← Right Child(i)
if l ≤ heap size[A] & A[l] > A[i]
largest ← l
else
largest ← i
if r ≤ heap size[A] & A[r ] > A[largest]
largest ← r
if largest 6= i
exchange A[i] ↔ A[largest]
Heapify(A, largest)
Heaps e Árvores Binárias 14 / 59
Heapsort
A Propriedade Heap
A propriedade heap
Exemplo
1 1
16 16
2 3 2 3
4 10 14 10
⇒
4 5 6 7 4 5 6 7
14 7 9 3 4 7 9 3
8 9 10 8 9 10
2 8 1 2 8 1
Heaps e Árvores Binárias 15 / 59
Heapsort
A Propriedade Heap
A propriedade heap
Exemplo
1
16
2 3
14 10
4 5 6 7
8 7 9 3
8 9 10
2 4 1
Construindo Um Heap
Build Heap(A)
heap size[A] ← length[A]
for j ← ⌊heap size[A]/2⌋ downto 1
Heapify (A, j)
Heaps e Árvores Binárias 17 / 59
Heapsort
Construindo Um Heap
Construindo Um Heap
Exemplo
A 4 1 3 2 16 9 10 14 8 7
1
1 4
4
2 3
2 3 1 3
1 3 ⇒
4 5 6 7
4 5 6 7 2 16 9 10
2 16 9 10
8 9 10
8 9 10 14 8 7
14 8 7
Heaps e Árvores Binárias 18 / 59
Heapsort
Construindo Um Heap
Construindo Um Heap
Exemplo
1 1
4 4
2 3 2 3
1 3 1 3
⇒
4 5 6 7 4 5 6 7
2 16 9 10 14 16 9 10
8 9 10 8 9 10
14 8 7 2 8 7
Heaps e Árvores Binárias 19 / 59
Heapsort
Construindo Um Heap
Construindo Um Heap
Exemplo
1 1
4 4
2 3 2 3
1 3 1 10
⇒
4 5 6 7 4 5 6 7
14 16 9 10 14 16 9 3
8 9 10 8 9 10
2 8 7 2 8 7
Heaps e Árvores Binárias 20 / 59
Heapsort
Construindo Um Heap
Construindo Um Heap
Exemplo
1 1
4 4
2 3 2 3
1 10 16 10
⇒
4 5 6 7 4 5 6 7
14 16 9 3 14 7 9 3
8 9 10 8 9 10
2 8 7 2 8 1
Heaps e Árvores Binárias 21 / 59
Heapsort
Construindo Um Heap
Construindo Um Heap
Exemplo
1 1
4 16
2 3 2 3
16 10 14 10
⇒
4 5 6 7 4 5 6 7
14 7 9 3 8 7 9 3
8 9 10 8 9 10
2 8 1 2 4 1
Heaps e Árvores Binárias 22 / 59
Heapsort
Algoritmo de Ordenação
Algoritmo de Ordenação
O algoritmo Heapsort
Heapsort(A)
Build Heap(A)
for i ← length[A] downto 2
exchange A[1] ↔ A[i]
heap size[A] ← heap size[A] − 1
Heapify(A, 1)
Heapsort
Exemplo
16 14
14 10 8 10
⇒
8 7 9 3 4 7 9 3
2 4 1 2 1 16
Heaps e Árvores Binárias 24 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
14 10
8 10 8 9
⇒
4 7 9 3 4 7 1 3
2 1 16 2 14 16
Heaps e Árvores Binárias 25 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
10 9
8 9 8 3
⇒
4 7 1 3 4 7 1 2
2 14 16 10 14 16
Heaps e Árvores Binárias 26 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
9 8
8 3 7 3
⇒
4 7 1 2 4 2 1 9
10 14 16 10 14 16
Heaps e Árvores Binárias 27 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
8 7
7 3 4 3
⇒
4 2 1 9 1 2 8 9
10 14 16 10 14 16
Heaps e Árvores Binárias 28 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
7 4
4 3 2 3
⇒
1 2 8 9 1 7 8 9
10 14 16 10 14 16
Heaps e Árvores Binárias 29 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
4 3
2 3 2 1
⇒
1 7 8 9 4 7 8 9
10 14 16 10 14 16
Heaps e Árvores Binárias 30 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
3 2
2 1 1 3
⇒
4 7 8 9 4 7 8 9
10 14 16 10 14 16
Heaps e Árvores Binárias 31 / 59
Heapsort
Algoritmo de Ordenação
Heapsort
Exemplo
2 1
1 3 2 3
⇒
4 7 8 9 4 7 8 9
10 14 16 10 14 16
Heaps e Árvores Binárias 32 / 59
Heapsort
Fila de prioridades
Fila de prioridades
◮ Uma fila de prioridades é uma estrutura de dados para
manter um conjunto dinâmico S de elementos, cada um com
um valor associado, chamado de chave.
◮ As operações são:
◮ Insert(S, x): insere um elemento em S
◮ Maximum(S): retorna o elemento de maior chave de S
◮ Extract Max(S): extrai o elemento de maior chave de S
◮ Uma aplicação é o escalonamento de tarefas em um
computador de memória compartilhada.
Heaps e Árvores Binárias 33 / 59
Heapsort
Fila de prioridades
Extrair o máximo
Exemplo
16 16
14 10 14 10
⇒
8 7 9 3 8 7 9 3
2 4 1 2 4 1 15
Heaps e Árvores Binárias 37 / 59
Heapsort
Fila de prioridades
Exemplo
16 16
14 10 14 10
⇒
8 7 9 3 8 15 9 3
2 4 1 15 2 4 1 7
Heaps e Árvores Binárias 38 / 59
Heapsort
Fila de prioridades
Exemplo
16 16
14 10 15 10
⇒
8 15 9 3 8 14 9 3
2 4 1 7 2 4 1 7
Heaps e Árvores Binárias 39 / 59
Árvores Binárias
Sumário
Introdução
Heapsort
Árvores Binárias
Heaps e Árvores Binárias 40 / 59
Árvores Binárias
Introdução
◮ Árvores binárias de pesquisa são estruturas de dados que
suportam muitas das operações executadas sobre conjuntos
dinâmicos
◮ Operações: Search, Minimum, Predecessor , Insert e Delete
◮ As Operações levam tempo proporcional à altura da árvore.
◮ Para uma árvore binária completa de n nós, tais operações
levam Θ(lg n).
◮ Todavia, se a árvore é uma lista de nós, as operações podem
levar Θ(n) no pior caso.
Heaps e Árvores Binárias 41 / 59
Árvores Binárias
Introdução
◮ A altura de árvores binárias construı́das randomicamente
é O(lg n), o que garante que as operações levem Θ(lg n).
◮ Na prática, não podemos garantir que as árvores são
construı́das randomicamente.
◮ Entretanto, existem implementações de árvores binárias
balanceadas, que garantem uma altura O(lg n) para a árvore,
tais como Red-Black Trees, AVL Trees e B-Trees.
Heaps e Árvores Binárias 42 / 59
Árvores Binárias
≤ ≥
Heaps e Árvores Binárias 43 / 59
Árvores Binárias
Exemplos
2
5
3
3 7 7
5 8
2 5 8
5
Heaps e Árvores Binárias 44 / 59
Árvores Binárias
Inorder walk
Inorder Walk(T , x)
if x 6= NIL
Inorder Walk( T , left[x] )
print(key [x])
Indorder Walk( T , right[x] )
Search
Dados um ponteiro para a raiz T e uma chave k, o procedimento
Search(T ,k) retorna um ponteiro para um objeto com a chave k se
um existe, ou NIL caso contrário.
Search(T , k)
if x = NIL or key [x] = k
return x
if k < key [x]
Search(left[x], k)
else
Search(right[x], k)
Heaps e Árvores Binárias 47 / 59
Árvores Binárias
Buscas
15
6 18
3 7 17 20
2 4 13
Mı́nimo e Máximo
Mı́nimo Máximo
Minimum(x) Maximum(x)
while left[x] 6= NIL while right[x] 6= NIL
x ← left[x] x ← right[x]
return x return x
Heaps e Árvores Binárias 49 / 59
Árvores Binárias
Sucessor e Predecessor
Sucessor e Predecessor
Sucessor
Successor(x)
if right[x] 6= NIL
return Minimum(right[x])
y ← p[x]
while y 6= NIL & x = right[y ]
x ←y
y ← p[y ]
return y
Heaps e Árvores Binárias 51 / 59
Árvores Binárias
Sucessor e Predecessor
Sucessor
acements
Exemplo
15
6 18
3 7 17 20
2 4 13
◮ O sucessor de 13 é 15
Heaps e Árvores Binárias 52 / 59
Árvores Binárias
Inserção de Objetos
Inserção de Objetos
Insert
Insert (Continuation)
Insert(T , z)
y ← NIL p[z] ← y
x ← root[T ] if y = NIL
while x 6= NIL root[T ] ← z
y ←x else
if key [z] < key [x] if key [z] < key [y ]
x ← left[x] left[y ] ← z
else else
x ← right[x] right[y ] ← z
endif endif
endwile endif
Heaps e Árvores Binárias 53 / 59
Árvores Binárias
Inserção de Objetos
Inserção de Objetos
Exemplo
◮ Inserção de 13
12
5 18
2 9 15 19
13 17
Heaps e Árvores Binárias 54 / 59
Árvores Binárias
Deleção
Deleção
Deleção
Caso a: z não possui filhos
15 15
5 16 5 16
3 12 20 3 12 20
⇒
10 13 z 18 23 10 18 23
6 6
7 7
Heaps e Árvores Binárias 56 / 59
Árvores Binárias
Deleção
Deleção
Caso b: z possui um filho
15
15
5 20
5 16 z
3 12 20 3 12 18 23
⇒
10 13 18 23 10 13
6
6
7
7
Heaps e Árvores Binárias 57 / 59
Árvores Binárias
Deleção
Deleção
15
6 y 15
5 z 16
5 z 16
3 12 20
⇒ 3 12 20
10 13 18 23
10 13 18 23
y 6
7
7
Heaps e Árvores Binárias 58 / 59
Árvores Binárias
Deleção
Deleção
6 y 15 15
5 z 16 6 16
3 12 20 ⇒ 3 12 20
10 13 18 23 10 13 18 23
7 7
Heaps e Árvores Binárias 59 / 59
Árvores Binárias
Deleção
◮ Fim!
◮ Obrigado pela presença