Grafos Procura (1) AED (IST/DEEC) 44. Grafos Procura (2) Procurar em grafos é equivalente a percorrer labirintos

Tamanho: px
Começar a partir da página:

Download "Grafos Procura (1) AED (IST/DEEC) 44. Grafos Procura (2) Procurar em grafos é equivalente a percorrer labirintos"

Transcrição

1 rafos Procura () Algumas propriedades simples em grafos são fáceis de determinar, independentemente da ordem pela qual se examinam as arestas. Ex: grau de todos os vértices. Outras propriedades estão associadas a caminhos, pelo que se torna necessário identificá-las através de pesquisa feita de vértice em vértice ao longo das arestas. A maioria dos algoritmos em grafos que consideraremos usam este modelo abstracto básico. Torna-se então necessário analisar o essencial dos algoritmos de procura em grafos e suas propriedades estruturais. AED (IST/DEEC) rafos Procura () Procurar em grafos é equivalente a percorrer labirintos Necessário marcar pontos já visitados Ser-se capaz de recuar, num caminho efectuado, até ao ponto de partida. Os vários algoritmos de procura em grafos mais não fazem que executar uma determinada estratégia de procura em labirintos. Procura em profundidade primeiro (DFS Depth-first-search ). Admite duas implementações: recursiva e com uso de pilha explícita. Substituindo a pilha por uma fila FIFO, transforma-se em procura em largura primeiro (BFS Breadth-first-search ). AED (IST/DEEC)

2 rafos Exploração de labirintos () Teseu e o seu pequeno problema com o Minotauro Desenrolar um rolo de fio para poder voltar ao princípio Marcar os lugares já visitados para evitar repetição. Nós e os grafos Existem lâmpadas, inicialmente apagadas, em cada encruzilhada vértice. Cada corredor aresta possui um par de portas, inicialmente fechadas, no início e no fim deste. As portas têm janelas que nos permitem ver se a porta do lado oposto está ou não fechada e se a luz da encruzilhada correspondente está ou não acesa. O objectivo é regressar à encruzilhada inicial tendo aberto todas as portas e acendido todas as luzes. Necessitamos um conjunto de regras que garanta que tal acontece. AED (IST/DEEC) rafos Exploração de labirintos () Estratégia Exploração de Tremaux. Abrir uma qualquer porta que esteja fechada e dê acesso a uma saída da presente encruzilhada (deixá-la aberta). Se todas as portas estiverem abertas, saltar para.. Se a partir da porta que foi aberta for visível que a encruzilhada em que o corredor termina foi acesa, abrir outra porta (passo ). Caso contrário (a encruzilhada está às escuras), seguir o corredor, desenrolando o fio, até essa encruzilhada, acender a luz e voltar ao passo.. Se todas as portas estão abertas na presente encruzilhada, verificar se éa primeira visitada. Se sim, parar. Se não, usar o fio para recuar até à última encruzilhada visitada e voltar ao passo. AED (IST/DEEC)

3 rafos Exemplo de execução (DFS) AED (IST/DEEC) 8 rafos Exemplo de execução (DFS) AED (IST/DEEC) 9

4 rafos Exemplo de execução (DFS) AED (IST/DEEC) rafos Exemplo de execução (DFS) AED (IST/DEEC)

5 rafos Exemplo de execução (DFS) AED (IST/DEEC) rafos Exemplo de execução (DFS) AED (IST/DEEC)

6 rafos Exemplo de execução (DFS) AED (IST/DEEC) rafos Exemplo de execução (DFS) AED (IST/DEEC)

7 rafos Exemplo de execução (DFS) AED (IST/DEEC) rafos Exemplo de execução (DFS) AED (IST/DEEC)

8 rafos Estratégia de Tremaux Prop: Quando se usa a estratégia de exploração de labirintos de Tremaux abrem-se todas as portas, acendem-se todas as luzes e termina-se no local de partida. Demonstração (esboço): Prova-se por indução, mostrando primeiro ser verdade para um labirinto com apenas uma encruzilhada e nenhum corredor basta acender a única luz. Para um labirinto com mais que uma encruzilhada assume-se ser verdade para todos os labirintos menores com menos encruzilhadas. Bastará mostrar que se visitam todas as intersecções, dado que se abrem todas as portas de cada uma delas. Considere-se o primeiro corredor tomado. O grafo fica dividido em dois sub-grafos: as intersecções que se visitam sem regressar à origem; e as que só são visitáveis regressando ao ponto de partida. AED (IST/DEEC) 8 rafos DFS Notar que a estratégia de procura de Tremaux, mais não é que procura em profundidade primeiro. O algoritmo procede sempre abrindo uma porta e afastando-se da origem, até que chega a um ponto em que não pode abrir mais portas, tendo então que recuar até ao último ponto onde deixou, pelo menos, uma porta por abrir. Se ao recuar nunca encontrar portas por abrir, acabará regressando ao ponto de partida, dado que o fio que desenrolou no caminho descendente, lhe permite esse regresso. AED (IST/DEEC) 9

9 rafos Implementação de DFS (matriz de adjacências) #define dfsr search void dfsr(raph, Edge e) { int t, w = e.w; pre[w] = cnt++; } for (t = ; t < ->V; t++) if (->adj[w][t]!= ) if (pre[t] == -) dfsr(, EDE(w, t)); Função a ser chamada a partir de uma função de procura genérica ( ADT style ) que inicializa o contador cnt a zero e todas as entradas da tabela indexada pelos vértices pre a. AED (IST/DEEC) rafos Descrição da Implementação A tabela pre está associada com as lâmpadas. Se pre[i] valer, significa que a luz está apagada para esse vértice. Quando se encontra uma aresta para um vértice em que pre não vale, um vértice já visitado, essa aresta não é seguida. Finalmente, a própria estrutura da recursão estabelece o mecanismo equivalente a desenrolar o novelo de fio. Quando um vértice não possui mais vértices adjacentes com pre igual a, a chamada recursiva termina, devolvendo o controlo de execução para o vértice que o antecedeu na recursão. O retorno da recursão éequivalente a voltar a enrolar o fio. AED (IST/DEEC)

10 rafos Implementação de DFS (listas de adjacências) #define dfsr search void dfsr(raph, Edge e) { } link t; int w = e.w; pre[w] = cnt++; for (t = ->adj[w]; t!= NULL; t = t->next) if (pre[t->v] == -) dfsr(, EDE(w, t->v)); AED (IST/DEEC) rafos Comparação Na implementação por matriz de adjacências, para cada vértice examinam-se todos as arestas que lhe são incidentes por ordem de numeração dos vértices de saída. Avança sempre pelo primeiro (de índex mais baixo) que não tenha sido visitado e lhe é adjacente. Na implementação por listas de adjacências, são imediatamente considerados os vértices adjacentes e a ordem de inspecção pode não coincidir com a numeração. Avança sempre pelo primeiro da lista de adjacências que não tenha sido ainda visitado. AED (IST/DEEC)

11 rafos ADT para procura static int cnt, pre[maxv]; void RAPHsearch(raph ) { int v; } cnt = ; for (v = ; v < ->V; v++) pre[v] = -; for (v = ; v < ->V; v++) if (pre[v] == -) search(, EDE(v, v)); RAPHsearch é uma função ADT para procura genérica em grafos, realizando os seguintes passos:. Encontra um vértice não marcado.. Visita (e marca como visitados) todos os vértices no sub-grafo ligado a que o primeiro vértice pertence. A função de procura não é especificada a este nível de abstracção. AED (IST/DEEC) rafos Propriedades da procura Prop: Uma função de procura em grafos marca cada vértice do grafo se e só se a função de procura que usa marcar cada vértice do sub-grafo ligado que contiver o vértice inicial. Demonstração trivial por indução no número de sub-grafos ligados máximos. Prop: A DFS num grafo representado por matriz de adjacências requer um tempo proporcional a V. Cada entrada da matriz de adjacências é inspeccionada uma só vez. Prop: A DFS num grafo representado por listas de adjacências requer um tempo proporcional a V + E. Inicialização proporcional a V, V chamadas recursivas e cada elemento das listas de adjacências inspeccionado uma só vez. AED (IST/DEEC)

12 rafos Tabelas indexadas por vértices Muitas funções sobre grafos requerem a existência, o uso ou construção de tabelas indexadas pelos vértices dos grafos que processam. Tais tabelas são incluídas em vários níveis de abstracção Como variáveis globais ex: pre em DFS. Na representação do próprio grafo ex: grau de um vértice Como parâmetros passados, fornecidos pelos próprios clientes ex: ao calcular alguma tabela que seja função dos vértices. A inicialização destas tabelas é tipicamente feita colocando todas as entradas a, por forma a poderem paralelamente ser usadas com a mesma utilidade da tabela pre, atrás apresentada. AED (IST/DEEC) rafos - BFS Se o objectivo for encontrar o caminho mais curto entre um par de vértices, caso exista, a DFS não é muito útil. A DFS poderá encontrar um caminho, mas não dá garantias de que seja o mais curto, a menos que se determinem todos explicitamente para posterior avaliação. A procura em largura primeiro ( BFS Breadth First Search ) é baseada exactamente nesse objectivo. Quando temos mais que uma aresta para percorrer, escolhemos uma e guardamos as outras para explorar mais tarde. Em DFS usamos uma pilha (LIFO) avança para longe da entrada enquanto puder. Em BFS usamos um fila (FIFO) só avança para longe da entrada depois de ter investigado todos corredores que dela saem. AED (IST/DEEC)

13 rafos Implementação de BFS (matriz de adjacências) # define bfs search void bfs(raph, Edge e) {int v; QUEUEput(e); while (!QUEUEempty()) if (pre[(e = QUEUEget()).w] == -) { pre[e.w] = cnt++; st[e.w] = e.v; for (v = ; v < ->V; v++) if (->adj[e.w][v] == ) if (pre[v] == -) QUEUEput(EDE(e.w, v)); } } Cria uma fila (FIFO) com todas as arestas incidentes de vértices visitados e de vértices ainda não visitados. Toma a primeira aresta da fila até encontrar uma que aponte para um vértice não visitado. Visita esse vértice, colocando na fila todas as arestas que apontam para vértices não visitados. Tabela st guarda informação sobre o vértice antecessor. AED (IST/DEEC) 8 rafos Exemplo de execução (BFS) AED (IST/DEEC) 9

14 rafos Exemplo de execução (BFS) AED (IST/DEEC) rafos Exemplo de execução (BFS) AED (IST/DEEC)

15 rafos Exemplo de execução (BFS) AED (IST/DEEC) rafos Exemplo de execução (BFS) AED (IST/DEEC)

16 rafos Exemplo de execução (BFS) AED (IST/DEEC) rafos Exemplo de execução (BFS) AED (IST/DEEC)

17 rafos Síntese da aula Procura em grafos Analogia com a exploração de labirintos Estratégia de Tremaux Procura em profundidade - DFS Exemplo de execução Implementação para matrizes de adjacências e por listas de adjacências Comparação Propriedades Procura em largura BFS Implementação por matrizes de adjacências Exemplo de execução AED (IST/DEEC) rafos Propriedades da BFS () Prop: Durante a BFS, os vértices entram e saem da fila FIFO por ordem crescente da sua distância ao vértice inicial. Demonstração: Verifica-se uma propriedade mais forte: a fila consiste sempre de zero ou mais vértices distando k passos do vértice inicial, seguidos de zero ou mais vértices distando k+ passos dos vértice inicial, para algum valor de k. Éfácil provar esta propriedade por indução. AED (IST/DEEC)

18 rafos Propriedades da BFS () Prop: A BFS visita todos os vértices e arestas de um grafo em tempo proporcional a V para a representação por matriz de adjacências e proporcional a V+E para a representação por listas de adjacências. Demonstração: Tal como em DFS, a implementação inspecciona completamente a linha da matriz de adjacências ou a lista de pares adjacentes associada com cada vértice visitado. Basta mostrar que todos os vértices são visitados. Todos os vértices que podem ser alcançados a partir do início estão (i) Na árvore criada pela procura, (ii) na fila, ou (iii) são alcançáveis a partir dos vértices que estão na fila. Todos os vértices se deslocam de (iii) para (ii) e depois para (i), sendo que em cada iteração do ciclo while (i) aumenta a sua cardinalidade. AED (IST/DEEC) 8 rafos Implementação melhorada de BFS (matriz de adjacências) void bfs(raph, Edge e) {int v, w; QUEUEput(e); pre[e.w] = cnt++; while (!QUEUEempty()) { e = QUEUEget(); w = e.w; st[w] = e.v; for (v = ; v < ->V; v++) if ((->adj[w][v] == ) && (pre[v] == -)) { QUEUEput(EDE(w, v)); pre[v] = cnt++; } } } AED (IST/DEEC) 9 u a r d a a p e n a s v é r t i c e s p o r v i s i t a r

19 rafos Problemas que BFS resolve Caminho mais curto entre v e w Tomar v como o vértice inicial e aplicar BFS até que pre[w] deixe de ser. Caminhos mais curtos a partir de um vértice fonte Tomar o vértice fonte como inicial e executar a BFS até ao fim. Todos os caminhos mais curtos Como a BFS permite encontrar o caminho mais curto de um vértice inicial para todos os outros, basta aplicar BFS para cada um dos vértices do grafo dado como ponto de partida. A complexidade desta solução é cúbica no número de vértices para representação por matrizes de adjacências. AED (IST/DEEC) 8 rafos Procura generalizada () Tanto a DFS como a BFS são casos particulares de procura generalizada em grafos. A implementação da BFS que se apresentou, introduz a pista essencial de resolução de qualquer outro mecanismo de procura. Isto é, tudo depende da forma como se inserem novos vértices na fila, assumindo que se retira sempre o vértice que encabeça a fila. Substitua-se o conceito de fila pelo conceito de franja, ou fronteira. Todos os vértices que estão na franja são os não visitados, candidatos à próxima visita. AED (IST/DEEC) 8

20 rafos Procura generalizada (S) () Assim sendo, a estratégia genérica de procura em grafos é a seguinte: Tomar um qualquer vértice como inicial e criar a franja colocando lá esse vértice. Enquanto a franja não estiver vazia Mover ao longo de uma aresta a partir da franja. Se o vértice a que se chega não tiver sido visitado, visitá-lo a colocar na franja todos os vértices não visitados que lhe são adjacentes. Esta estratégia garante que todos os vértices de um grafo ligado serão visitados. Quando usamos uma pilha para modelar a franja temos DFS. Quando usamos uma fila, temos BFS. AED (IST/DEEC) 8 rafos Implementação de procura generalizada (lista de adjacências) #define pfs search void pfs(raph, Edge e) {link t; int v, w; Qput(e); pre[e.w] = cnt++; while (!Qempty()) { e = Qget(); w = e.w; st[w] = e.v; for (t = ->adj[w]; t!= NULL; t = t->next) if (pre[v = t->v] == -) {Qput(EDE(w, v)); pre[v] = cnt++;} else if (st[v] == -) Qupdate(EDE(w, v)); } } AED (IST/DEEC) 8

21 Prop: rafos Propriedade da S Procura generalizada em grafos visita todos os vértices e arestas de um grafo num tempo proporcional a V para matrizes de adjacências e proporcional a V+E para listas de adjacências; mais, no pior caso, o tempo necessário para V inserções, V remoções e E actualizações numa fila generalizada de tamanho V. Demonstração: A primeira parte não depende da implementação da fila generalizada, pelo que se aplica trivialmente. O tempo extra explicitado decorre naturalmente da implementação de uma fila generalizada. AED (IST/DEEC) 8 rafos Árvores mínimas de suporte Def: Uma árvore mínima de suporte (MST) de um grafo ponderado é o conjunto de arestas ligando todos os vértices, tais que a soma dos pesos das arestas é, pelo menos, tão baixa quanto a soma dos pesos de qualquer outro conjunto de arestas ligando todos os vértices. Deverá ser evidente pela definição que estamos apenas interessados em conjuntos de arestas que constituam uma árvore de suporte. Como se mostra que a definição assim o estabelece? AED (IST/DEEC) 8

22 rafos Representação de grafos ponderados () A representação dos pesos associados às arestas em grafos ponderados pode ser feita por: A matriz de adjacências deixa de ser booleana, para passar a conter o valor associado às arestas requer sentinela para vértices não adjacentes. Cada elemento da lista de adjacências passa a conter um campo adicional com o peso da aresta, para além do campo identificador do vértice. No caso da representação das arestas ter-se-á que adicionar um campo para o peso. typedef struct {int v, int w, double wt;} Edge; Edge EDE(int, int, double); Estas definições são incluídas no ficheiro RAPH.h anteriormente introduzido. AED (IST/DEEC) 8 rafos - Implementação de ADT (matrizes de adjacência) #include <stdlib.h> #include RAPH.h struct graph {int V; int E; double **adj;}; raph RAPHinit(int V) { raph = malloc(sizeof (*)); ->V = V; ->E = ; ->adj = MATRIXdouble(V, V, maxwt); return ; } void RAPHinsertE(raph, Edge e) { if (->adj[e.v][e.w] == maxwt) ->E++; ->adj[e.v][e.w] = e.wt; ->adj[e.w][e.v] = e.wt; } AED (IST/DEEC) 8 r a f o s P o n d e r a d o s

23 rafos Propriedades das MST () Prop. : Dada uma divisão de vértices de um grafo em dois conjuntos, qualquer árvore mínima de suporte (MST) desse grafo contém uma aresta de menor peso que liga um vértice de um dos conjuntos a algum dos vértices do outro. Demonstração: Por redução ao absurdo. Suponha-se que não há ou que não é de menor peso. Se não existir, não é uma árvore de suporte. Se não for de menor peso, então seja s a aresta de menor peso que liga vértices dos dois conjuntos. Esta aresta não pertence à MST. Adicione-se a aresta s. O grafo obtido possui agora um ciclo e esse ciclo contém também a aresta t que liga os dois conjuntos. Retirando a aresta t obtém-se uma MST de menor peso. Não é? AED (IST/DEEC) 88 rafos Exemplo () 8 8 Aresta mais curta ligando os vértices amarelos aos verdes. AED (IST/DEEC) 89

24 rafos Propriedades das MST () Prop. : Dado um grafo, considere-se o grafo que se obtém adicionando uma aresta e a. Adicionar e àmst de e retirar a maior aresta do ciclo assim criado, gera a MST de. Demonstração: Se e é maior que todos as outras arestas do ciclo, não pode pertencer àmst de (ver propriedade anterior): retirando e de tal MST partiria o grafo em dois e e não seria a mais curta aresta entre essas duas partes, porque alguma outra aresta do ciclo faz essa ligação e possui menor peso. Caso contrário, seja t a maior aresta do ciclo criado com a adição de e. Retirando t àmst original gera duas partes em que todas as restantes arestas são menores que t. Logo, a menor aresta que liga essas duas partes é a aresta e. AED (IST/DEEC) 9 rafos Exemplo () Árvore Mínima de Suporte Nova aresta 8 8 Ciclo Maior aresta do ciclo As arestas que não pertencem àárvore mínima de suporte são as de maior peso em algum ciclo do grafo original. AED (IST/DEEC) 9

25 rafos Uma solução para a MST Ideia : Construir a árvore mínima de suporte adicionando arestas, tais que cada aresta adicionada éa de menor peso de todas as que ligam um vértice que já está na árvore a um outro que ainda não esteja. Este método éconhecido como o Algoritmo de Prim. Prop: O algoritmo de Prim calcula correctamente a MST. Demonstração: Aplicar a Prop., usando os vértices já na árvore parcial como o primeiro conjunto e os que não pertencem a essa árvore como o segundo conjunto. AED (IST/DEEC) 9 rafos Outra solução para a MST Ideia : Construir a árvore mínima de suporte adicionando arestas por ordem crescente do seu valor, desde que a nova aresta não forme um ciclo, parando assim que se tiverem adicionado V- arestas. Este método éconhecido com o Algoritmo de Kruskal. Prop: O algoritmo de Kruskal calcula correctamente a MST. Demonstração (esboço): Mostra-se por indução que o método constrói uma floresta de sub- MST s. Sempre que se adiciona uma aresta que feche um ciclo, só pode ser a maior desse ciclo Prop.. Caso contrário, a aresta adicionada liga duas árvores e éa menor a fazer essa ligação Prop.. AED (IST/DEEC) 9

26 rafos Outra mais... Ideia : Começar por ligar cada vértice ao seu vizinho mais próximo, criando, no máximo, V/ árvores. Depois, ligar cada árvore à outra árvore que lhe estiver mais próxima. Etc. Este método éconhecido como o Algoritmo de Boruvka. Prop: O algoritmo de Boruvka calcula correctamente a MST. Demonstração: Cada aresta escolhida éa mais pequena que liga dois conjuntos disjuntos Prop.. AED (IST/DEEC) 9 Procura em largura rafos Síntese da aula Propriedades Implementação alternativa para matrizes de adjacências Procura generalizada em grafos Descrição Implementação Propriedades Árvores de suporte mínimas MST Representação e implementação de ADT para grafos ponderados Propriedades das MST s exemplos Propostas de solução para cálculo de MST s AED (IST/DEEC) 9

27 rafos Alg. de Prim() (Implementação) Éo algoritmo mais simples de implementar e éa escolha acertada para grafos densos. Constrói-se a árvore adicionando o vértice que estiver mais próximo da árvore já construída. A definição do método aponta para uma implementação de força bruta, que não é aconselhável para que seja eficiente. Através da definição de uma estrutura de dados complementar adequada é possível evitar cálculos excessivos. Precisamos Indicação do vértice pai, para cada vértice já na árvore. Para cada vértice fora da árvore, indicação de qual o vértice na árvore que lhe está mais próximo. Para cada vértice fora da árvore, qual a distância ao vértice da árvore mais próximo. AED (IST/DEEC) 9 rafos Alg. de Prim() (Implementação) A implementação mais simples daquele conjunto de dados é através de uma tabela indexada pelos vértices. Pode-se usar uma estrutura para representar toda a informação identificada acima. Vamos usar tabelas independentes para maior clareza e generalidade. Para determinar o próximo vértice a adicionar, inspeccionam-se todos os vértices fora da árvore, usando cada um como um índice para a terceira tabela com o objectivo de determinar a sua distância à árvore e saber qual o mais próximo. Quando se adiciona um vértice, v, examina-se cada uma das suas arestas v-w, e se w não estiver na árvore actualiza-se a sua distância àárvore, caso v-w tenha um peso inferior àpresente distância de w àárvore. AED (IST/DEEC) 9

28 rafos Alg. de Prim() (Implementação) static int fr[maxv]; #define P ->adj[v][w] void RAPHmstV(raph, int st[], double val[]) {int v, w, min; for (v = ; v < ->V; v++) {st[v] = -; fr[v] = v; val[v] = maxwt;} min = ; st[] = ; val[->v] = maxwt; for (v = ; min!= ->V; st[v = min] = fr[v]) for (w =, min = ->V; w < ->V; w++) if (st[w] == -) {if (P < val[w]) {val[w] = P; fr[w] = v;} if (val[w] < val[min]) min = w; } } fr - frente (franja) provisória de cada nó st - MST aresta final na val -distância provisória do nó àmst min -nó à menor distância da MST AED (IST/DEEC) 98 rafos Exemplo de execução () val[*] maxwt Ciclo for interior: v, st[] - min V st[] == - X fi já na árvore - adj[][] < val[] val[], fr[] val[] < val[min] min - adj[][] < val[] X fi não adjacentes - adj[][] < val[] val[], fr[] val[] < val[min] min -;;; não adjacentes v min, st[] fr[] AED (IST/DEEC) 99

29 AED (IST/DEEC) rafos Exemplo de execução () Ciclo for interior: v min =, st[] fr[] - min V já na árvore - adj[][] < val[] X val[] < val[min] min - adj[][] < val[] val[], fr[] val[] < val[min] X - já na árvore - adj[][] < val[] val[], fr[] val[] < val[min] min -;; não adjacentes v min, st[] fr[] AED (IST/DEEC) rafos Exemplo de execução ()

30 rafos Alg. de Prim (Propriedade) Prop: Com o algoritmo de Prim, pode-se determinar a MST de um grafo denso em tempo linear. Demonstração: A simples observação do código permite concluir que o tempo de execução é proporcional a V, pelo que é linear para grafos densos. Cada vez que se visita um vértice, uma passagem pelos vértices fora da árvore serve o objectivo duplo de actualizar a distância mínima de cada vértice àárvore e de determinar qual está mais próximo. i.e., qual o próximo a visitar. Descrição: Deslocar a aresta mais pequena da franja para a árvore. Visitar o vértice a que conduz e colocar na franja todas as arestas que dele saem para vértices não visitados, substituindo a aresta mais comprida quando duas arestas da franja apontam para o mesmo vértice. AED (IST/DEEC) rafos Alg. de Kruskal () (Implementação) O algoritmo de Prim adiciona uma aresta de cada vez a uma única árvore em construção. O algoritmo de Kruskal também adiciona uma aresta de cada vez, mas possui várias pequenas árvores que se vão agregando àmedida que a execução evolui. Tem início numa floresta de V árvores uma por vértice e termina quando apenas existe uma árvore a árvore mínima de suporte. Há que ordenar as arestas com um qualquer algoritmo de ordenação e posteriormente utilizar um dos algoritmos discutidos para o problema da conectividade. AED (IST/DEEC)

31 rafos Alg. de Kruskal () (Implementação) void RAPHmstE(raph, Edge mst[]) {int i, k; Edge a[maxe]; } int E = RAPHedges(a, ); sort(a,, E-); UFinit(->V); for (i =, k = ; i < E && k < ->V-; i++) if (!UFfind(a[i].v, a[i].w)) { } UFunion(a[i].v, a[i].w); mst[k++] = a[i];. Ordenação do vector de arestas, a..criação de V conjuntos com um vértice cada.. Se a menor aresta ainda não incluída não ligar dois pares que já estão ligados, inclui-la na árvore. AED (IST/DEEC) rafos Exemplo de execução () Ordenação das arestas: <(,); (,); (,); (,); (,); (,); (,); (,); (,); (,); (,)> Partição inicial: {{}, {}, {}, {}, {}, {}, {}, {}} i ; k a[i].v = ; a[i].w = {{}, {}, {}, {, }, {}, {}, {}} mst[k] (,) k i a[i].v = ; a[i].w = {{}, {}, {, }, {, }, {}, {}} mst[k] (,) k AED (IST/DEEC)

32 AED (IST/DEEC) rafos Exemplo de execução () AED (IST/DEEC) rafos Alg. de Kruskal (Propriedade) Prop: O algoritmo de Kruskal calcula a MST de um grafo num tempo proporcional a E lg E. Demonstração: Esta propriedade éconsequência do facto de o tempo de execução incluir uma ordenação de E arestas seguida de E operações procura e V- operações de união. PORQUÊ? Se utilizarmos os melhores algoritmos para cada uma das operações identificadas, tais como mergesort para a ordenação e procura-união ponderada com halving para a conectividade, o custo da ordenação domina.

33 rafos Alg. de Boruvka () (Implementação) Tal como o algoritmo de Kruskal, este algoritmo constrói a MST adicionando arestas a uma floresta de sub-árvores, todas elas MST s. A diferença reside no facto de a adição se processar em fases, em que para cada fase se adicionam várias arestas. Em cada fase determinam-se as arestas mais curtas que ligam cada sub-árvore com outra. Em seguida adicionam-se todas essas arestas. Mais uma vez, as funções elementares procura e união serão cruciais para uma implementação eficiente. AED (IST/DEEC) 8 rafos Alg. de Boruvka () (Implementação) Torna-se necessário permitir que a função de procura seja ligeiramente alterada para que associe um índice com cada uma das sub-árvores. Assim sendo, mantém-se uma tabela indexada por vértices indicando, para cada sub-árvore, qual a sua vizinha mais próxima. De seguida executam-se as seguintes operações em cada aresta do grafo: Se ligar dois vértices na mesma árvore, ignorá-la. Caso contrário, verificar as distâncias do vizinho mais próximo de cada uma das árvores, actualizando-se se apropriado. AED (IST/DEEC) 9

34 rafos Alg. de Boruvka () (Implementação) Depois de fazer esta avaliação, a tabela dos vizinhos mais próximos contém a informação necessária para ligar subárvores. Para índice dos vértices faz-se uma união, ligando os seus vizinhos mais próximos. Em seguida, retiram-se as arestas mais longas que ligam outros pares de vértices nos pares de árvores MST ligadas. AED (IST/DEEC) rafos Alg. de Boruvka () (Implementação) Edge nn[maxv]; void RAPHmstE(raph, Edge mst[]) {int h, i, j, k, v, w, N; Edge e, a[maxe]; int E = RAPHedges(a, ); for (UFinit(->V); E!= ; E = N) { for (k = ; k < ->V; k++) nn[k] = EDE(->V, ->V,.); for (h =, N = ; h < E; h++) {i = find(a[h].v); j = find(a[h].w); if (i == j) continue; if (a[h].wt < nn[i].wt) nn[i] = a[h];.... Tabela dos vizinhos mais próximos, nn.. Criação de tabela de arestas, a.. Inicialização da distância aos vizinhos.. Determinação da sub-árvore a que pertencemas arestas.. Cálculo do vizinho mais próximo. AED (IST/DEEC)

35 } rafos Alg. de Boruvka () (Implementação)... if (a[h].wt < nn[j].wt) nn[j] = a[h]; a[n++] = a[h]; } for (k = ; k < ->V; k++) { } } e = nn[k]; v = e.v; w = e.w; if ((v!= ->V) &&!UFfind(v, w)) {UFunion(v, w); mst[k] = e; }. (continuação). Deita fora de a as arestas que ligam vértices na mesma sub-árvore!!!. Funde duas subárvores, se ainda não associadas, usando a aresta mais curta, e. AED (IST/DEEC) rafos Exemplo de execução () Chamada a RAPHedges produz a =[(,,);(,,);(,,);(,,);(,,); (,,);(,,);(,,);(,,);(,,); (,,)]; E Ciclo for exterior UFinit «[,,,,,,, ] Primeiro ciclo for produz nn [8 vezes (8,8,)] (custos não normalizados) Segundo ciclo for h ; N i ; j (diferentes conjuntos) a[h].wt < nn[i].wt nn[] (,,) a[h].wt < nn[j].wt nn[] (,,) a[n] a[h]; N h AED (IST/DEEC)

36 rafos Exemplo de execução () h i ; j (diferentes conjuntos) a[h].wt < nn[i].wt nn[] (,,) a[h].wt < nn[j].wt nn[j] (,,) a[n] a[h]; N h i ; j (diferentes conjuntos) a[h].wt < nn[i].wt X a[h].wt < nn[j].wt X a[n] a[h]; N... No final do segundo ciclo for tem-se nn = [(,,);(,,);(,,);(,,); (,,);(,,);(,,);(,,)] N = ; AED (IST/DEEC) rafos Exemplo de execução () Terceiro ciclo for k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) AED (IST/DEEC)

37 rafos Exemplo de execução () k e nn[k]; v ; w v!= 8 &&!UFfind(,) X k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) k e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,) k e nn[k]; v ; w v!= 8 &&!UFfind(,) X Fim do º ciclo for - Retorno ao ciclo for externo AED (IST/DEEC) rafos Exemplo de execução () No final desta iteração existem sub-árvores Sejam * e * os seus identificadores E N == Primeiro ciclo for produz nn [8 vezes (8,8,)] (custos não normalizados) Segundo ciclo for N h ; i *; j * (mesmo conjunto) h : i *; j * (mesmo conjunto) h : i *; j * (mesmo conjunto) h : i *; j * (diferentes conjuntos) a[h].wt < nn[i].wt nn[*] (,,) a[h].wt < nn[j].wt nn[*] (,,) a[n] a[h]; N (arestas fora...) AED (IST/DEEC)

38 rafos Exemplo de execução () h : i *; j * (diferentes conjuntos) a[h].wt < nn[i].wt X a[h].wt < nn[j].wt X a[n] a[h]; N h : i *; j * (mesmo conjunto) h : i *; j * (mesmo conjunto) h : i *; j * (mesmo conjunto) h 8: i *; j * (mesmo conjunto) h 9: i *; j * (mesmo conjunto) h : i *; j * (diferentes conjuntos) a[h].wt < nn[i].wt nn[*] (,,) a[h].wt < nn[j].wt nn[*] (,,) a[n] a[h]; N AED (IST/DEEC) 8 rafos Exemplo de execução () No final do segundo ciclo for tem-se nn = [ vezes (8,8,) e vezes (,,)] Porquê?... a = [(,,);(,,);(,,);...] Porquê? N = Terceiro ciclo for k para alguns valores e nn[k]; v 8; w 8 v!= 8 &&!UFfind(,) X... k para outro qual? e nn[k]; v ; w v!= 8 &&!UFfind(,) UFunion(,); mst[k] (,,)... AED (IST/DEEC) 9

39 rafos Alg. de Boruvka (Propriedade) Prop: O algoritmo de Boruvka calcula a MST de um grafo num tempo inferior a E lg V lg * V. Demonstração: Dado que o número de sub-árvores na floresta se reduz, pelo menos, a metade em cada fase, o número de fases não é maior que lg V. O tempo de cada fase é, no máximo, proporcional ao custo de E operações de procura. Observações: A expressão acima ébastante conservadora, na medida em que ignora a redução de arestas ocorrida em cada fase. Concebido em 9 e desde os anos 8 a base para o desenvolvimento de algoritmos eficientes para MST s, assim como para algoritmos paralelos AED (IST/DEEC) rafos Comparação dos métodos () Algoritmo Pior caso Comentário Prim (padrão) V Óptimo para grafos densos Prim (com PFS)* E lg V Pior caso conservador Kruskal (padrão) E lg E Custo de ordenação domina Kruskal (ord. parcial)* E + X lg V Depende da aresta maior Boruvka E lg V Pior caso muito conservador * Variantes não discutidas * PFS Priority-First Search * ord. parcial evitar ordenar todas as arestas, dado que podem não ser necessárias (via heapsort, por exemplo). AED (IST/DEEC)

40 rafos Comparação dos métodos () E V H P K K* e/e B e/e Densidade Densidade Densidade Densidade - V/ H Prim - listas de adjacências/heapsort P Prim - matriz de adjacências K Kruskal K* Kruskal com ordenação parcial B Boruvka e/e Arestas examinadas (uniões) AED (IST/DEEC) Algoritmo de Prim rafos Síntese da aula Descrição Implementação Exemplo de execução Análise de eficiência Algoritmo de Kruskal Descrição Implementação Exemplo de execução Análise de eficiência Algoritmo de Boruvka Descrição; Implementação; Exemplo de execução; Análise de eficiência Comparação dos três métodos AED (IST/DEEC)

Algoritmos e Estruturas de Dados LEE 2013/14. Teoria de Grafos e Algoritmos em Grafos 2ª Parte

Algoritmos e Estruturas de Dados LEE 2013/14. Teoria de Grafos e Algoritmos em Grafos 2ª Parte Algoritmos e Estruturas de Dados LEE / Teoria de rafos e Algoritmos em rafos ª Parte rafos DFS Notar que a estratégia de procura de Tremaux, mais não é que procura em profundidade primeiro. O algoritmo

Leia mais

Algoritmos e Estruturas de Dados LEE 2015/16. Teoria de Grafos e Algoritmos em Grafos 2ª Parte

Algoritmos e Estruturas de Dados LEE 2015/16. Teoria de Grafos e Algoritmos em Grafos 2ª Parte Algoritmos e Estruturas de Dados LEE / Teoria de rafos e Algoritmos em rafos ª Parte rafos DFS Notar que a estratégia de procura de Tremaux, mais não é que procura em profundidade primeiro. O algoritmo

Leia mais

Busca. Pesquisa sequencial

Busca. Pesquisa sequencial Busca Banco de dados existem para que, de tempos em tempos, um usuário possa localizar o dado de um registro, simplesmente digitando sua chave. Uma tabela ou um arquivo é um grupo de elementos, cada um

Leia mais

2006/2007 Análise e Síntese de Algoritmos 2

2006/2007 Análise e Síntese de Algoritmos 2 Análise e Síntese de Algoritmos Árvores Abrangentes de Menor Custo CLRS, Cap. 23 Resumo Árvores Abrangentes de Menor Custo Minimum-Spanning Trees (MSTs) Algoritmo (greedy) genérico Prova de optimalidade

Leia mais

Algoritmos e Estrutura de Dados III. Árvores

Algoritmos e Estrutura de Dados III. Árvores Algoritmos e Estrutura de Dados III Árvores Uma das mais importantes classes de estruturas de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas

Leia mais

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES ALGORITMOS DE BUSCA EM LISTAS COM ALOCAÇÃO SEQÜENCIAL Busca em Listas Lineares A operação de busca é

Leia mais

Algoritmos de Busca em Tabelas

Algoritmos de Busca em Tabelas Dentre os vários algoritmos fundamentais, os algoritmos de busca em tabelas estão entre os mais usados. Considere por exemplo um sistema de banco de dados. As operações de busca e recuperação dos dados

Leia mais

EAD Árvore árvore binária

EAD Árvore árvore binária EAD Árvore árvore binária - Uma árvore binária é um conjunto finito de elementos (nodos) que pode ser vazio ou particionado em três subconjuntos: - raiz da árvore (elemento inicial, que é único); - subárvore

Leia mais

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

Algoritmo de Kruskal. Algoritmo de Kruskal. Floresta geradora 26. Subfloresta S 20.3 Algoritmo de Kruskal Algoritmo de Kruskal S. Algoritmos em Grafos º sem / Subfloresta Uma subfloresta de G é qualquer floresta F que seja subgrafo de G. Exemplo: As arestas vermelhas que ligam os vértices

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguinte propriedade: Para todo nó da árvore, se seu valor é X, então: Os nós pertencentes

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Uma Árvore Binária de Busca T (ABB) ou Árvore Binária de Pesquisa é tal que ou T = 0 e a árvore é dita vazia ou seu nó contém uma chave e: 1. Todas as chaves da sub-árvore esquerda

Leia mais

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I BCC202 - Estrutura de Dados I Aula 04: Análise de Algoritmos (Parte 1) Reinaldo Fortes Universidade Federal de Ouro Preto, UFOP Departamento de Ciência da Computação, DECOM Website: www.decom.ufop.br/reifortes

Leia mais

Árvores de Suporte de Custo Mínimo

Árvores de Suporte de Custo Mínimo Árvores de Suporte de Custo Mínimo Pedro Ribeiro DCC/FCUP 2014/2015 Pedro Ribeiro (DCC/FCUP) Árvores de Suporte de Custo Mínimo 2014/2015 1 / 28 Árvore de Suporte Uma árvore de suporte ou árvore de extensão

Leia mais

BC-0506: Comunicação e Redes Algoritmos em Grafos

BC-0506: Comunicação e Redes Algoritmos em Grafos BC-0506: Comunicação e Redes Algoritmos em Grafos Santo André, 2Q2011 1 Parte 1: Algoritmos de Busca Rediscutindo: Representações em Grafos Matriz de Adjacências Matriz de Incidências Lista de Adjacências

Leia mais

Árvore Binária de Busca

Árvore Binária de Busca Árvore Binária de Busca 319 Árvore Binária de Busca! construída de tal forma que, para cada nó:! nós com chaves menores estão na sub-árvore esquerda! nós com chaves maiores (ou iguais) estão na subárvore

Leia mais

Computação Paralela. Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho.

Computação Paralela. Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho. Computação Paralela Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho Outubro 2005 Desenvolvimento de Aplicações Paralelas Uma Metodologia

Leia mais

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Estruturas de Dados Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Árvores Conceitos Árvores binárias Árvores binárias de pesquisa Árvores binárias balanceadas Árvores ESTRUTURAS

Leia mais

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis. 3. Tabelas de Hash As tabelas de hash são um tipo de estruturação para o armazenamento de informação, de uma forma extremamente simples, fácil de se implementar e intuitiva de se organizar grandes quantidades

Leia mais

Árvores Binárias e Busca. Jeane Melo

Árvores Binárias e Busca. Jeane Melo Árvores Binárias e Busca Jeane Melo Roteiro Parte 1 Árvores Relação hierárquica Definição Formal Terminologia Caminhamento em Árvores Binárias Exemplos Parte 2 Busca seqüencial Busca Binária Grafos Conjunto

Leia mais

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa Programação Funcional 15 a Aula Árvores de pesquisa Pedro Vasconcelos DCC/FCUP 2014 Árvores binárias Um árvore binária é um grafo dirigido, conexo e acíclico em que cada vértice é de um de dois tipos:

Leia mais

CAPÍTULO 2. Grafos e Redes

CAPÍTULO 2. Grafos e Redes CAPÍTULO 2 1. Introdução Um grafo é uma representação visual de um determinado conjunto de dados e da ligação existente entre alguns dos elementos desse conjunto. Desta forma, em muitos dos problemas que

Leia mais

PROGRAMAÇÃO LINEAR. Resolução de problemas de programação linear usando o comando Solver, no Excel.

PROGRAMAÇÃO LINEAR. Resolução de problemas de programação linear usando o comando Solver, no Excel. PROGRAMAÇÃO LINEAR Resolução de problemas de programação linear usando o comando Solver, no Excel. Para além da resolução pelo método gráfico e/ou outros métodos, é possível resolver um problema de PL

Leia mais

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados LEE 2013/14. Objecto abstracto Dois tipos de entidades. Vértices representam

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados LEE 2013/14. Objecto abstracto Dois tipos de entidades. Vértices representam Algoritmos e Estruturas de Dados LEE 2013/14 Teoria de Grafos e Algoritmos em Grafos 1ª Parte Grafos - O que é um grafo? Objecto abstracto Dois tipos de entidades Nós ou Vértices Ramos ou Arestas Vértices

Leia mais

Análise de Algoritmos: Melhor caso, pior caso, caso médio

Análise de Algoritmos: Melhor caso, pior caso, caso médio Análise de Algoritmos: Melhor caso, pior caso, caso médio Fernando Lobo Algoritmos e Estrutura de Dados II 1 / 25 Sumário Rever um problema e um algoritmo que já conhecem. Descrevê-lo em pseudo-código

Leia mais

Análise de complexidade

Análise de complexidade Introdução Algoritmo: sequência de instruções necessárias para a resolução de um problema bem formulado (passíveis de implementação em computador) Estratégia: especificar (definir propriedades) arquitectura

Leia mais

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

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 LEE / Teoria de Grafos e Algoritmos em Grafos Grafos - O que é um grafo? Objecto abstracto Dois tipos de entidades Nós ou Vértices Ramos ou Arestas Vértices representam

Leia mais

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados MEEC 2012/13. Objecto abstracto Dois tipos de entidades. Vértices representam

Grafos - O que é um grafo? Algoritmos e Estruturas de Dados MEEC 2012/13. Objecto abstracto Dois tipos de entidades. Vértices representam Algoritmos e Estruturas de Dados MEEC 01/1 Teoria de Grafos e Algoritmos em Grafos 1ª Parte Grafos - O que é um grafo? Objecto abstracto Dois tipos de entidades Nós ou Vértices Ramos ou Arestas Vértices

Leia mais

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Prof. Paulo André Castro pauloac@ita.br Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA Uma árvore binária é: uma árvore vazia; ou uma árvore onde qualquer

Leia mais

Linguagem C: Árvores Binarias

Linguagem C: Árvores Binarias Instituto de C Linguagem C: Árvores Binarias Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com Tópicos Principais Introdução Árvores binárias Implementação

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Faculdade de Engenharia Optimização. Prof. Doutor Engº Jorge Nhambiu

Faculdade de Engenharia Optimização. Prof. Doutor Engº Jorge Nhambiu 1 Programação Não Linear Aula 25: Programação Não-Linear - Funções de Uma única variável Mínimo; Mínimo Global; Mínimo Local; Optimização Irrestrita; Condições Óptimas; Método da Bissecção; Método de Newton.

Leia mais

Árvores Binárias Balanceadas

Árvores Binárias Balanceadas Árvores Binárias Balanceadas Elisa Maria Pivetta Cantarelli Árvores Balanceadas Uma árvore é dita balanceada quando as suas subárvores à esquerda e à direita possuem a mesma altura. Todos os links vazios

Leia mais

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches CT-234 Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural Carlos Alberto Alonso Sanches CT-234 4) Árvores balanceadas AVL, Rubro-Negras, B-Trees Operações em árvores binárias de busca

Leia mais

Algoritmos de pesquisa. Tabelas de dispersão/hash

Algoritmos de pesquisa. Tabelas de dispersão/hash Algoritmos de pesquisa Tabelas de dispersão/hash Introdução Motivação: Considerar o problema de pesquisar um determinado valor num vetor (array). Se o vetor não está ordenado, a pesquisa requer O(n) de

Leia mais

Estrutura de Dados Básica

Estrutura de Dados Básica Estrutura de Dados Básica Professor: Osvaldo Kotaro Takai. Aula 7: Recursividade O objetivo desta aula é apresentar o conceito de recursão para solução de problemas. A recursão é uma técnica de programação

Leia mais

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

Estruturas de Dados Aula 15: Árvores 17/05/2011

Estruturas de Dados Aula 15: Árvores 17/05/2011 Estruturas de Dados Aula 15: Árvores 17/05/2011 Fontes Bibliográficas Livros: Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo 13; Projeto de Algoritmos (Nivio Ziviani): Capítulo

Leia mais

INF 1007 Programação II

INF 1007 Programação II INF 1007 Programação II Aula 14 Árvores Binárias Edirlei Soares de Lima Árvores Uma estrutura de dados do tipo árvore permite que dados sejam organizados de maneira hierárquica.

Leia mais

Árvores. Algoritmos e Estruturas de Dados 2005/2006

Árvores. Algoritmos e Estruturas de Dados 2005/2006 Árvores Algoritmos e Estruturas de Dados 2005/2006 Árvores Conjunto de nós e conjunto de arestas que ligam pares de nós Um nó é a raiz Com excepção da raiz, todo o nó está ligado por uma aresta a 1 e 1

Leia mais

Grafos Caminhos mais curtos

Grafos Caminhos mais curtos rafos Caminhos mais curtos Cada caminho num digrafo ponderado possui um peso -a soma dos pesos das arestas que o constituem. Esta característica origina directamente problemas como: determinar o caminho

Leia mais

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti ESTRUTURAS DE DADOS I Notas de Aula 1 SUMÁRIO 1. INTRODUÇÃO... 2 1.1 Array (vetores)... 2 2. BUSCA DE ELEMENTOS... 3 2.1 Busca Seqüencial... 3 2.2 Busca Binária... 3 2.3 Busca Indexada... 3 2.4 Busca Hash...

Leia mais

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2 FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO Projeto e Análise de Algoritmos II Lista de Exercícios 2 Prof. Osvaldo. 1. Desenvolva algoritmos para as operações abaixo e calcule a complexidade

Leia mais

AED Algoritmos e Estruturas de Dados LEEC /2007. Teoria de Grafos e Algoritmos em Grafos

AED Algoritmos e Estruturas de Dados LEEC /2007. Teoria de Grafos e Algoritmos em Grafos AED Algoritmos e Estruturas de Dados LEEC - 2006/2007 Teoria de Grafos e Algoritmos em Grafos Grafos - O que éum grafo? Objecto abstracto Dois tipos de entidades Nós ou Vértices Ramos ou Arestas Vértices

Leia mais

Planeamento de um Posto de Abastecimento de Combustível

Planeamento de um Posto de Abastecimento de Combustível Introdução aos Computadores e à Programação 2007/2008, 2º Semestre 1º Trabalho de OCTAVE Planeamento de um Posto de Abastecimento de Combustível 1. Introdução Pretende-se instalar um posto de abastecimento

Leia mais

Utilização do SOLVER do EXCEL

Utilização do SOLVER do EXCEL Utilização do SOLVER do EXCEL 1 Utilização do SOLVER do EXCEL José Fernando Oliveira DEEC FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO MAIO 1998 Para ilustrar a utilização do Solver na resolução de

Leia mais

Estruturas de Dados I

Estruturas de Dados I UFES - Curso de verão 2011 Estruturas de Dados I Profa. Juliana Pinheiro Campos jupcampos@gmail.com Árvores binárias de busca (ou São árvores projetadas para dar suporte a operações de busca de forma eficiente.

Leia mais

x0 = 1 x n = 3x n 1 x k x k 1 Quantas são as sequências com n letras, cada uma igual a a, b ou c, de modo que não há duas letras a seguidas?

x0 = 1 x n = 3x n 1 x k x k 1 Quantas são as sequências com n letras, cada uma igual a a, b ou c, de modo que não há duas letras a seguidas? Recorrências Muitas vezes não é possível resolver problemas de contagem diretamente combinando os princípios aditivo e multiplicativo. Para resolver esses problemas recorremos a outros recursos: as recursões

Leia mais

Complexidade de Algoritmos. Edson Prestes

Complexidade de Algoritmos. Edson Prestes Edson Prestes Idéias básicas Um algoritmo guloso seleciona, a cada passo, o melhor elemento pertencente a entrada. Verifica se ele é viável - vindo a fazer parte da solução ou não. Após uma seqüência de

Leia mais

Métodos Computacionais. Árvores

Métodos Computacionais. Árvores Métodos Computacionais Árvores Árvores Vetores e Listas são ótimos para representar estrutura de dados lineares, mas não para modelar dados hierárquicos Exemplos de dados hierárquicos: sistema de arquivos

Leia mais

INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15 INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15 1. Um número racional é expresso por dois inteiros: um numerador e um denominador (este último diferente de zero!). Implemente um TAD para representar números

Leia mais

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1 INF1007: Programação 2 10 Árvores Binárias (c) Dept. Informática - PUC-Rio 1 Tópicos Principais Introdução Árvores binárias Representação em C Ordens de percurso em árvores binárias Altura de uma árvore

Leia mais

Teoria dos Grafos. Edson Prestes

Teoria dos Grafos. Edson Prestes Edson Prestes Complemento de Grafos Mostre que para qualquer Grafo G com 6 pontos, G ou possui um triângulo Considere um vértice v de V(G). Sem perda de generalidade, podemos assumir v é adjacente a outros

Leia mais

Programação Concorrente em java - Exercícios Práticos Abril 2004

Programação Concorrente em java - Exercícios Práticos Abril 2004 Programação Concorrente em java - Exercícios Práticos Abril 2004 1. Introdução As threads correspondem a linhas de controlo independentes no âmbito de um mesmo processo. No caso da linguagem JAVA, é precisamente

Leia mais

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA Sistemas Operativos 2003/2004 Trabalho Prático #2 -- Programação em C com ponteiros -- Objectivos Familiarização

Leia mais

Algoritmos e Estruturas de Dados

Algoritmos e Estruturas de Dados Introdução aos Algoritmos e Estruturas de Dados 2 o Teste - A Ano lectivo: 2010/2011 2 o Semestre RESOLUÇÃO DO 2 o TESTE Grupo I (2.0 + 2.5 + 2.0 = 6.5 val.) I.a) Considere os tipos enum ocasiao e Presente

Leia mais

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º Pesquisa Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) Ficheiro (ou tabela) Campos Nome Endereço Telefone Antunes, João A. R. P. António Viera, 23 720456

Leia mais

PROGRAMAÇÃO DE UM MICROPROCESSADOR

PROGRAMAÇÃO DE UM MICROPROCESSADOR Relatório de Microprocessadores 2007/2008 Engenharia Física Tecnológica PROGRAMAÇÃO DE UM MICROPROCESSADOR EM C E ASSEMBLY PARA CONTROLO DE UM LED Laboratório I Trabalho realizado por: André Cunha, nº53757

Leia mais

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira Algoritmos e Estrutura de Dados Aula 7 Estrutura de Dados: Listas Prof. Tiago A. E. Ferreira Introdução Um das formas mais usadas para se manter dados agrupados é a lista Lista de compras, itens de estoque,

Leia mais

Análise e Complexidade de Algoritmos

Análise e Complexidade de Algoritmos Análise e Complexidade de Algoritmos Uma visão de Intratabilidade, Classes P e NP - redução polinomial - NP-completos e NP-difíceis Prof. Rodrigo Rocha prof.rodrigorocha@yahoo.com http://www.bolinhabolinha.com

Leia mais

Tabela de símbolos: tabelas de espalhamento

Tabela de símbolos: tabelas de espalhamento Tabela de símbolos: tabelas de espalhamento Marcelo K. Albertini 14 de Janeiro de 2014 2/28 Resumo de complexidades Análises para operação efetuada após N inserções pior caso caso médio keys chave get

Leia mais

Jogos vs. Problemas de Procura

Jogos vs. Problemas de Procura Jogos Capítulo 6 Jogos vs. Problemas de Procura Adversário imprevisível" necessidade de tomar em consideração todas os movimentos que podem ser tomados pelo adversário Pontuação com sinais opostos O que

Leia mais

Filas com prioridade - Introdução (1)

Filas com prioridade - Introdução (1) AED Algoritmos e Estruturas de Dados LEEC - 2004/2005 Filas com Prioridade Filas com prioridade - Introdução (1) Filas com prioridade (Priority Queues) usadas em diversas aplicações: Despacho (scheduler)

Leia mais

Estruturas de Dados Pilhas, Filas e Deques

Estruturas de Dados Pilhas, Filas e Deques Estruturas de Dados Pilhas, Filas e Deques Prof. Eduardo Alchieri Estruturas de Dados Pilhas Pilhas Lista LIFO (Last In, First Out) Os elementos são colocados na estrutura (pilha) e retirados em ordem

Leia mais

APROG - Civil. Excel. Técnicas de pesquisa de informação em tabelas. Instituto Superior de Engenharia do Porto 2000-2007

APROG - Civil. Excel. Técnicas de pesquisa de informação em tabelas. Instituto Superior de Engenharia do Porto 2000-2007 APROG - Civil Excel Técnicas de pesquisa de informação em tabelas Instituto Superior de Engenharia do Porto 2000-2007 Elaborado por: António Silva (DEI-ISEP) Pesquisa de Informação em Tabelas O Excel

Leia mais

Manual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco

Manual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco Departamento de Informática Curso de Engenharia Informática Disciplina de Projecto de Sistemas Industriais Ano Lectivo de 2005/2006

Leia mais

CAP 254 CAP 254. Otimização Combinatória. Professor: Dr. L.A.N. Lorena. Assunto: Metaheurísticas Antonio Augusto Chaves

CAP 254 CAP 254. Otimização Combinatória. Professor: Dr. L.A.N. Lorena. Assunto: Metaheurísticas Antonio Augusto Chaves CAP 254 CAP 254 Otimização Combinatória Professor: Dr. L.A.N. Lorena Assunto: Metaheurísticas Antonio Augusto Chaves Conteúdo C01 Simulated Annealing (20/11/07). C02 Busca Tabu (22/11/07). C03 Colônia

Leia mais

Pointer Jumping. odg(v) e idg(v): graus de saída e entrada do vértice v V. um vértice r tal que. O vértice r é dita raíz de T

Pointer Jumping. odg(v) e idg(v): graus de saída e entrada do vértice v V. um vértice r tal que. O vértice r é dita raíz de T Pointer Jumping T = (V,E) : árvore direcionada odg(v) e idg(v): graus de saída e entrada do vértice v V um vértice r tal que v V-{r}, odg(v) = 1, odg(r)=0 v V-{r}, um caminho de v a r O vértice r é dita

Leia mais

Pesquisa Sequencial e Binária

Pesquisa Sequencial e Binária Pesquisa Sequencial e Binária Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 Aula 20 Algoritmos e Estruturas de Dados I Pesquisa em Memória Primária Introdução - Conceitos Básicos Pesquisa Sequencial

Leia mais

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Algoritmos e Estruturas de Dados II. Trabalho Prático 2 Algoritmos e Estruturas de Dados II Entrega: 24/09/08 Devolução: 15/10/08 Trabalho individual Prof. Jussara Marques de Almeida Trabalho Prático 2 Você foi contratado pela XOL X Online para desenvolver

Leia mais

ÁRVORES BINÁRIAS DE PESQUISA

ÁRVORES BINÁRIAS DE PESQUISA ÁRVORES BINÁRIAS DE PESQUISA Árvores binárias de pesquisa são uma estrutura alternativa do tipo árvore binária, para guardar valores de tal forma que a recuperação dos mesmos pode ser efectuada de forma

Leia mais

1. Introdução... 1 1.1. Definição... 1 1.2. Conceitos relacionados... 2

1. Introdução... 1 1.1. Definição... 1 1.2. Conceitos relacionados... 2 Índice i Índice Capítulo 4 Estrutura de Dados não sequencial com armazenamento não sequencial ( Árvore ) 1. Introdução... 1 1.1. Definição... 1 1.2. Conceitos relacionados... 2 2. Árvores binárias... 2

Leia mais

Scale-Invariant Feature Transform

Scale-Invariant Feature Transform Scale-Invariant Feature Transform Renato Madureira de Farias renatomdf@gmail.com Prof. Ricardo Marroquim Relatório para Introdução ao Processamento de Imagens (COS756) Universidade Federal do Rio de Janeiro,

Leia mais

Curso: Redes II (Heterogênea e Convergente) Tema da Aula: Características Roteamento

Curso: Redes II (Heterogênea e Convergente) Tema da Aula: Características Roteamento Curso: Redes II (Heterogênea e Convergente) Tema da Aula: Características Roteamento Professor Rene - UNIP 1 Roteamento Dinâmico Perspectiva e histórico Os protocolos de roteamento dinâmico são usados

Leia mais

Modelo Cascata ou Clássico

Modelo Cascata ou Clássico Modelo Cascata ou Clássico INTRODUÇÃO O modelo clássico ou cascata, que também é conhecido por abordagem top-down, foi proposto por Royce em 1970. Até meados da década de 1980 foi o único modelo com aceitação

Leia mais

EAD Árvore - representação usando listas ligadas

EAD Árvore - representação usando listas ligadas 4.1. Definição É uma árvore binária em que os seus nodos têm associado uma chave, que - determina a sua posição de colocação na árvore e - obedece às seguintes regras: a chave de um nodo é - maior do que

Leia mais

Calculando distâncias

Calculando distâncias Calculando distâncias Problema: dados um digrafo G e um vértice s, determinar a distância de s aos demais vértices do digrafo Exemplo: para s = v 3 5 dist[v] 3 3 5 Algoritmos em Grafos º sem / Busca em

Leia mais

Regras dos Jogos da Exposição Matemática em Jogo. Alquerque

Regras dos Jogos da Exposição Matemática em Jogo. Alquerque Regras dos Jogos da Exposição Matemática em Jogo Alquerque (Regras de Afonso X) Colocam-se as peças no tabuleiro (em número de 7 ou 12 para cada jogador), como na figura. Os jogadores jogam alternadamente,

Leia mais

Exercícios Teóricos Resolvidos

Exercícios Teóricos Resolvidos Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Matemática Exercícios Teóricos Resolvidos O propósito deste texto é tentar mostrar aos alunos várias maneiras de raciocinar

Leia mais

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

Análise e Síntese de Algoritmos. Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25 Análise e Síntese de Algoritmos Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25 Contexto Algoritmos Elementares em Grafos (CLR, Cap. 22) BFS & DFS Ordenação Topológica & SCCs Árvores Abrangentes

Leia mais

Pesquisa em Memória Primária. Prof. Jonas Potros

Pesquisa em Memória Primária. Prof. Jonas Potros Pesquisa em Memória Primária Prof. Jonas Potros Pesquisa em Memoria Primária Estudo de como recuperar informação a partir de uma grande massa de informação previamente armazenada. A informação é dividida

Leia mais

Microsoft Access 2010. Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento

Microsoft Access 2010. Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento Microsoft Access 2010 Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento 1 Principais objetos do Access Tabelas Guardam a informação da BD (Base de Dados)

Leia mais

Busca em Espaço de Estados

Busca em Espaço de Estados Busca em Espaço de Estados Jomi Fred Hübner jomi@inf.furb.br FURB / BCC Introdução 2 Agente orientado a meta O projetista não determina um mapeamento entre percepções e ações, mas determina que objetivo

Leia mais

Tigris & Euphrates. Regras em Português

Tigris & Euphrates. Regras em Português Tigris & Euphrates Regras em Português Componentes do jogo 1 Tabuleiro 153 Peças de Civilização o 57 Vermelhas (Templos) o 36 Azuis (Quintas) o 30 Verdes (Mercados) o 30 Pretas (Colonizações) 8 Peças de

Leia mais

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012 Departamento de Engenharia Electrotécnica PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012 Mestrado Integrado em Engenharia Electrotécnica e de Computadores 1º ano 2º semestre Trabalho Final Reservas de viagens

Leia mais

CAP. I ERROS EM CÁLCULO NUMÉRICO

CAP. I ERROS EM CÁLCULO NUMÉRICO CAP. I ERROS EM CÁLCULO NUMÉRICO 0. Introdução Por método numérico entende-se um método para calcular a solução de um problema realizando apenas uma sequência finita de operações aritméticas. A obtenção

Leia mais

MRP II. Planejamento e Controle da Produção 3 professor Muris Lage Junior

MRP II. Planejamento e Controle da Produção 3 professor Muris Lage Junior MRP II Introdução A lógica de cálculo das necessidades é conhecida há muito tempo Porém só pode ser utilizada na prática em situações mais complexas a partir dos anos 60 A partir de meados da década de

Leia mais

Grafos Msc. Daniele Carvalho Oliveira. Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1

Grafos Msc. Daniele Carvalho Oliveira. Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1 Grafos Msc. Daniele Carvalho Oliveira Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1 Árvore Geradora Mínima 2 Porque é um problema interessante Suponha que queremos

Leia mais

Organização e Arquitetura de Computadores I

Organização e Arquitetura de Computadores I Organização e Arquitetura de Computadores I Aritmética Computacional Slide 1 Sumário Unidade Lógica e Aritmética Representação de Números Inteiros Aritmética de Números Inteiros Representação de Números

Leia mais

2ª Lista de Exercícios

2ª Lista de Exercícios Universidade Federal de Minas Gerais Departamento de Ciência da Computação Algoritmos e Estruturas de Dados II (Turmas M, N, W, F) 1º Semestre de 2012 Profs. Camilo Oliveira, Gisele Pappa, Ítalo Cunha,

Leia mais

FIGURA. 2.2 ECRÃ DE TRABALHO

FIGURA. 2.2 ECRÃ DE TRABALHO Noções Básicas FIGURA. 2.2 ECRÃ DE TRABALHO 2.2.1 Painel de Tarefas (Task Pane) O painel de tarefas constitui a grande novidade do ecrã de trabalho desta nova versão do Word. Para utilizadores menos experientes,

Leia mais

1. Ambiente de Trabalho

1. Ambiente de Trabalho 1 Ambiente de Trabalho 1. Ambiente de Trabalho Ao nível do ambiente de trabalho, depois de o Excel 2007 ter introduzido novos componentes (e.g., Botão Office e Friso) e eliminado alguns dos componentes

Leia mais

IBM1018 Física Básica II FFCLRP USP Prof. Antônio Roque Aula 6. O trabalho feito pela força para deslocar o corpo de a para b é dado por: = =

IBM1018 Física Básica II FFCLRP USP Prof. Antônio Roque Aula 6. O trabalho feito pela força para deslocar o corpo de a para b é dado por: = = Energia Potencial Elétrica Física I revisitada 1 Seja um corpo de massa m que se move em linha reta sob ação de uma força F que atua ao longo da linha. O trabalho feito pela força para deslocar o corpo

Leia mais

Sumário. Comunicação Multicast. Soluções. Multicast. Application-Level Multicast. October 20, 2008 Algoritmos Epidémicos

Sumário. Comunicação Multicast. Soluções. Multicast. Application-Level Multicast. October 20, 2008 Algoritmos Epidémicos Sumário Comunicação Multicast Multicast Application-Level Multicast October 20, 2008 Algoritmos Epidémicos Comunicação Multicast Soluções Multicast designa o envio duma mensagem para múltiplos destinatários.

Leia mais

Pesquisa em Memória Primária. Prof. Jonas Potros

Pesquisa em Memória Primária. Prof. Jonas Potros Pesquisa em Memória Primária Prof. Jonas Potros Procedimento para Inserir na Árvore Binária Critérios: Atingir um ponteiro nulo em um processo de pesquisa significa uma pesquisa sem sucesso. O ponteiro

Leia mais

Somatórias e produtórias

Somatórias e produtórias Capítulo 8 Somatórias e produtórias 8. Introdução Muitas quantidades importantes em matemática são definidas como a soma de uma quantidade variável de parcelas também variáveis, por exemplo a soma + +

Leia mais

Unidade VI. Validação e Verificação de Software Teste de Software. Conteúdo. Técnicas de Teste. Estratégias de Teste

Unidade VI. Validação e Verificação de Software Teste de Software. Conteúdo. Técnicas de Teste. Estratégias de Teste Unidade VI Validação e Verificação de Software Teste de Software Profa. Dra. Sandra Fabbri Conteúdo Técnicas de Teste Funcional Estrutural Baseada em Erros Estratégias de Teste Teste de Unidade Teste de

Leia mais

Representação de Dados

Representação de Dados Representação de Dados Introdução Todos sabemos que existem diferentes tipos de números: fraccionários, inteiros positivos e negativos, etc. Torna-se necessária a representação destes dados em sistema

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Pilhas A estrutura de dados Pilha emula a forma de organização de objetos intuitiva que é utilizada diariamente nos mais diversos contextos da vida humana. Containeres são empilhados e desempilhados diariamente

Leia mais