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 !