Olá pessoal, sou o Filipe Névola, este blog foi muito ativo durante 2009 enquanto eu fazia universidade,
hoje em dia estou ativo no Twitter @FilipeNevola e voltando a escrever posts agora no meu perfil do Medium (29/05/2016).

[ 22/07/2009 ] 0

Heap

Um heap é uma estrutura de dados organizada como árvore binária, seguindo algumas regras.

Características

Existem dois tipos de heaps: Os heaps de máximo (max heap), em que o valor de todos os nós são menores que os de seus respectivos pais; e os heaps de mínimo (min heap), em que o valor todos os nós são maiores que os de seus respectivos pais. Assim, em um heap de máximo, o maior valor do conjunto está na raíz da árvore, enquanto no heap de mínimo a raíz armazena o menor valor existente.

A árvore binária do heap deve estar completa até pelo menos seu penúltimo nível e, se o seu último nível não estiver completo, todos os nós do último nível deverão estar agrupados à esquerda.

Estrutura em C/C++:
//Autor: Filipe Areias Névola
//Ano: 2007
//Licensa: Você pode usar e alterar, mas deve manter o Autor
//Representando um Heap como vetor
//Filho esquerdo: 2*i+1
//Filho direito: 2*i+2
//Pai: piso(i/2)
struct tHeap{
    int *v,n,tam;
};

Operações em C/C++:
Inserção

bool insercao(tHeap &h,int x){
    if(h.tam==h.n)
        return true;
    h.n++;
    h.v[h.n]=x;
    subida(h,h.n);
    return true;
}

void subida(tHeap &h, int i){
    if(i>1)
        if(h.v[i]>h.v[i/2]){
            troca(h.v[i],h.v[i/2]);
            subida(h,floor(i/2));
        }
}

Remoção
bool remocao(tHeap &h,int &x){
    if(h.n==0)
        return true;
    x=h.v[1];
    h.v[1]=h.v[h.n];
    h.n--;
    descida(h,1);
    return true;
}

void descida(tHeap &h, int i){
    int aux;
    if(h.n>=2*i){
        if(h.n>=2*i+2){
            if(h.v[2*i+1]>h.v[2*i+2])
                aux=2*i+1;
            else
                aux=2*i+2;
        }else
            aux=2*i+1;
        if(h.v[i]<h.v[aux]){
            troca(h.v[i],h.v[aux]);
            descida(h,aux);
        }
    }
}

Utilização

Pode ser usada como heaps de prioridades onde a raíz é a maior prioridade. Com relação ao vetor a, inserção e remoção, é da ordem O(log(n)).

Outra utilização de heaps são em algoritmos de seleção. Operações de encontrar o maior, ou menor, elemento de um conjunto de números é realizado de uma forma bastante eficiente, em comparação com a utilização de uma lista ligada ordenada.

Fontes: Teoria Wikipédia e Implementações Filipe Névola

Novo Comentário