Melhores momentos AULA 14

Documentos relacionados
Melhores momentos AULA 15

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

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

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

Filas de prioridade e heapsort

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

Grafos Caminhos mais curtos

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Filas com prioridade - Introdução (1)

Algoritmo de Dijkstra Estudo e Implementação

INF 1010 Estruturas de Dados Avançadas

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

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior

Estruturas de dados elementares

QUESTÕES DE PROVAS ANTIGAS

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Filas de Prioridade & Heaps

Otimização em Grafos

HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

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

Representações de Grafos

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

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

PROJETO E ANÁLISE DE ALGORITMOS (INF 2926)

Algoritmos de ordenação Heapsort

SCC-601 Introdução à Ciência da Computação II. Ordenação e Complexidade Parte 3. Lucas Antiqueira

AED2 - Aula 11 Problema da separação e quicksort

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados LEE 2014/15. Algoritmos e Estruturas de Dados - C. Teoria de Grafos e Algoritmos em Grafos

Algoritmos e Estruturas de Dados

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Ordenação: HeapSort. Prof. Túlio Toffolo BCC202 Aula 17 Algoritmos e Estruturas de Dados I

Acessibilidade e Fecho Transitivo de Grafos Dirigidos

Teoria dos Grafos Aula 8

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

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

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Otimização em Grafos

ALGORITMOS em linguagem C

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

DAINF - Departamento de Informática

INF111 Programação II Aulas 11, 12, 13 Ordenação

AULA 19 AULA 20. Ordenação: algoritmo Quicksort. Resumo. Melhores momentos

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

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

INF 1010 Estruturas de Dados Avançadas

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Transcrição:

Melhores momentos AULA

Problema O algoritmo de Dijkstra resolve o problema da SPT: Dado um vértice s de um digrafo com custos não-negativos nos arcos, encontrar uma SPT com raiz s 5 5 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5 5

Simulação 5 5

Simulação 5 5

Simulação 5 5

Simulação 5 5

Simulação 5

Simulação 5

Simulação 5

Simulação 5

Simulação 6 5

Simulação 6 5

Simulação 6 5

Simulação 6 5

Simulação 6 6 5

Simulação 6 6 5

Simulação 6 6 5

Simulação 6 6 5

Simulação 6 6 5

Simulação 6 6 5

dijkstra Recebe digrafo G com custos não-negativos nos arcos e um vértice s Calcula uma arborescência de caminhos mínimos com raiz s. A arborescência é armazenada no vetor parnt As distâncias em relação a s são armazenadas no vetor cst void dijkstra(digraph G, Vertex s, Vertex parnt[], double cst[]);

Fila com prioridades A função dijkstra usa uma la com prioridades A la é manipulada pelas seguintes funções: PQinit(): inicializa uma la de vértices em que cada vértice v tem prioridade cst[v] PQempty(): devolve se a la estiver vazia e em caso contrário PQinsert(v): insere o vértice v na la PQdelmin(): retira da la um vértice de prioridade mínima. PQdec(w): reorganiza a la depois que o valor de cst[w] foi decrementado.

dijkstra #dene INFINITO maxcst void dijkstra(digraph G, Vertex s, { Vertex parnt[], double cst[]); Vertex v, w; link p; for (v = ; v < G->V; v++) { cst[v] = INFINITO; parnt[v] = -; } 5 PQinit(G->V); 6 cst[s] = ; parnt[s] = s;

dijkstra 8 PQinsert(s); 9 while (!PQempty()) { v = PQdelmin(); for(p=g->adj[v];p!=null;p=p->next) if (cst[w=p->w]==infinito) { cst[w]=cst[v]+p->cst; parnt[w]=v; 5 PQinsert(w); }

dijkstra 6 else if(cst[w]>cst[v]+g->adj[v][w]) 8 cst[w]=cst[v]+g->adj[v][w]; 9 parnt[w] = v; PQdec(w); } } }

Conclusão O consumo de tempo da função dijkstra é O(V + A) mais o consumo de tempo de execução de PQinit e PQfree, V execuções de PQinsert, V + execuções de PQempty, V execuções de PQdelmin, e A execuções de PQdec.

Conclusão O consumo de tempo da função dijkstra é O(V ). Este consumo de tempo é ótimo para digrafos densos.

AULA 5

Mais algoritmo de Dijkstra S. e.

Relações invariantes S = vértices examinados Q = vértices visitados = vértices na la U = vértices ainda não visitados (i) não existe arco v-w com v em S e w em U S Q U

Relações invariantes (i) para cada u em S, v em Q e w em U cst[u] cst[v] cst[w] S Q U u v w

Relações invariantes (i) O vetor parnt restrito aos vértices de S e Q determina um árborescência com raiz s s S Q U

Relações invariantes (i) Para arco v-w na arborescência vale que cst[w] = cst[v] + custo do arco vw s S Q U

Relações invariantes (i) Para cada arco v-w com v ou w em S vale que cst[w] cst[v] custo do arco vw s S Q U

Relações invariantes (i5) Para cada vértice v em S vale que cst[v] é o custo de um caminho mínimo de s a v. s S Q U

Iteração s S v Q U

Iteração s S Q U v

Iteração s S Q U v

Outra implementação para digrafos densos #dene INFINITO maxcst void DIGRAPHsptD (Digraph G, Vertex s, Vertex parnt[], double cst[]) { Vertex w, w, fr[maxv]; for (w = ; w < G->V; w++) { parnt[w] = -; cst[w] = INFINITO; 5 } 6 fr[s] = s; cst[s] = ;

8 while () { 9 double mincst = INFINITO; for (w = ; w < G->V; w++) if (parnt[w]==- && mincst>cst[w]) mincst = cst[w=w]; if (mincst == INFINITO) break; parnt[w] = fr[w]; 5 for (w = ; w < G->V; w++) 6 if(cst[w]>cst[w]+g->adj[w][w]) { cst[w] = cst[w]+g->adj[w][w]; 8 fr[w] = w; } } }

Dijkstra para digrafos esparços S. e.

Representação de árvores em vetores puta que o pariu!!! nível 5 6 8 9 5 6 8 9

Pais e filhos A[.. m] é um vetor representando uma árvore. Diremos que para qualquer índice ou nó i, i/ é o pai de i ; i é o filho esquerdo de i ; i + é o filho direito. Todo nó i é raiz da subárvore formada por A[i, i, i +, i, i +, i +, i +, 8i,..., 8i +,...]

Min-heap nível 8 5 6 8 8 9 5 8 9 5 6 8 9 8 8 5 8 9

Rotina básica de manipulação de max-heap Recebe A[.. m] e i tais que subárvores com raiz i e i + são min-heaps e rearranja A de modo que subárvore com raiz i seja min-heap.

Rotina básica de manipulação de min-heap 5 nível 8 5 6 8 8 9 5 8 9 5 6 8 9 5 8 8 5 8 9

Rotina básica de manipulação de min-heap 8 nível 5 5 6 8 8 9 5 8 9 5 6 8 9 8 5 8 5 8 9

Rotina básica de manipulação de min-heap 8 nível 8 5 6 5 8 9 5 8 9 5 6 8 9 8 8 5 5 8 9

Rotina básica de manipulação de min-heap 8 nível 8 5 6 8 9 5 5 8 9 5 6 8 9 8 8 5 5 8 9

Rotina básica de manipulação de min-heap 8 nível 8 5 6 8 9 5 5 8 9 5 6 8 9 8 8 5 5 8 9

Implementação clássica Min-Heap O vetor qp é o "inverso" de pq: para cada vértice v, qp[v] é o único índice tal que pq[qp[v]] == v. É claro que qp[pq[i]]==i para todo i. static Vertex pq[maxv+]; static int N; static int qp[maxv];

PQinit, PQempty, PQinsert void PQinit(void) { N = ; } int PQempty(void) { return N == ; } void PQinsert(Vertex v) { } qp[v] = ++N; pq[n] = v; fixup(n);

PQdelmin e PQdec Vertex PQdelmin(void) { exch(, N); --N; fixdown(); return pq[n+]; } void PQdec(Vertex w) { } fixup(qp[w]);

exch e fixup static void exch(int i, int j) { Vertex t; t = pq[i]; pq[i] = pq[j]; pq[j] = t; qp[pq[i]] = i; qp[pq[j]] = j; } static void fixup(int i) { while (i> && cst[pq[i/]]>cst[pq[i]]){ } } exch(i/, i); i = i/;

fixdown static void fixdown(int i) { int j; while (*i <= N) { } } j = *i; if (j< N && cst[pq[j]] > cst[pq[j+]]) j++; if (cst[pq[i]] <= cst[pq[j]]) break; exch(i, j); i = j;

Consumo de tempo Min-Heap heap d-heap bonacci heap PQinsert O(lg V) O(log D V) O() PQdelmin O(lg V) O(log D V) O(lg V) PQdec O(lg V) O(log D V) O() dijkstra O(A lg V) O(A log D V) O(A + V lg V)

Consumo de tempo Min-Heap bucket heap radix heap PQinsert O() O(lg(VC)R PQdelmin O(C) O(lg(VC) PQdec O() O(A + V lg(vc)) dijkstra O(A + VC) O(A + V lg(vc)) C = maior custo de um arco.

Conclusão O consumo de tempo da função dijkstra implementada com um min-heap é O(A lg V). Este consumo de tempo é ótimo para digrafos esparsos.