SEMINÁRIO DE ALGORITMOS Daniel Mascarenhas Alheiros Ronald José da Silva Santiago ÁRVORES E HEAPS...

Post on 17-Apr-2015

104 views 0 download

Transcript of SEMINÁRIO DE ALGORITMOS Daniel Mascarenhas Alheiros Ronald José da Silva Santiago ÁRVORES E HEAPS...

SEMINÁRIO DE SEMINÁRIO DE ALGORITMOSALGORITMOS

Daniel Mascarenhas AlheirosDaniel Mascarenhas Alheiros

Ronald José da Silva SantiagoRonald José da Silva Santiago

“ “ ÁRVORES E HEAPSÁRVORES E HEAPS ““

IntroduçãoIntrodução

• Linearidade de Filas e PilhasLinearidade de Filas e Pilhas• Árvores (definição e Árvores (definição e propriedades)propriedades)• HeapsHeaps• Operações em HeapsOperações em Heaps• ConclusãoConclusão

“ “ ÁRVORES E HEAPS ÁRVORES E HEAPS ““

Comentário sobre Filas e Comentário sobre Filas e PilhasPilhas

São Estruturas Abstratas de São Estruturas Abstratas de dados ou seja, implementam dados ou seja, implementam uma gama de operações pré-uma gama de operações pré-definidas.definidas.

PushPush PopPop

ÁRVORESÁRVORES

““São estruturas de dados onde São estruturas de dados onde existe uma hierarquia, o que exige existe uma hierarquia, o que exige uma maior elaboração estrutural em uma maior elaboração estrutural em relação às listas, filas e pilhas.”relação às listas, filas e pilhas.”

ÁRVORESÁRVORESDEFINIÇÕESDEFINIÇÕES

1. Nó ou 1. Nó ou VérticeVértice

2. Aresta2. Aresta

3. Raiz3. Raiz

4. Folha4. Folha

5. Pai5. Pai

6. Filho6. Filho

7. Descendente7. Descendente

8. Altura8. Altura

9. Grau9. Grau

Exemplo:Exemplo:

Exemplo:Exemplo:

DEFINIÇÕESDEFINIÇÕES

1. Nó ou 1. Nó ou VérticeVértice

2. Aresta2. Aresta

3. Raiz3. Raiz

4. Folha4. Folha

5. Pai5. Pai

6. Filho6. Filho

7. Descendente7. Descendente

8. Altura8. Altura

9. Grau9. Grau

ÁRVORESÁRVORES

Exemplo:Exemplo:

ÁRVORESÁRVORESDEFINIÇÕESDEFINIÇÕES

1. Nó ou 1. Nó ou VérticeVértice

2. Aresta2. Aresta

3. Raiz3. Raiz

4. Folha4. Folha

5. Pai5. Pai

6. Filho6. Filho

7. Descendente7. Descendente

8. Altura8. Altura

9. Grau9. Grau

As árvores não têm As árvores não têm ciclos, isto é, existe ciclos, isto é, existe apenas um único apenas um único caminho entre dois caminho entre dois nós quaisquer nós quaisquer contidos nelas.contidos nelas.

aa

bb

cc

dd

ÁRVORESÁRVORES

ÁRVORESÁRVORESFormas de Representação:Formas de Representação:

1. Implícita: Utiliza arrays (vetores);1. Implícita: Utiliza arrays (vetores);

aa

bb cc

dd ee ff gg

hh ii

aa bb cc dd ee ff gg hh iiA = A =

ÁRVORESÁRVORESFormas de Representação:Formas de Representação:

1. Implícita: Utiliza arrays (vetores);1. Implícita: Utiliza arrays (vetores);

aa bb cc dd ee ff gg hh ii

O primeiro termo do array é a raiz da O primeiro termo do array é a raiz da árvore, o segundo é o seu filho à esquerda e o árvore, o segundo é o seu filho à esquerda e o terceiro, o seu filho à direita, e assim terceiro, o seu filho à direita, e assim sucessivamente. Podemos então perceber uma sucessivamente. Podemos então perceber uma fórmula genérica para encontrar os filhos de um fórmula genérica para encontrar os filhos de um elemento: os filhos de A[i] são A[2i] e A[2i+1].elemento: os filhos de A[i] são A[2i] e A[2i+1].

A = A =

ÁRVORESÁRVORESFormas de Representação:Formas de Representação:

2. Explícita: Utiliza os nós como registros com um 2. Explícita: Utiliza os nós como registros com um campo de dados e dois campos de apontadores.campo de dados e dois campos de apontadores.

AA

BB CC

DD EE FF GG

HH II

dadodadoLL RR

nó=nó=

HEAPSHEAPSSão árvores binárias cujas chaves São árvores binárias cujas chaves

obedecem à seguinte propriedade:obedecem à seguinte propriedade:

“ “ A chave de todo nó é maior ou igual às A chave de todo nó é maior ou igual às chaves dos seus descendentes.chaves dos seus descendentes. ” ”

99

88 66

77 55 33 11

44 22

HEAPSHEAPSTêm grande utilidade na implementação Têm grande utilidade na implementação

de filas de prioridade, que são tipos de filas de prioridade, que são tipos abstratos de dados definidos por duas abstratos de dados definidos por duas operações: Insere(x) e Remove(r), onde r é operações: Insere(x) e Remove(r), onde r é sempre a raiz.sempre a raiz.

99

88 66

77 55 33 11

44 22

HEAPSHEAPSRemoçãoRemoção: :

1. Sempre na raiz, pois é o elemento de 1. Sempre na raiz, pois é o elemento de maior prioridade. E agora, o que fazer com o maior prioridade. E agora, o que fazer com o que resta do heap (dois heaps separados)?que resta do heap (dois heaps separados)?

88 66

77 55 33 11

44 22

??PassoPasso

11

HEAPSHEAPSRemoçãoRemoção: :

2. Neste ponto a raiz recebe o último 2. Neste ponto a raiz recebe o último elemento do que era o antigo heap.elemento do que era o antigo heap.

88 66

77 55 33 11

44

22

PassoPasso22

HEAPSHEAPSRemoçãoRemoção: :

3. Agora deve-se comparar a nova raiz 3. Agora deve-se comparar a nova raiz com seus filhos a fim de que se com seus filhos a fim de que se mantenha a Propriedade de Heap.mantenha a Propriedade de Heap.

88 66

77 55 33 11

44

22

PassoPasso33

HEAPSHEAPSRemoçãoRemoção: :

4. Como o filho à esquerda era o maior dos 4. Como o filho à esquerda era o maior dos filhos analisados (8 e 6) e também era maior filhos analisados (8 e 6) e também era maior que o seu antecessor (2), trocam-se as que o seu antecessor (2), trocam-se as posições.posições.

22 66

77 55 33 11

44

88

PassoPasso44

HEAPSHEAPSRemoçãoRemoção: :

5. Enquanto existirem antecessores 5. Enquanto existirem antecessores menores que os seus descendentes, menores que os seus descendentes, repete-se o Passo 4 (neste exemplo repete-se o Passo 4 (neste exemplo troca-se o 2 pelo 7, e depois o pelo 4).troca-se o 2 pelo 7, e depois o pelo 4).

77 66

44 55 33 11

22

88 PassoPasso44

HEAPSHEAPSRemoçãoRemoção (algoritmo implícito): (algoritmo implícito):

Algoritmo remoção (A, n);Algoritmo remoção (A, n);

EntradaEntrada: : AA um array de tamanho um array de tamanho nn representando um heap; representando um heap;

SaídaSaída:: MaxMax (o elemento máximo do heap); (o elemento máximo do heap);

inícioinício

se n=0 então imprima: “ O heap está vazio “se n=0 então imprima: “ O heap está vazio “

senãosenão

Max:=A[1];Max:=A[1];

A[1]:=A[n];A[1]:=A[n];

n:=n-1; pai:=1; filho:=2;n:=n-1; pai:=1; filho:=2;

enquanto filho <= n-1 façaenquanto filho <= n-1 faça

se A[filho] < A[filho+1] entao filho:=filho+1;se A[filho] < A[filho+1] entao filho:=filho+1;

se A[filho] > A[pai] entao troque A[pai] por A[filho];se A[filho] > A[pai] entao troque A[pai] por A[filho];

pai:=filho; filho:=2*filho;pai:=filho; filho:=2*filho;

senão filho:=n {para o laço}senão filho:=n {para o laço}

fim.fim.

HEAPSHEAPSInserçãoInserção: :

1. É sempre realizada após o último 1. É sempre realizada após o último elemento do heap.elemento do heap.

88

77 66

44 55 33 11

22 99

PassoPasso11

novo elementonovo elemento

HEAPSHEAPSInserçãoInserção: :

2. Verifica-se se o novo elemento está na posição correta, 2. Verifica-se se o novo elemento está na posição correta, isto é, se a árvore continua sendo um heap. Em caso isto é, se a árvore continua sendo um heap. Em caso negativo, troca-se ele pelo seu antecessor imediato (seu negativo, troca-se ele pelo seu antecessor imediato (seu pai).pai).

88

77 66

99 55 33 11

22 44

PassoPasso22

HEAPSHEAPSInserçãoInserção: :

3. Enquanto houver pais menores que 3. Enquanto houver pais menores que os filhos, troca-se as suas posições.os filhos, troca-se as suas posições.

99

88 66

77 55 33 11

22 44

PassoPasso22

HEAPSHEAPSInserçãoInserção (algoritmo implícito): (algoritmo implícito):

Algoritmo Inserção (A, n, x);Algoritmo Inserção (A, n, x);

EntradaEntrada: : AA um array com um array com nn termos (heap), termos (heap), xx um número (chave); um número (chave);

SaídaSaída: : AA (o novo heap), (o novo heap), nn (o novo tamanho do heap); (o novo tamanho do heap);

inícioinício

n:=n+1; {assumimos que não estouramos (n:=n+1; {assumimos que não estouramos (overflowoverflow) o array}) o array}

A[n]:=x; filho:=n;A[n]:=x; filho:=n;

pai:= n div 2; {a variável pai recebe o resultado inteiro da pai:= n div 2; {a variável pai recebe o resultado inteiro da divisão}divisão}

enquanto pai >= 1 façaenquanto pai >= 1 faça

se A[pai] < A[filho] entãose A[pai] < A[filho] então

troque A[pai] e A[filho]troque A[pai] e A[filho]

filho:=pai;filho:=pai;

pai:=pai div 2;pai:=pai div 2;

senão pai:=0; {para parar o laço}senão pai:=0; {para parar o laço}

fim.fim.

ConclusãoConclusão

• Filas e Pilhas (Facilidade X Limitação)Filas e Pilhas (Facilidade X Limitação)• ÁrvoresÁrvores

� Formas Implícita X ExplícitaFormas Implícita X Explícita• HeapsHeaps

� Utilizações X LimitaçõesUtilizações X Limitações

“ “ ÁRVORES E HEAPS “ÁRVORES E HEAPS “

FIMFIM