Complexidade de Algoritmos

Documentos relacionados
Algoritmo de Dijkstra (um para todos ; arestas de peso não negativo ; guloso)

Distâncias Mínimas. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Distâncias Mínimas 2014/ / 27

Algoritmo Floyd-Warshall. Problema dos caminhos mínimos entre todos os pares. Programação dinâmica

INF 1010 Estruturas de Dados Avançadas

Otimização em Grafos

Algoritmos em Grafos: Caminho Mínimo

INF 1010 Estruturas de Dados Avançadas

Análise e Síntese de Algoritmos

Teoria dos Grafos Aula 22

06 Grafos: Caminhos Mínimos SCC0503 Algoritmos e Estruturas de Dados II

Busca em largura. Algoritmos em Grafos. Marco A L Barbosa

Sub-grafo. Árvore Geradora Mínima

Grafos. Exemplo de árvore geradora mínima. Notas. Notas. Notas. Notas. Árvores espalhadas mínimas. Como construir uma árvore geradora miníma

Algoritmo de Dijkstra Wikipédia, a enciclopédia livre

Desafios de Programação TCC Turma A-1

Teoria dos Grafos Aula 24

Caminho Mínimo de Fonte Única em Grafos sem Pesos Negativos

Grafos: árvores geradoras mínimas. Graça Nunes

Grafos. Notas. Notas. Notas. Notas. Caminhos mais curtos de todos os pares

Teoria dos Grafos Aula 6

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford. O problema tem subestrutura óptima

Caminho mais curto a partir de um nó Algoritmos de Dijkstra e Bellman-Ford

Grafos parte 2* Algoritmos e Estruturas de Dados II SCC-203 Rosane 2010/2011. *Baseado em material de professores dos anos anteriores

Grafos parte 2. Percorrendo um grafo. Correção. Eficiência. Percorrendo um Grafo. Percorrendo um Grafo. Percorrendo um Grafo

Análise e Síntese de Algoritmos. Algoritmos em Grafos CLRS, Cap. 22

Caminhos mínimos de única origem

Busca em Largura. Adaptado de Humberto C. B. Oliveira

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Grafos Parte 1. Aleardo Manacero Jr.

Grafos - Introdução. Pedro Ribeiro 2014/2015 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Grafos - Introdução 2014/ / 32

Grafos: componentes fortemente conexos, árvores geradoras mínimas

Caminhos mínimos de todos os pares

Grafos. Notas. Notas. Notas. Notas. Caminhos mais curtos de única origem. Subestrutura ótima. Propriedades de caminhos mais curtos

Complexidade de Algoritmos

Teoria dos Grafos Aula 5

Análise e Síntese de Algoritmos

Algoritmo de Dijkstra Estudo e Implementação

Prova Didática Grafos: Árvores Geradoras e Caminhos Mínimos, Análise de Complexidade

CIC 110 Análise e Projeto de Algoritmos I

Grafos Parte 2. SCC-603 Algoritmos e Estruturas de Dados II. Profª. Rosane Minghim / Baseado em material de professores dos anos anteriores

Aula 09. Percurso em grafo

Melhores momentos AULAS 1-8

Caminho Mínimo de Fonte Única em Grafos com Pesos Negativos Letícia Rodrigues Bueno

Demonstração. Relação invariante chave. Implementações do algoritmo de Prim. Implementação grosseira

5COP096 TeoriadaComputação

Acessibilidade e Fecho Transitivo de Grafos Dirigidos

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

PAA-DCC-UFAM. Grafos. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Algoritmos em Grafos COM11087-Tópicos Especiais em Programação I

Grafos Caminhos mais Curtos

GRAFOS Aula 05 Algoritmos de percurso: busca em largura e profundidade Max Pereira

BCC402 Algoritmos e Programação Avançada. Prof. Marco Antonio M. Carvalho Prof. Túlio Toffolo 2012/1

Eduardo Camponogara. DAS-9003: Introdução a Algoritmos

Árvore Geradora Mínima

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Complexidade de Algoritmos

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Estruturas de Dados Grafos

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

O estudo utilizando apenas este material não é suficiente para o entendimento do conteúdo. Recomendamos a leitura das referências no final deste

Grafos: Busca. SCE-183 Algoritmos e Estruturas de Dados 2. Thiago A. S. Pardo Maria Cristina

GRAFOS BUSCAS E MENOR CAMINHO. Prof. André Backes

Ciclos hamiltonianos e o problema do caixeiro viajante

SCC Laboratório de Algoritmos Avançados. Multigrafos: Caminhos Mínimos. Multigrafos e Multidígrafos. Multigrafos e Multidígrafos

Projeto e Análise de Algoritmos. Método Guloso

Grafos e Algoritmos de Busca

Grafos: caminhos mínimos

Universidade Federal de Alfenas

INF 1010 Estruturas de Dados Avançadas

Teoria dos Grafos Caminhos. Profª. Alessandra Martins Coelho

Análise e Síntese de Algoritmos. Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 10: Introdução aos Grafos

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches

ESTRUTURAS DE DADOS. prof. Alexandre César Muniz de Oliveira. 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Ordenação 7. Busca 8.

Algoritmos e Estruturas de Dados II

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

INSTITUTO FEDERAL DO ESPÍRITO SANTO CURSO BACHARELADO EM SISTEMAS DE INFORMAÇÃO

Complexidade de Algoritmos

IPRJ PROJETO E ANÁLISE DE ALGORITMOS LISTA DE EXERCÍCIOS 10

Grafos. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Busca em Profundidade. Busca em Grafos. Busca em Grafos. Busca em Grafos. Busca em Grafos. Os objetivos da busca são: Aplicações???

BCC204 - Teoria dos Grafos

03 Grafos: percurso, ponderação e caminhos SCC0503 Algoritmos e Estruturas de Dados II

AED2 - Aula 22 Busca em largura, cálculo de distâncias

Análise e Síntese de Algoritmos

Grafos COM11087-Tópicos Especiais em Programação II

Processamento da Informação Números Aleatórios Matrizes parte 2

Otimização em Grafos

INSTITUTO SUPERIOR TÉCNICO Análise e Síntese de Algoritmos. RESOLUÇÃO DA REPESCAGEM DO 1 o TESTE

SCC-210 Algoritmos Avançados. Capítulo 9 Grafos. Adaptado por João Luís G. Rosa

Projeto e Análise de Algoritmos

Algoritmo de Kruskal. Algoritmo de Kruskal. Floresta geradora 26. Subfloresta S 20.3

Melhores momentos AULA 4

Projeto e Análise de Algoritmos

Na última aula... Algoritmos em Grafos 1º sem / 1

Projeto e Análise de Algoritmos

Na última aula... Procurando um caminho. Certicados. Problema: dados um digrafo G e dois vértices s e t decidir se existe um caminho de s a t

Prof. Marco Antonio M. Carvalho

Transcrição:

Complexidade de Algoritmos Prof. Diego Buchinger diego.buchinger@outlook.com diego.buchinger@udesc.br Prof. Cristiano Damiani Vasconcellos cristiano.vasconcellos@udesc.br

Algoritmos de Grafos Complexidade com múltiplas variáveis

Grafos Grafos possuem dois elementos principais: Vértices Vertex (V) Arestas Edges (E) Grafos costumam ser representados de duas formas, que utilizam uma quantidade diferente de espaço: Matriz de Adjacência Θ( V² ) Lista de Adjacência Θ( V+E ) * Considere apenas o espaço criado pelo algoritmo

Depth First-Search (Busca em Profundidade) O algoritmo de Busca em Profundidade realiza uma busca ou travessia em um grafo. É utilizado para verificar quais vértices são acessíveis iniciando um caminho a partir de um vértice específico Quais vértices são acessíveis partindo de A? Quais vértices são acessíveis partindo de E?

Depth First-Search (Busca em Profundidade) O algoritmo de Busca em Profundidade realiza uma busca ou travessia em um grafo. É utilizado para verificar quais vértices são acessíveis iniciando um caminho a partir de um vértice específico // G = grafo, s = vértice inicial, // v = vetor de visitação de vértices DFS( G, s, v ) v[s] = true para cada u є G.adj[s] if( v[u] == false ) DFS( G, u, v )

A B C Depth First-Search (Busca em Profundidade) Complexidade de tempo: Matriz Melhor caso: F E D Pior caso: Complexidade de espaço:

Depth First-Search (Busca em Profundidade) F A E D B C Complexidade de tempo: Matriz Melhor caso: Ω ( V ) Nenhum nó está acessível a partir de um determinado nó Pior caso: O ( V 2 ) Todos os outros nós estão acessíveis a partir de um nó Complexidade de espaço: precisamos manter o vetor de nós visitados Θ ( V )

Depth First-Search (Busca em Profundidade) F A E D B C Complexidade de tempo: Lista Melhor caso: Ω ( V ) Necessidade de inicializar vértices como não visitados Pior caso: O ( V + E ) Todos os outros nós estão acessíveis a partir de um nó Complexidade de espaço: precisamos manter o vetor de nós visitados Θ ( V )

Prim (Árvore Geradora Mínima) Uma árvore geradora para um grafo conexo é uma árvore que conecta todos os vértices do grafo e que o conjunto de arestas é um subconjunto das arestas desse grafo. A árvore geradora é mínima se o somatório dos custos associados cada arestas for o menor possível. b 8 7 c 4 2 d 9 a 8 11 7 h i 1 6 g 4 2 f 14 10 e

Prim (Árvore Geradora Mínima) // G = grafo, s = vértice inicial, w = vetor de custo MST-PRIM( G, s, w ) para cada u є G.V b 8 7 c d 4 2 w[u] = u.pai = null a 11 i 4 14 7 6 w[s] = 0 8 q.add( {0,s} ) h g f 1 2 9 10 e enquanto q Ø // V vezes u = extrai-minimo( q ) // Qual a estrutura usada?? para cada z є G.adj[u] // Qual a estrutura usada?? se z.custo < w[z.dest] q.add( {z.custo, z.dest} ) // Qual a estrutura?? w[z.dest] = z.custo z.dest.pai = u

Prim (Árvore Geradora Mínima) // G = grafo, s = vértice inicial, w = vetor de custo MST-PRIM( G, s, w ) para cada u є G.V w[u] = u.pai = null w[s] = 0 q.add( {0,s} ) Usando G=>Matriz e q=>lista Tempo: O( V 2 + V 2 ) O( V 2 ) enquanto q Ø // V vezes u = extrai-minimo( q ) // V verificações para cada z є G.adj[u] // V vezes se z.custo < w[z.dest] q.add( {z.custo, z.dest} ) // O(1) w[z.dest] = z.custo z.dest.pai = u

Prim (Árvore Geradora Mínima) // G = grafo, s = vértice inicial, w = vetor de custo MST-PRIM( G, s, w ) para cada u є G.V w[u] = u.pai = null w[s] = 0 q.add( {0,s} ) Usando G=>Lista e q=>lista Tempo: O( V 2 + E ) * lembrando que E = O(V²) enquanto q Ø // * { O(V) } u = extrai-minimo( q ) // * => O(V²) verificações para cada z є G.adj[u] // * => O(E) se z.custo < w[z.dest] q.add( {z.custo, z.dest} ) // O(1) w[z.dest] = z.custo z.dest.pai = u

Prim (Árvore Geradora Mínima) // G = grafo, s = vértice inicial, w = vetor de custo MST-PRIM( G, s, w ) para cada u є G.V w[u] = u.pai = null w[s] = 0 q.add( {0,s} ) Usando G=>Lista e q=>árvore Tempo: O( V log V + E log V ) O( (V+E) log V ) enquanto q Ø // * { O(V) } u = extrai-minimo( q ) // * => O( V log V ) para cada z є G.adj[u] // * => O( E ) se z.custo < w[z.dest] q.add( {z.custo, z.dest} ) // (log V) [Se não w[z.dest] = z.custo manter duplicatas] z.dest.pai = u

Prim (Árvore Geradora Mínima) // G = grafo, s = vértice inicial, w = vetor de custo MST-PRIM( G, s, w ) para cada u є G.V Usando G=>Lista e q=>fib. Heap w[u] = u.pai = null Tempo: w[s] = 0 O( E + V log V ) q.add( {0,s} ) enquanto q Ø // * { O(V) } u = extrai-minimo( q ) // * => O( V log V ) para cada z є G.adj[u] // * => O( E ) se z.custo < w[z.dest] q.add( {z.custo, z.dest} ) // (1) w[z.dest] = z.custo z.dest.pai = u

Dijkstra (menor caminho entre dois nós) Dado um grafo ponderado sem arestas com peso negativo e dois nós, o algoritmo de Dijkstra encontra o menor caminho entre estes dois nós. Muito semelhante ao algoritmo de Prim Menor Caminho entre b g b 8 7 c 4 2 d 9 a 8 11 7 h i 1 6 g 4 2 f 14 10 e

Dijkstra (menor caminho entre dois nós) // G = grafo, s = vértice inicial, w = vetor de custo DIJKSTRA( G, s, w ) para cada u є G.V Usando G=>Lista e q=>fib. Heap w[u] = u.pai = null Tempo: w[s] = 0 O( E + V log V ) q.add( {0,s} ) enquanto q Ø // * { O(V) } u = extrai-minimo( q ) // * => O( V log V ) para cada z є G.adj[u] // * => O( E ) se w[u] + z.custo < w[z.dest] q.add( {w[u] + z.custo, z.dest} ) // (1) w[z.dest] = w[u] + z.custo z.dest.pai = u

Bellman Ford (menor caminho entre dois nós) Dado um grafo ponderado possivelmente com arestas de peso negativo, mas sem ciclo e dois nós, o algoritmo de Belmann Ford encontra o menor caminho entre os dois nós. Menor Caminho entre b g a 4 8 b 11 7 h 8 c 7 2 f -2-1 1 g 2 d i 14 9 10 e

Bellman Ford (menor caminho entre dois nós) // G = grafo, s = vértice inicial, w = vetor de custo BELLMAN( G, s, w ) para cada u є G.V Usando G=>Lista w[u] = u.pai = null w[s] = 0; para i de 0 a size(vertices): para cada u є G.V: para cada a є G.adj[u]: se ( w[u] + a.custo < w[a.dest] ) w[a.dest] = w[u] + a.custo a.dest.pai = u Tempo: O( V + V*E ) O( VE ) Repete E vezes

Floyd Warshall (menor caminho entre todos os nós) Dado um grafo ponderado possivelmente com arestas de peso negativo, mas sem ciclo o algoritmo de Floyd Warshall encontra o menor caminho entre todos os nós (de todos para todos). a 4 8 b 11 7 h 8 c 7 2 f -2-1 1 g 2 d i 14 9 10 e

Floyd Warshall (menor caminho entre todos os nós) // G = grafo FLOYD( G ) dist[g.v][g.v] para cada u є G.V dist[u][u] = 0 para cada z(u,v) є G.E dist[u][v] = z.custo Usando G=>Lista / Matriz Tempo: Θ ( V 3 ) para k de 0 a G.v: para i de 0 a G.v: para j de 0 a G.v: se ( dist[i][j] > dist[i][k] + dist[k][j] ) dist[i][j] = dist[i][k] + dist[k][j] Uso de programação dinâmica