twitter
    Find out what I'm doing, Follow Me :)

sábado, 1 de maio de 2010

Heaps Binomiais (parte 3)

Parte 1 | Parte 2 | Parte 3 | Parte 4 |

Operações (continuação)

HeapMerge
Função que retorna uma lista de arvores binomiais de ordem de grau crescente a partir da união de dois heaps.
HeapMerge(H1,H2)
// Ambos Heaps apontam para uma raiz de menor grau, "a" apontara para o menor dessas duas raízes, "b" apontara para a outra
a = H1-head
b = H2-head
head[H1] = Min-Degree(a, b)
if H1-head = NIL
return
if H1-head = b
then b = a
a = H1-head
//Enquanto houver árvores do lado "b" continue unindo
while b != NULL do 
//Se não houver mais árvores a direita de "a", a árvore da direita de "a" será "b"
if a-sibling = NULL 
then a-sibling = b
return
else if a-sibling-degree < b-degree
//Se grau da raiz a direita de "a" for menor que grau de b, avance para "a" para o seu irmão à direita
then a = a-sibling
//Se não, precisa inserir a raiz "b" antes da raiz "a"
else c = b-sibling
b-sibling = a-sibling
a-sibling = b
a = a-sibling
b = c
return H1

illustração da função HeapMerge

Union

Função que retorna um heap a partir da união de depois heaps.

Binomial-Heap-Union(H1,H2)
H = Make_Heap()
//Monta uma lista de árvores binomiais dos dois heaps ordenadas por grau
H-head = HeapMerge(H1,H2)
//libera a memória ocupada por H1 and H2 mas não as listas que //eles apontam
if H-head = NULL
then return H
// Aqui há uma estrutura de dados X, possui os mesmos atributos //de um nó
// porém com mais dois: Prev (nó raiz da esquerda) Next (nó raiz //direita)
// Essa estrutura servirá para navegar entre as raízes e fazer //as operações
x-prev = NULL
x = H-head
x-next = x-sibling
while x-next != NULL //Enquanto houver raiz à direita
//Verifica se os graus da raiz atual e a próxima são //diferentes ou se há três raízes iguais em seqüência. Nesse //caso avança a navegação.
do if (x-degree !- next-x-degree) or
(next-x-sibling != NULL
and next-x-sibling-degree = x-degree)
then prev-x = x
x = next-x
//Se a chave da raiz atual for menor que o próximo, //a raiz atual será a nova raiz da nova árvore binomial com a //próxima raiz sendo seu filho mais a esquerda
// Não pode esquecer que a raiz a direita do próximo será a da //raiz atual
else if x-key <= next-x-key
then x-sibling = x-next-sibling 
Link(x-next,x)
//Se a chave atual for maior, o próximo nó será a nova raiz //com o nó atual sendo seu filho mais a esquerda. Dessa forma, o //nó a direita do nó anterior será o próximo nó, não havendo nó //anterior então o início da lista é o próximo nó.
else if prev-x = NIL   
then H-head = next-x
else x-prev-sibling = next-x
Binomial-Link(x,x-next)
x = x-next
x-next = x-sibling // No final sempre avança a                                     //navegação do próximo nó
return H





Insert_Heap

Função que insere um nó qualquer em um heap.

Insert_Heap(H,x)
//A idéia é muito simples, simplesmente cria-se um heap com um // único nó e usa a função de união nele 
H' = Make-Binomial-Heap()
x-p = NULL
x-child = NULL
x-sibling = NULL
x-degree = 0
H'-head = x
H = Binomial-Heap-Union(H,H')

Figura 8 Ilustração da função Insert_Heap
Parte 1 | Parte 2 | Parte 3 | Parte 4 |

Nenhum comentário:

Postar um comentário