Você está na página 1de 30

Análise de Algoritmos

Aula 03

Prof. Roberto Leminski


roberto.leminski@docente.unip.br
Conteúdo
•Implementando um Heap como um vetor
Representado Heaps como Vetores
•Podemos utilizar um array para
implementar o Heap.

•Então, antes precisamos entender como os


elementos dispostos em um array podem
representar um Heap.
Representado Heaps como Vetores

•O array que representa esse Heap é heap =


[48,24,45,14].
Representado Heaps como Vetores

•O array que representa esse Heap é heap =


[88,87,73,47,54,6,0,43].
Representado Heaps como Vetores
•Para caminhar em uma árvore precisamos,
a partir de um nó, acessar o nó à esquerda, o
nó à direita e o nó pai.

•Como estamos utilizando um array para


armazenar os elementos, precisamos
implementar métodos que retornem a
esquerda, a direita e o pai de um nó, baseado
no seu índice.
Representado Heaps como Vetores
•O filho à esquerda de um nó no índice
index sempre segue a fórmula 2∗index+1.
Basta analisarmos o nosso exemplo para
chegar a essa conclusão.
Representado Heaps como Vetores
•O filho à direita de um nó no índice index
sempre segue a fórmula 2∗(index+1). Basta
analisarmos o nosso exemplo para chegar a
essa conclusão.
Representado Heaps como Vetores
•O pai de um nó no índice index sempre
segue a fórmula int((index−1)/2)). Basta
analisarmos o nosso exemplo para chegar a
essa conclusão.
Representado Heaps como Vetores
•Inserção

•A adição de um novo elemento


sempre é feita na próxima posição livre
do vetor, isto é. Essa estratégia garante
que o Heap sempre será completo ou
quase completo da esquerda para a
direita.
Inserção

•A adição de um novo elemento


sempre é feita na próxima posição livre
do vetor, isto é. Essa estratégia garante
que o Heap sempre será completo ou
quase completo da esquerda para a
direita.

•Porém, isto gera um problema: o


elemento pode estar fora de posição.
Inserção
•Assim, o elemento deve ser
comparado com seu elemento pai na
árvore e, caso seja maior.

•Este procedimento é executado até o


novo elemento estar na posição correta.
Inserção
Inserção
Inserção
Inserção
Inserção
Remoção
•A remoção em um Heap não é
parametrizada.

•A remoção em um heap é sempre


feita na raiz.

•Para manter a propriedade de ser


completo ou quase-completo da
esquerda para a direita, trocamos o valor
da raiz com a última folha e removemos
essa última folha.
Remoção
Remoção
Remoção
Heapify
•A remoção como foi mostrada
mantém a estrutura da árvore, mas
quebra a rgra de cada elemento ser
sempre menor que seu pai.

•A árvore precisa ser rearranjada.


Heapify
•Este processo se chama heapify.

•Compara-se a raiz com seus dois


filhos, o maior dos três assume a raiz.

•Repete-se este processo com o


elemento que foi trocado de posição, até
que todos estejam posicionados.
Heapify
Heapify
Heapify
Heapify
•No pior caso o heapify é executado
até o nível das folhas. Nesse pior caso, o
caminho percorrido é igual ao tamanho
da altura, que sempre é O(log n) porque
o Heap é completo ou quase-completo
da esquerda para a direita.

•Para transformar um vetor em um


heap, aplicamos sucessivamente, à
partir do pai da última folha, o heapify
Referências
• DASGUPTA, Sanjoy. Christos Papadimitriou,
Umesh Vazirani. Algoritmos. Porto Alegre, RS:
AMGH, 2011.
Dúvidas ?
Obrigado !

Você também pode gostar