Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o...

41
Algoritmos e Estruturas de Dados - C 1 Algoritmos e Estruturas de Dados MEEC – 2014/2015 Árvores Árvores – Introdução (1) AED (IST/DEEC) 2 Árvores são uma abstração matemática que desempenha um papel central no projecto e análise de algoritmos: Usamos árvores para descrever as propriedades dinâmicas de algoritmos; Construimos e usamos estruturas de dados explícitas que são implementações concretas de árvores. Já vimos alguns exemplos: Os algoritmos para o problema da conectividade que estudámos assentam em árvores e foi dessa forma que interpretámos os resultados; Descrevemos a estrutura de chamadas de algoritmos recursivos através de árvores.

Transcript of Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o...

Page 1: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

1

Algoritmos e Estruturas de Dados MEEC – 2014/2015

Árvores

Árvores – Introdução (1)

AED  (IST/DEEC)  2  

}  Árvores são uma abstração matemática que desempenha um papel central no projecto e análise de algoritmos: }  Usamos árvores para descrever as propriedades dinâmicas de algoritmos; }  Construimos e usamos estruturas de dados explícitas que são implementações

concretas de árvores.

}  Já vimos alguns exemplos: }  Os algoritmos para o problema da conectividade que estudámos assentam em

árvores e foi dessa forma que interpretámos os resultados; }  Descrevemos a estrutura de chamadas de algoritmos recursivos através de

árvores.

Page 2: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

2

Árvores – Introdução (2)

AED  (IST/DEEC)  3  

}  Árvores, enquanto estruturas para representação de informação, fazem parte da nossa vida diária: }  Estão presentes quando se traçam árvores genealógicas; }  Usam-se para representar um processo de eliminatórias em torneios

desportivos; }  Estão presentes em organigramas de empresas; }  Em parsers para linguagens; }  Etc.

}  Em aplicações em computadores, um dos mais familiares usos de árvores surge na organização de sistemas de ficheiros: }  Os ficheiros são guardados em directorias, por vezes também chamados pastas,

que são definidos recursivamente como sequências de directorias e ficheiros; }  Esta definição recursiva reflecte uma decomposição recursiva natural que é

característica de um certo tipo de árvores.

Tipos de árvores

AED  (IST/DEEC)  4  

}  Existem vários tipos de árvores, pelo que é necessário e importante compreender a distinção entre o conceito abstracto e uma representação concreta que se pretenda, ou necessite, usar.

}  Dos vários tipos de árvores existentes destacam-se, por ordem decrescente de generalidade: }  Árvores; }  Árvores com raíz (rooted trees); }  Árvores ordenadas; }  Árvores M-árias e binárias.

Page 3: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

3

Árvores – Definições (1)

AED  (IST/DEEC)  5  

}  Uma árvore é uma colecção de vértices e arestas que satisfazem um determinado conjunto de propriedades e requisitos.

}  Um vértice é um objecto simples (também referido como nó) que pode possuir um nome e ter associado consigo um conjunto de informações complementares de caracterização.

}  Uma aresta é uma ligação entre dois vértices. }  Um caminho, ou percurso, numa árvore é uma lista de de vértices

distintos em que quaisquer dois vértices sucessivos estão ligados por arestas pertencentes à árvore.

Árvores – Definições (2)

AED  (IST/DEEC)  6  

}  Uma das propriedades estruturalmente definidores de uma árvore é o facto de existir apenas um caminho ligando quaisquer dois vértices.

}  Se existir mais que um caminho entre algum par de vértices tem-se um grafo; não uma árvore.

}  A um conjunto disjunto de árvores dá-se o nome de floresta.

Page 4: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

4

Árvores com raíz (1)

AED  (IST/DEEC)  7  

}  Uma árvore com raíz – rooted tree –, é tal que um dos vértices é designado como raíz. }  Em ciências da computação é habitual estar-se a falar de árvores com raíz

quando se usa apenas o termo árvore e para as restantes usa-se a expressão árvore livre – free tree.

}  Numa árvore com raíz qualquer vértice é a raíz da sub-árvore constituída por sí próprio e pelo vértices que lhe estão abaixo.

}  Existe exactamente um caminho entre o vértice raíz e qualquer vértice na árvore. }  A definição implica que não existe sentido atribuído às arestas; mas costuma-se

pensar na existência de um sentido descendente a partir da raíz ou inverso, dependendo das aplicações.

Árvores com raíz (2)

AED  (IST/DEEC)  8  

}  Numa árvore com raíz cada vértice, excepto a raíz, possui apenas um vértice acima de si, a que se dá o nome de pai.

}  Os vértices directamente abaixo de um vértice são designados como filhos.

}  Por vezes esta analogia familiar é levada mais longe, usando os termos irmão e avô de um vértice.

}  Vértices sem filhos designam-se folhas, ou vértices terminais. }  Vértices que possuam pelo menos um filho são por vezes

designados como não terminais.

Page 5: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

5

Árvores com raíz (3)

AED  (IST/DEEC)  9  

}  Nas árvores que traçámos para ilustrar o funcionamento dos algoritmos recursivos os vértices não terminais (círculos azuis) representam chamadas que implicam nova chamada recursiva, enquanto que os vértices terminais (quadrados ou círculos amarelos) representam chamadas que se concretizam nas condições de paragem.

11

2

6 5

2 3

1 1 1

vértice

pai

irmão

avô

1 1 filhos  filhos

Vértices não terminais

Vértices terminais/folhas

Árvores ordenadas

AED  (IST/DEEC)  10  

}  Em algumas aplicações, a forma como os filhos de cada vértice estão ordenados é relevante; noutras aplicações não é.

}  Uma árvore ordenada é uma árvore com raíz em que a ordem dos filhos em cada nó é especificada.

Page 6: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

6

Árvores binárias (1)

AED  (IST/DEEC)  11  

}  Se cada vértice tem que possuir um número específico de filhos numa ordem específica, tem-se uma árvore M-ária.

}  Em tais árvores é por vezes necessário definir vértices externos especiais que não possuam filhos.

}  O tipo mais simples de árvore M-ária é uma árvore binária. }  Uma árvore binária é uma árvore ordenada com dois tipos de

vértices: }  Vértices internos com exactamente dois filhos; }  Vértices externos sem filhos.

}  Como os dois filhos de cada vértice interno estão ordenados, referimo-nos a cada um deles como o filho esquerdo e o filho direito.

Árvores binárias (2)

AED  (IST/DEEC)  12  

}  Cada vértice interno tem que possuir um filho esquerdo e um filho direito, mas um ou ambos poderão ser um vértice externo.

}  Uma folha num árvore M-ária é um vértice interno cujos filhos são todos vértices externos (definição alterada para o caso de árvores M-árias).

}  Definição 1 – Uma árvore binária é um vértice externo ou um vértice interno ligado a um par de árvores binárias, que se designam como a sub-árvore esquerda e a sub-árvore direita desse vértice.

}  Existem várias formas de representar ou implementar uma árvore binária em programação.

}  A mais frequente é uma estrutura com dois ponteiros (ponteiro esquerdo e ponteiro direito) para vértices internos.

Page 7: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

7

Definição de tipo para Árvores Binárias (1)

AED  (IST/DEEC)  13  

}  O código acima mais não faz do que concretizar a definição de árvore binária que vimos atrás.

}  Variáveis do tipo link serão usadas apenas como ponteiros para vértices e um vértice consiste em um Item e um par de ponteiros do tipo link. }  Por exemplo, implementamos a operação abstracta “mover para a sub-árvore

da esquerda” com a instrução x = x->l.

}  Devido a todas as diferentes representações possíveis para árvores binárias, seria normal definir-se uma ADT (abstract data type) que incluísse as operações mais importantes, para separar a utilização da implementação.

typedef struct node link; struct node {Item item; link *l, *r;}

Definição de tipo para Árvores Binárias (2)

AED  (IST/DEEC)  14  

}  Muitas vezes isso não é feito porque: }  Na maior parte dos casos usa-se a representação com dois ponteiros; }  Usam-se árvores para implementar outros ADT de ordem superior, onde o

enfoque principal é nestes últimos; }  Determinados algoritmos têm uma eficiência que depende da representação

particular – esse facto poderia perder-se usando uma ADT genérica.

}  Estas são as mesmas razões que nos levam a usar as representações explícitas para tabelas e listas simples.

}  A representação para árvores binárias agora apresentada é um instrumento fundamental que agora adicionamos àquelas duas.

}  Para listas simples enunciámos um conjunto de operações elementares para inserção e remoção de elementos.

Page 8: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

8

Definição de tipo para Árvores Binárias (3)

AED  (IST/DEEC)  15  

}  Nem todas estas operações podem ser consideradas elementares para árvores binárias, por causa da existência de dois ponteiros.

}  Se pretendermos remover um vértice de uma árvore binária temos que ter em conta que existem dois filhos depois de retirá-lo mas apenas um pai.

}  Algumas operações naturais não possuem esta dificuldade: }  Inserir um vértice novo no fundo; }  Remover uma folha; }  Combinar duas árvores, criando uma nova raíz.

Exemplo

AED  (IST/DEEC)  16  

Uma instância de árvore binária

Correspondente representação em computador

Page 9: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

9

Árvores – Definições e representações (1)

AED  (IST/DEEC)  17  

}  Definição 2 – Uma árvore M-ária é um vértice externo ou um vértice interno ligado a uma sequência ordenada de M árvores que também são M-árias.

}  Normalmente representam-se os vértices em árvores M-árias como estruturas com M ponteiros individualmente nomeados ou através de uma tabela de M ponteiros.

}  Definição 3 – Uma árvore (também designada como árvore ordenada) é um vértice (chamado raíz) ligado a uma sequência de árvores disjuntas. A essa sequência dá-se o nome de floresta.

}  A distinção essencial entre uma árvore ordenada e uma árvore M-ária é que na primeira qualquer vértice pode possuir um número arbitrário de filhos.

Árvores – Definições e representações (2)

AED  (IST/DEEC)  18  

}  Porque cada vértice de uma árvore ordenada pode possuir um número arbitrário de filhos, a representação natural é uma lista simples de ponteiros, em vez de uma tabela, para os filhos.

A

B C

H

D

E F G

I J K

A  

B   C   D  

E   F  

Page 10: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

10

Árvores – Definições e representações (3)

AED  (IST/DEEC)  19  

}  Propriedade 4 – Existe uma correspondência de um para um entre árvores binárias e florestas ordenadas.

}  Podemos representar qualquer floresta como uma árvore binária fazendo o ponteiro da esquerda de cada vértice apontar para o seu filho mais à esquerda e o ponteiro da direita apontar para o seu irmão à direita.

A  B  

C  

D  

E  

F  

Árvores – Definições e representações (4)

AED  (IST/DEEC)  20  

}  Definição 4 – Uma árvore com raíz (ou árvore não ordenada) é um vértice (denominado raíz) ligado a um conjunto múltiplo de árvores com raíz. (Esse conjunto múltiplo é designado como uma floresta não ordenada)

}  As árvores que encontrámos quando estudámos o problema da conectividade eram não ordenadas.

}  Estas podem ser representadas da mesma forma que as árvores ordenadas sem que se atribua significado particular à ordem pela qual se organizam os filhos de cada vértice.

}  O tipo mais geral de árvores são aquelas em que não existe a necessidade de, ou não faz sentido, definir um vértice como raíz. }  Este tipo mais geral de árvores será discutido no contexto dos grafos.

Page 11: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

11

Propriedades das Árvores Binárias (1)

AED  (IST/DEEC)  21  

}  Propriedade 5 – Uma árvore binária com N vértices internos possui N+1 vértices externos.

}  Demonstração – O resultado estabelece-se por indução. Uma árvore binária sem vértices internos possui exactamente um vértice externo, pelo que propriedade se verifica para N = 0. Para N > 0, qualquer árvore binária com N vértices internos possui k vértices internos na sub-árvore da esquerda e N-1-k vértices internos na sub-árvore da direita, para algum k entre 0 e N-1, porque a raíz é um vértice interno. Pela hipótese de indução a sub-árvore da esquerda possui k+1 vertices externos e a sub-árvore da direita possui N-k vértices externos, o que perfaz um total de N+1.

QED

Propriedades das Árvores Binárias (2)

AED  (IST/DEEC)  22  

}  Propriedade 6 – Uma árvore binária com N vértices internos possui 2N arestas: N-1 arestas para vértices internos e N+1 arestas para vértices externos.

}  Demonstração – Em qualquer árvore com raíz qualquer vértice, excepto a raíz, tem apenas um pai e cada aresta liga um vértice ao seu pai. Portanto existem N-1 arestas ligando vértices internos. E cada um dos N+1 vértices externos possui uma aresta para o seu pai.

QED

Page 12: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

12

Propriedades das Árvores Binárias (3)

AED  (IST/DEEC)  23  

}  Definição 5 – O nível de um vértice numa árvore é uma unidade superior ao nível do seu pai, sendo que a raíz tem nível 0. A altura de uma árvore é o máximo dos níveis de todos os vértices que a constituem. O comprimento de percurso (path length) de uma árvore é a soma dos níveis de todos os vértices da árvore. O comprimento de percurso interno de uma árvore binária é a soma do níveis de todos os vértices internos. O comprimento de percurso externo de uma árvore binária é a soma dos níveis de todos os seus vértices externos.

}  Propriedade 7 – A altura de uma árvore binária com N vértices internos é pelo menos lgN (arredondado por excesso) e no máximo N.

Propriedades das Árvores Binárias (4)

15 nós internos

Altura h=4 8 nós internos

Altura h=8

raíz: nível 0

Nós de nível 1

Nós  de  nível  4  Nós  de  nível  4  Nós de nível 4

Page 13: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

13

Síntese da Aula 1

AED  (IST/DEEC)  25  

}  Introdução às árvores }  Tipos de árvores; }  Definições; }  Árvores com raíz; árvores ordenadas; árvores M-árias; árvores binárias.

}  Definições de tipos e representações }  Árvores binárias; }  Árvores M-árias; }  Árvores ordenadas; }  Árvores com raíz; }  Árvores gerais

}  Propriedades das Árvores Binárias

Varrimento em árvores binárias (1)

AED  (IST/DEEC)  26  

}  Antes de avançarmos para algoritmos de construção de árvores, vamos analisar algoritmos para a mais elementar das operações em árvores: varrimento.

}  Dado um ponteiro para uma árvore, pretende-se processar cada vértice da árvore de forma sistemática.

}  Vamos concentrar-nos em árvores binárias. }  Assim, como cada vértice possui dois ponteiros, para a sub-árvore

esquerda e para a sub-árvore direita, existem três formas diferentes de executar o varrimento:

}  Pré-fixado (Preorder) – em que se processa primeiro um vértice e depois as sub-árvores esquerda e direita;

}  In-fixado (Inorder) – em que se processa a sub-árvore esquerda, depois o vértice e depois a sub-árvore direita;

}  Pós-fixado (Postorder) – em que se processam as sub-árvores esquerda e direita e depois o vértice.

Page 14: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

14

Varrimento em árvores binárias (2)

AED  (IST/DEEC)  27  

}  A implementação destes três mecanismos é muito simples quando se usam funções recursivas. }  O código abaixo implementa o mecanismo pré-fixado

}  Para implementar os outros dois mecanismos basta alterar a posição em que se realiza a chamada da função visit.

}  Notar que este esquema de varrimento assenta na estratégia divide-and-conquer.

void traverse(link *h, void (*visit)(link)) { if (h == NULL) return; (*visit)(h); traverse(h->l, visit); traverse(h->r, visit); }

Varrimento Pré-fixado

AED  (IST/DEEC)  28  

E

A

D H

C

F

G

B

1

E

A

D H

C

F

G

B

2

E

A

D H

C

F

G

B

3

E

A

D H

C

F

G

B

4

E

A

D H

C

F

G

B

5

E

A

D H

C

F

G

B

6

E

A

D H

C

F

G

B

7

E

A

D H

C

F

G

B

8

E  D  B  A  C  H  F  G  

Page 15: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

15

Varrimento In-fixado

AED  (IST/DEEC)  29  

E

A

D H

C

F

G

B

1

E

A

D H

C

F

G

B

2

E

A

D H

C

F

G

B

3

E

A

D H

C

F

G

B

4

E

A

D H

C

F

G

B

5

E

A

D H

C

F

G

B

6

E

A

D H

C

F

G

B

7

E

A

D H

C

F

G

B

8

A  B  C  D  E  F  G  H  

Varrimento Pós-fixado

AED  (IST/DEEC)  30  

E

A

D H

C

F

G

B

1

E

A

D H

C

F

G

B

2

E

A

D H

C

F

G

B

3

E

A

D H

C

F

G

B

4

E

A

D H

C

F

G

B

5

E

A

D H

C

F

G

B

6

E

A

D H

C

F

G

B

7

E

A

D H

C

F

G

B

8

A  C  B  D  G  F  H  E  

Page 16: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

16

Versões não recursivas (1)

AED  (IST/DEEC)  31  

}  Em algumas circunstâncias pode ser útil considerar implementações não recursivas que fazem uso explícito de uma pilha.

}  Considere-se uma pilha que tanto pode armazenar itens como árvores, inicializada com a árvore que se pretende processar.

}  O algoritmo prossegue num ciclo em que se retira o elemento do topo da pilha para processamento, continuando enquanto a pilha não estiver vazia. }  Se o elemento retirado da pilha for um item, visita-se; }  Se o elemento retirado da pilha for uma árvore então a sequência de

operações de inserção na pilha depende do tipo de varrimento desejado.

Versões não recursivas (2)

AED  (IST/DEEC)  32  

}  Se a ordem desejada for pré-fixada, insere-se primeiro a sub-árvore da direita, depois a da esquerda e depois o vértice raíz.

}  Se a ordem desejada for in-fixada, insere-se primeiro a sub-árvore direita, depois o vértice raíz e depois a sub-árvore esquerda.

}  Para a ordem pós-fixada, insere-se primeiro o vértice raíz, depois a sub-árvore direita e depois a esquerda.

}  Não se inserem vértices nulos na pilha. }  Deverá ser fácil verificar por indução que as sequências acima

produzem os mesmos resultados que as versões recursivas.

Page 17: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

17

Versões não recursivas (3)

AED  (IST/DEEC)  33  

}  Acima encontra-se uma versão não recursiva do varrimento pré-fixado.

}  É possível implementar uma versão mais eficiente, evitando inserir os objectos que vão ser removidos imediatamente.

void traverse(link *h, void (*visit)(link)) { STACKinit(max); STACKpush(h); while (!STACKempty()) { (*visit)(h=STACKpop()); if (h->r != NULL) STACKpush(h->r); if (h->l != NULL) STACKpush(h->l); } }

Outros varrimentos e outras árvores

AED  (IST/DEEC)  34  

}  Existe uma outra possibilidade para varrimento de árvores, que consiste em processá-los por níveis e em cada nível da esquerda para a direita.

}  Este é o varrimento em largura, também conhecido como level-order.

}  Para implementar este tipo de varrimento, basta usar uma fila em vez da pilha.

}  Para outras árvores não binárias os varrimentos pré-fixado, pós-fixado e em largura são bem definidos:

}  Pré-fixado – visitar primeiro a raíz e depois cada uma das sub-árvores. }  Pós-fixado – visitar cada uma das sub-árvores e depois a raíz. }  Largura – tem a mesma caracterização que para árvores binárias.

}  Para as implementações destas basta generalizar as versões não recursivas que estudámos para as árvores binárias.

Page 18: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

18

Árvores e algoritmos de procura (1)

AED  (IST/DEEC)  35  

}  Em muitos contextos torna-se necessário procurar um determinado conjunto de acções que, quando executadas em sequência, permitem atingir algum objectivo.

}  Exemplos: }  8-puzzle }  Sudoku }  Mahjong }  Etc.

}  Existe uma íntima relação entre os algoritmos de procura para resolver este tipo de problemas e árvores genéricas.

}  Abordaremos este tema com mais detalhe no capítulo de Grafos }  Aqui faz-se apenas uma breve discussão introdutória

Árvores e algoritmos de procura (2)

AED  (IST/DEEC)  36  

}  Tomemos o 8-puzzle como exemplo

}  Para cada matriz existe um conjunto de acções legais }  Baixo, Cima, Esquerda, Direita }  Para algumas configurações nem

todas as 4 acções são legais

}  Se a partir de uma dada matriz explorarmos todas as alternativas, acabaremos por encontrar a solução, se existir }  Durante a procura poderemos

construir uma árvore Retirado de http://www.heyes-jones.com/astar.html

Page 19: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

19

Árvores e algoritmos de procura (3)

AED  (IST/DEEC)  37  

}  Assim, tomando uma dada posição de partida, torna-se necessário encontrar um caminho executando apenas acções legais.

}  Em cada ponto do caminho poderá existir mais que uma acção legal }  Conceptualmente, é como se

existisse de facto uma árvore }  No entanto, a estrutura arbórea

serve apenas para ilustrar o espaço de procura e como se navega nele

Origem

Destino

Algoritmos de Procura (1)

AED  (IST/DEEC)  38  

}  Um algoritmo de procura consiste na definição do processo de navegação naquelas árvores conceptuais }  Notar que não é necessário, nem sequer desejável, que toda a árvore esteja

representada em memória }  O que se pretende é ser-se capaz de navegar no espaço de acções legais até

que se encontre o objectivo (Destino) e que depois seja possível indicar como se chegou até esse ponto

}  Existem três procedimentos de procura gerais, que se inspiram nos procedimentos de varrimento já discutidos }  Procura em profundidade, Procura em largura e Procura generalizada

}  Notar que falamos de varrimento para árvores em memória e de procura para árvores conceptuais

Page 20: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

20

Algoritmos de Procura (2)

AED  (IST/DEEC)  39  

}  Para qualquer um dos três procedimentos é suposto ser-se capaz de identificar todas as acções legais aplicáveis em cada um dos pontos da viagem }  Produzida para uma lista, tabela, etc.

}  Também é suposto ser-se capaz de identificar quais os caminhos já percorridos na procura }  Isto é, quais as acções legais que já foram testadas

}  No essencial, cada um dos três procedimentos de procura define a política de processamento da lista e/ou tabela que contém as acções legais

Algoritmos de Procura (3)

AED  (IST/DEEC)  40  

}  Procura em Profundidade (DFS – Depth First Search) }  Para cada ponto escolher a

primeira das acções legais ainda não usada

}  Prosseguir da mesma forma em cada nível, enquanto for possível avançar

Origem

Page 21: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

21

Algoritmos de Procura (3)

AED  (IST/DEEC)  41  

}  Procura em Profundidade (DFS – Depth First Search) }  Para cada ponto escolher a

primeira das acções legais ainda não usada

}  Prosseguir da mesma forma em cada nível, enquanto for possível avançar

Origem

Algoritmos de Procura (3)

AED  (IST/DEEC)  42  

}  Procura em Profundidade (DFS – Depth First Search) }  Para cada ponto escolher a

primeira das acções legais ainda não usada

}  Prosseguir da mesma forma em cada nível, enquanto for possível avançar

Origem

Page 22: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

22

Algoritmos de Procura (3)

AED  (IST/DEEC)  43  

}  Procura em Profundidade (DFS – Depth First Search) }  Para cada ponto escolher a

primeira das acções legais ainda não usada

}  Prosseguir da mesma forma em cada nível, enquanto for possível avançar

Origem

Algoritmos de Procura (4)

AED  (IST/DEEC)  44  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Page 23: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

23

Algoritmos de Procura (4)

AED  (IST/DEEC)  45  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Algoritmos de Procura (4)

AED  (IST/DEEC)  46  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Page 24: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

24

Algoritmos de Procura (4)

AED  (IST/DEEC)  47  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Algoritmos de Procura (4)

AED  (IST/DEEC)  48  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Page 25: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

25

Algoritmos de Procura (4)

AED  (IST/DEEC)  49  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Algoritmos de Procura (4)

AED  (IST/DEEC)  50  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Page 26: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

26

Algoritmos de Procura (4)

AED  (IST/DEEC)  51  

}  Procura em Largura (BFS – Breadth First Search) }  Para cada ponto inspeccionar

primeiro todas as acções legais disponíveis

}  Prosseguir para o nível seguinte apenas depois de esgotar todas as alternativas no presente nível

Origem

Algoritmos de Procura (5)

AED  (IST/DEEC)  52  

}  Procura em Generalizada (GS – Generalised Search) }  Para cada ponto avaliar a qualidade

de cada acção e/ou do local a que se chega mediante essa acção

}  Tomar o caminho da acção que em cada instante possui e/ou promete o melhor valor

93 1

Origem

Page 27: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

27

Algoritmos de Procura (5)

AED  (IST/DEEC)  53  

}  Procura em Generalizada (GS – Generalised Search) }  Para cada ponto avaliar a qualidade

de cada acção e/ou do local a que se chega mediante essa acção

}  Tomar o caminho da acção que em cada instante possui e/ou promete o melhor valor

93 1

6 5 8

Origem

Algoritmos de Procura (5)

AED  (IST/DEEC)  54  

}  Procura em Generalizada (GS – Generalised Search) }  Para cada ponto avaliar a qualidade

de cada acção e/ou do local a que se chega mediante essa acção

}  Tomar o caminho da acção que em cada instante possui e/ou promete o melhor valor

93 1

6 5 8

4

Origem

Page 28: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

28

Algoritmos de Procura (5)

AED  (IST/DEEC)  55  

}  Procura em Generalizada (GS – Generalised Search) }  Para cada ponto avaliar a qualidade

de cada acção e/ou do local a que se chega mediante essa acção

}  Tomar o caminho da acção que em cada instante possui e/ou promete o melhor valor

93 1

6 5 8

4

Origem

9

Algoritmos recursivos em árvores binárias (1)

AED  (IST/DEEC)  56  

}  Os algoritmos de varrimento que vimos fornecem uma boa base para outros tipos de problemas que poderemos necessitar de resolver.

}  Muitas tarefas em árvores binárias admitem soluções recursivas do tipo divide-and-conquer como as que vimos para varrimento.

}  É frequentemente necessário calcular o valor de parâmetros estruturais de uma árvore, recebendo como argumento um ponteiro para essa árvore.

}  A função acima calcula o número de vértices existentes na árvore binária

apontada por h.

int count(link *h) { if (h == NULL) return 0; return count(h->l) + count(h->r) +1; }

Page 29: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

29

Algoritmos recursivos em árvores binárias (2)

AED  (IST/DEEC)  57  

}  A função abaixo calcula a altura de uma árvore binária.

}  A altura de uma árvore binária, como vimos antes, define-se como sendo a maior das alturas das sub-árvores esquerda e direita mais um, para incluir a raíz nos cálculos.

}  Nem todos os parâmetros estruturais admitem implementações tão simples como estes dois exemplos. }  Por exemplo, calcular o comprimento de percurso de uma árvore é um pouco

mais complexo.

int height(link *h) { int u, v; if (h == NULL) return -1; u = height(h->l); v = height(h->r); if (u > v) return u+1; else return v+1; }

Algoritmos recursivos em árvores binárias (3)

AED  (IST/DEEC)  58  

}  A nossa primeira função para construção explícita de uma árvore binária está associada com a função max que estudámos anteriormente.

}  O objectivo é construir um torneio: uma árvore binária em que cada item em cada vértice interno é uma cópia do maior dos itens dos seus dois filhos. }  Os itens nas folhas é que constituem a informação de interesse; }  O resto da árvore permite-nos calcular o maior dos items de forma eficiente.

Page 30: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

30

Construção de uma árvore

AED  (IST/DEEC)  59  

typedef struct node link; struct node {Item item; link *l; link *r}; link *NEW(Item item, link *l, link *r) { link *x = (link *) malloc(sizeof(link); x->Item = item; x->l = l; x->r = r; return x; } link *max(Item a[], int l, int r) { int m = (l+r)/2; Item u, v; link *x = NEW(a[m], NULL, NULL); if (l == r) return x; x->l = max(a, l, m); x->r = max(a, m+1, r); u = x->l->Item; v = x->r->Item; if (u > v) x->Item = u; else x->Item = v; return x; }

Exemplo (1)

AED  (IST/DEEC)  60  

}  Considere-se a tabela a = [3 4 1 8 9 2 7 6 5] e a chamada à função max(a, 0, 8). max(a, 0, 8) max(a, 0, 4) max(a, 0, 2) max(a, 0, 1) max(a, 0, 0) -> 3 max(a, 1, 1) -> 4 max(a, 2, 2) -> 1 max(a, 3, 4) ...

Page 31: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

31

Exemplo (2)

AED  (IST/DEEC)  61  

9

Exemplo (2)

AED  (IST/DEEC)  62  

9

1

Page 32: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

32

Exemplo (2)

AED  (IST/DEEC)  63  

9

1

4

Exemplo (2)

AED  (IST/DEEC)  64  

9

1

4

3

Page 33: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

33

Exemplo (2)

AED  (IST/DEEC)  65  

9

1

4

3

3

Exemplo (2)

AED  (IST/DEEC)  66  

9

1

4

4

3 4

Page 34: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

34

Exemplo (2)

AED  (IST/DEEC)  67  

9

1

4

4 1

3 4

Exemplo (2)

AED  (IST/DEEC)  68  

9

1

4

4 1

8

3 4

Page 35: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

35

Exemplo (2)

AED  (IST/DEEC)  69  

9

1

4

4 1

8

8

3 4

Exemplo (2)

AED  (IST/DEEC)  70  

9

9

4

4 1

9

8 9

3 4

Page 36: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

36

Exemplo (2)

AED  (IST/DEEC)  71  

9

9 7

4

4 1

9

8 9

3 4

Exemplo (2)

AED  (IST/DEEC)  72  

9

9 7

4 2

4 1

9

8 9

3 4

Page 37: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

37

Exemplo (2)

AED  (IST/DEEC)  73  

9

9 7

4 2

4 1

9

8 9 2

3 4

Exemplo (2)

AED  (IST/DEEC)  74  

9

9 7

4 7

4 1 7

9

8 9 2

3 4

Page 38: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

38

Exemplo (2)

AED  (IST/DEEC)  75  

9

9 7

4 7

4 1 7

9

8 9

6

2

3 4

Exemplo (2)

AED  (IST/DEEC)  76  

9

9 7

4 7

4 1 7 6

9

8 9

6

2

3 4

Page 39: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

39

Exemplo (2)

AED  (IST/DEEC)  77  

9

9 7

4 7

4 1 7 5 6

9

8 9

6

2

3 4

Construção de árvores para notação pré-fixada (1)

AED  (IST/DEEC)  78  

}  Dada uma sequência de caracteres compondo uma expressão aritmética em notação pré-fixada, é possível construir uma árvore binária que a represente. }  Exemplo: * + a * * b c + d e f

}  Vamos criar uma nova árvore para cada caracter na expressão: }  Vértices correspondentes a operadores possuem ponteiros para os operandos; }  Os vértices folha conterão as variáveis, ou constantes, que são entradas para a

expressão aritmética.

}  Programas que executam traduções como compiladores frequentemente usam este tipo de representação para os programas.

Page 40: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

40

Construção de árvores para notação pré-fixada (2)

AED  (IST/DEEC)  79  

char *a; int i; typedef struct Tnode link; struct Tnode {char token; link *l, *r;}; link * NEW(char token, link *l, link *r) { link *x = (link *) malloc(sizeof(link)); x->token = token; x->l = l; x->r = r; return x; } link * parse() { char t = a[i++]; link *x = NEW(t, NULL, NULL); if ((t == ‘+’) || (t == ‘*’)) { x->l = parse(); x->r = parse();} return x; }

Exemplo

AED  (IST/DEEC)  80  

}  Seja a = [* + a * * b c + d e f]

* *

+

*

+

a

*

+

a *

*

+

a *

*

b

*

+

a *

*

b c

*

+

a **

b c

+

*

+

a **

b c

+

d

*

+

a *

*

*

+

a **

b c

+

d e

*

+

a **

b c

+

d e

f

Page 41: Algoritmos e Estruturas de Dados - Autenticação · A um conjunto disjunto de árvores dá-se o nome de floresta. Algoritmos e Estruturas de Dados - C 4 Árvores com raíz (1) 7

Algoritmos e Estruturas de Dados - C

41

Síntese da Aula 2

AED  (IST/DEEC)  81  

}  Varrimento em árvores binárias }  Pré-fixado, In-fixado, Pós-fixado }  Exemplos; }  Largura.

}  Outros varrimentos e outras árvores }  Árvores e algoritmos de procura }  Algoritmos de procura }  Algoritmos recursivos em árvores binárias }  Construção de árvores binárias

}  Torneio e parsing; }  Exemplos.