• Nenhum resultado encontrado

Análise de Algoritmos

N/A
N/A
Protected

Academic year: 2022

Share "Análise de Algoritmos"

Copied!
53
0
0

Texto

(1)
(2)

• Uma representação gráfica das relações existentes entre elementos de dados

• Ferramenta de modelagem para problemas

▫ Conjunto de pontos (vértices) ligados por retas (as arestas)

▫ As arestas podem ser direcionadas (setas)

▫ Vértices e a restas podem ter pesos (custos) associados

2

3 5 4

6

7

8

1

(3)

• Úteis na representação de problemas da vida real, em vários campos profissionais

• Exemplos

▫ Mapa de estradas: podemos usar algoritmos específicos para determinar o caminho mais curto entre dois pontos

▫ Redes de computadores: cada terminal é um vértice, o

cabo de rede pelas arestas e o custo associado ao atraso,

por exemplo

(4)

• Um grafo G=(V,E) possui

▫ V – conjunto de vértices

▫ E – conjunto de arestas

• Duas representações comuns

▫ Coleção de listas de adjacências (listas encadeadas)

▫ Matriz de adjacência (matriz)

(5)

2

1 2

3 4

5

1 2 3 4 5

1 1 1 3

3 4 /

4 / 4 2 4 /

5 /

3 5 /

(6)

1 2

3 4

5

1 2 3 4 5

1 1 1 1

2 3 4 5

(7)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 1 0

2 3 4 5

(8)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 1 0

2 1 0 0 1 0

3 4 5

(9)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 1 0

2 1 0 0 1 0

3 1 0 0 1 1

4 5

(10)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 1 0

2 1 0 0 1 0

3 1 0 0 1 1

4 1 1 1 0 1

5

(11)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 1 0

2 1 0 0 1 0

3 1 0 0 1 1

4 1 1 1 0 1

5 0 0 1 1 0

(12)

1 2

3 4

5

1 2 2 3 4 5

4 /

1 /

3 /

4

5 /

5 /

(13)

1 2

3 4

5

1 2 3 4 5

1 0 1 1 0 0

2 0 0 0 1 0

3 0 0 0 1 1

4 1 0 0 0 0

5 0 0 0 0 1

(14)

• Algoritmo simples para pesquisa em um grafo

▫ Base para muitos algoritmos em grafos

• Dado um grafo G=(V,E) e um vértice de origem s

▫ O algoritmo visita (pintando) todas as arestas de G até descobrir cada vértice acessível a partir de s

▫ O algoritmo calcula a distância desde s até todos os

vértices alcançáveis

(15)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

s

a b c d e f g h

d Q

A

E

B

F

C

G

D

H

(16)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

s

a b c d e f g h

d Q

A

E

B

F

C

G

D

H

(17)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q B

A B C D E F G H

d 0

(18)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q F A

A B C D E F G H

d 1 0 1 u = B

(19)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q F A

A B C D E F G H

d 1 0 1 u = B

d[u] = 0

(20)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q A C G

A B C D E F G H

d 1 0 2 1 2 u = F

d[u] = 1

(21)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q C G E

A B C D E F G H

d 1 0 2 2 1 2 u = A

d[u] = 1

(22)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q G E D

A B C D E F G H

d 1 0 2 3 2 1 2 u = C

d[u] = 2

(23)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q E D H

A B C D E F G H

d 1 0 2 3 2 1 2 3 u = G

d[u] = 2

(24)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q D H

A B C D E F G H

d 1 0 2 3 2 1 2 3 u = E

d[u] = 2

(25)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q H

A B C D E F G H

d 1 0 2 3 2 1 2 3 u = D

d[u] = 3

(26)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

A

E

B

F

C

G

D

H s

Q

A B C D E F G H

d 1 0 2 3 2 1 2 3 u = H

d[u] = 3

(27)

BFS(G,s)

1: for each u  (V – {s}) do 2: cor[u]  BRANCO;

3: d[u] ;

4: end for

5: cor[s]  CINZA;

6: d[s]  0;

7: Q  ;

8: ENQUEUE(Q,s);

9: while Q   do 10: u  DEQUEUE(Q);

11: for each v  Adj[u] do 12: if cor[v] = BRANCO then 13: cor[v]  CINZA;

14: d[v]  d[u] + 1;

15: ENQUEUE(Q,v);

16: end if 17: end for

18: cor[u]  PRETO;

Todos os vértices são visitados três vezes

As arestas serão visitadas no máximo uma vez

O custo é O(V + E)

(28)

• Algoritmo simples para pesquisa em um grafo

▫ Base para muitos algoritmos em grafos

▫ Procura o mais distante (profundo) primeiro

• Dado um grafo G=(V,E)

▫ O algoritmo marca dois carimbos de tempo em cada vértice u

d[u] –momento em que u é descoberto a primeira vez

f[u] – momento em que u termina de ser

examinado

(29)

DFS(G)

1: for each u  V do 2: cor[u]  BRANCO;

3: end for 4: t  0;

5: for each u  V do

6: if cor[u] = BRANCO then 7: DFS-VISIT(u);

8: end if 9: end for

DFS-VISIT(u)

1: cor[u]  CINZA;

2: t  t + 1;

3: d[u]  t;

4: for each v  Adj[u] then 5: if cor[u] = BRANCO then 6: DFS-VISIT(v);

7: end if 8: end for

9: cor[u]  PRETO;

10: t  t + 1;

11: f[u]  t;

(30)
(31)

1/

(32)

1/ 2/

(33)

1/ 2/

3/

(34)

1/

4/

2/

3/

(35)

1/

4/

2/

3/

(36)

1/

4/5

2/

3/

(37)

1/

4/5

2/

3/6

(38)

1/

4/5

2/7

3/6

(39)

1/

4/5

2/7

3/6

(40)

1/8

4/5

2/7

3/6

9/

(41)

1/8

4/5

2/7

3/6

9/

(42)

1/8

4/5

2/7

3/6

9/

10/

(43)

1/8

4/5

2/7

3/6

9/

10/

(44)

1/8

4/5

2/7

3/6

9/

10/11

(45)

1/8

4/5

2/7

3/6

9/12

10/11

(46)

Qual é o custo?

(47)

• Ordenação de eventos (dependências)

▫ Grafos acíclicos direcionados (orientados), chamados

“gaos”

• Ordenação linear dos vértices

▫ Se existe uma aresta (u,v), então u aparece antes de v

▫ Se o grafo possui ciclos não é possível!

(48)

TOPOLOGICAL-SORT(G) 1: DFS(G);

2: A medida que f[u] é calculado, inserir o vértice u na frente de uma lista list;

3: return list;

(49)

• O professor Manuel Joaquim quer ordenar topologicamente a sua roupa ao se vestir

• As dependências são explicitadas pelo grafo a seguir

(50)

cueca

calças

cinto

sapatos

camisa

gravata paletó

meias

relógio

(51)

cueca

calças

cinto

sapatos

camisa

gravata paletó

meias

relógio

1/8

6/7 12/15

11/16 17/18

13/14

9/10

2/5 3/4

Resultado da Busca em profundidade

(52)

cueca

calças

cinto

sapatos

camisa

gravata paletó

meias

relógio

1/8 6/7

12/15 11/16

17/18

13/14

9/10

2/5 3/4

3º 4º

6º 7º

(53)

• Dado um grafo orientado representado por uma lista de adjacências

▫ Qual é o tempo para calcular o grau de saída (# de arestas que saem do vértice) de todos os vértices?

▫ Qual é o tempo para calcular o grau de entrada (# de arestas que chegam no vértice) de todos os vértices?

• Adapte a busca em largura para encontrar o menor

caminho entre dois nós u e v, de um grafo G=(V,E)

visitando o menor número de vértices possível

Referências

Documentos relacionados

Essas características diferenciam claramente o custo-meta ou custo alvo dos sistemas tradicionais de custos, que geralmente começam o processo de dentro.. para

Assim, a produção no segmento chamado “dentro da porteira” fica mais especializada e, passa a ser orientada para o mercado o passar dos tempos ocorreram ajustes nos modos

Propoe-se atraves de um processo de fermentacao semissolida, utilizar o farelo de milho como substrato na producao de amilase, tendo como motivacSo da pesquisa o uso do substrato

O efetivo pagamento da(s) RECEITA(S) FIXA(S) estará condicionado ao início da operação comercial da(s) USINA(S), devendo os recursos financeiros associados a este

Considerando a importância do assunto, a variabilidade existente nas características físicas e a ausência de dados na literatura especializada referente a

Results obtained in this study allow us to infer there are differences in the evaluation of plantar pressure distributions in standing posture between the Baropodometer, SAPO,

Peres et al (2000) encontraram como resultado que os fatores de risco para alta severidade de cárie foram a freqüência de consumo de doces e a renda familiar. Crianças que

Visando buscar novas técnicas para diminuir a quantidade de perdas e problemas causadas durante a linha de produção de uma empresa de queijo processado,