Buscar

Análise de Algoritmos - Aula 16 (Guilherme)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Roteiro da Aula 16
1 Busca em Largura
2 Caminho Mı´nimo em Grafos
Algoritmo de Dijkstra
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Busca em Largura
...
ordemBfs = 0;
bfs( s );
...
bfs( int s ){
enfilere(Q,s);
marca[s] = 1;
ordem[v] = ++ordemBfs;
nivel[s] = 0;
while ( !Q.empty() ){
u = desenfilere(Q);
--> Para todo vizinho v de u {
if ( marca[v] == 0 ){
enfilere(Q,v);
marca[v] = 1;
ordem[v] = ++ordemBfs;
nivel[v] = nivel[u] + 1;
}
}
}
}
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Busca em Largura
...
ordemBfs = 0;
bfs( s );
...
bfs( int s ){
enfilere(Q,s);
marca[s] = 1;
ordem[v] = ++ordemBfs;
nivel[s] = 0;
while ( !Q.empty() ){
u = desenfilere(Q);
--> Para todo vizinho v de u {
if ( marca[v] == 0 ){
enfilere(Q,v);
marca[v] = 1;
ordem[v] = ++ordemBfs;
nivel[v] = nivel[u] + 1;
}
}
}
}
Qual e´ a complexidade?
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo em Grafos
• Entrada: Dado um grafo G = (V, E), com pesos positivos
nas arestas, e dois ve´rtices s e t;
• Sa´ıda: O custo do menor caminho entre s e t. O custo de
um caminho e´ a soma dos pesos das arestas;
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
t
Como resolver isso eficientemente?
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
5
1
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
5
1
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
5
1
2
5
3
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
5
1
2
5
3
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
4
1
2
5
3
3
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
4
1
2
5
3
3
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
5
2
9
2
1
3
4
7 8
54
2 8
3
1
2
5
1
4
2
1
1 7
4
9
6
s
4
1
2
4
3
3
6
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Estruturas para Grafos
• Usaremos um Heap para guardar ve´rtices de um Grafo
durante o algoritmo Dijkstra, portanto um ve´rtice sera´:
typedef struct {
int d; /* cota superior para dijkstra */
int h; /* h == 0, vertice fora do heap
h > 0, vertice no heap
h < 0, vertice ja´ calculado */
} vertex;
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Fila de Prioridades e Heap
Operac¸o˜es:
• Inserir elemento no conjunto H;
• Extrair o menor elemento de H;
• Atualizar o valor de um elemento de H.
• insertUpdate( H, i );
• i = extractMin( H ).
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
5
3
8 11 10
10
18
4521 11
Propriedade do Heap:
O valor de todo no´ e´ maior ou igual
que o valor de seu pai
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
5
3
8 11 10
10
18
4521 11
• Vetor H[MAXVERTICES];
• int heapSize; /* # de elementos no heap */
• H: [−1, 3, 5, 10, 8, 18, 11, 10, 21, 11, 45, · · · ];
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
5
3
8 11 10
10
18
4521 11
• H: [−1, 3, 5, 10, 8, 18, 11, 10, 21, 11, 45, · · · ];
#define LEFT(i) ((i)<<1) /* filho esquerdo */
#define RIGHT(i) (((i)<<1)|1) /* filho direito */
#define PAI(i) ((i)>>1) /* pai */
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
vertex vert[MAXVERTICES];
...
void insertUpdate( int* H, int v ){
int i = vert[v].h; /* update */
if ( i == 0 ) i = heapSize++; /* insert */
while ( i > 1 && vert[H[PAI(i)]].d > vert[v].d ){
H[i] = H[PAI(i)];
vert[H[PAI(i)]].h = i;
i = PAI(i);
}
H[i] = v;
vert[v].h = i;
}
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
int extractMin( int* H ){ /* assume heapSize > 0 */
int l,r;
int ret = H[1]; /* coloca u´ltimo na raiz */
H[1] = H[heapSize];
vert[H[1]].h = 1;
heapify( H, 1 ); /* heapify corrige o heap */
return ret;
}
Func¸a˜o heapify recursiva, no pro´ximo slide
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementando Heaps usando Vetor
void heapify( int* H, int i ){
int smallest,aux;
int l = LEFT(i), r = RIGHT(i);
if ( l <= heapSize && vert[H[l]].d < vert[H[i]].d )
smallest = l; else smallest = i;
if ( r <= heapSize && vert[H[r]].d < vert[H[smallest]].d )
smallest = r;
if ( smallest != i ){
aux = H[i];
H[i] = H[smallest]; vert[H[smallest]].h = i;
H[smallest] = aux; vert[aux].h = smallest;
heapify( H, smallest );
}
}
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Caminho M´ınimo – Dijkstra
typedef struct { int d,h; } vertex;
vertex vert[MAXVERTICES];
int H[MAXVERTICES];
...
void dijkstra( int s ){
int i; heapSize = 0;
for( i = 0; i < numVert; i++ ){
vert[i].d = MAXINT; vert[i].h = 0; }
vert[s].d = 0; /* vertice fonte */
insertUpdate(H, s );
while ( heapSize > 0 ){
i = extractMin( H ); vert[i].h = -1; /* ja´ calculado */
para cada vizinho v de i {
if ( vert[v].h >= 0 ) /* ainda n~ao calculado */
if ( vert[v].d > vert[i].d + peso(u,v) ){
vert[v].d = vert[i].d + peso(u,v);
insertUpdate( H, v );
}
}
}
}
Quanto custa?
Ana´lise de
Algoritmos
113859
Aula 16
Roteiro
Busca em
Largura
Caminho
Mı´nimo em
Grafos
Algoritmo de
Dijkstra
Implementac¸o˜es para Dijkstra
Estrutura extractMin insertUpdate Dijkstra
de |V | × extractMin+
Dados (|V |+ |E|)× insertUpdate
Array O(|V |) O(1) O(|V |2 + |E|) → O(|V |2)
Heap O(log |V |) O(log |V |) O((|V |+ |E|) log |V |)
Heap de O(log |V |) O(1) (amortizado) O(|V | log |V |+ |E|)
Fibonacci
	Roteiro
	Busca em Largura
	Caminho Mínimo em Grafos
	Algoritmo de Dijkstra

Continue navegando