maior do que a memria interna do computador pode armazenar. Os mtodos de ordenao externa possuem Ordenao Externa Os mtodos de ordenao externa possuem particularidades que os diferenciam dos mtodos de ordenao interna. Em ambos os casos o problema o mesmo: rearranjar os registros de um arquivo em ordem ascendente ou descendente. Entretanto, na ordenao externa as estruturas de dados tm que levar em conta o fato de que os dados esto armazenados em unidades de memria externa, relativamente muito mais lentas do que a memria principal. Nas memrias externas, tais como fitas e Ordenao Externa Nas memrias externas, tais como fitas e discos magnticos, os dados so armazenados como um arquivo seqencial, onde apenas um registro pode ser acessado em um dado momento. Esta uma restrio forte se comparada com as possibilidades de acesso da estrutura de dados do tipo vetor. Existem trs importantes fatores que tornam os algoritmos para ordenao externa diferentes dos algoritmos para ordenao interna, sendo: 1. O custo para acessar um item algumas ordens de grandeza maior do que os custos de processamento na memria interna. Ordenao Externa processamento na memria interna. Custo principal o custo de transferir dados entre a memria interna e a memria externa. 2. Existem restries severas de acesso aos dados. (a) Itens armazenados em fita magntica s podem ser acessados de forma seqencial. (b) Itens armazenados em disco magntico podem ser acessados diretamente, mas a um custo maior do que o custo para acessar seqencialmente, o que contra-indica o uso do acesso direto. 3. O desenvolvimento de mtodos de ordenao Ordenao Externa 3. O desenvolvimento de mtodos de ordenao externa muito dependente do estado atual da tecnologia. A grande variedade de tipos de unidades de memria externa pode tornar os mtodos de ordenao externa dependentes de vrios parmetros que afetam seus desempenhos. Fatores associados eficincia dos Mtodos de Ordenao Externa: O aspecto sistema de computao deve ser considerado no mesmo nvel do aspecto algortmico. Ordenao Externa A grande nfase deve ser na minimizao do nmero de vezes que cada item transferido entre a memria interna e a memria externa. Cada transferncia deve ser realizada de forma to eficiente quanto as caractersticas dos equipamentos disponveis permitam. Mtodo de ordenao externa mais importante
Ordenao por Intercalao Ordenao por Intercalao
Como vimos anteriormente, intercalar significa combinar dois ou mais blocos ordenados em um Ordenao Externa combinar dois ou mais blocos ordenados em um nico bloco ordenado atravs de selees repetidas entre os itens disponveis em cada momento. A intercalao utilizada como uma operao auxiliar no processo de ordenao. Como veremos, a estratgia geral a mesma. Contudo, algumas particularidades existem na implementao da intercalao na memria externa: 1. realizada uma primeira passada sobre o arquivo, quebrando-o em blocos do tamanho da Ordenao Externa arquivo, quebrando-o em blocos do tamanho da memria interna disponvel. Cada bloco ento ordenado na memria interna. 2. Os blocos ordenados so intercalados, fazendo-se varias passadas sobre o arquivo. A cada passada so criados blocos ordenados cada vez maiores, at que todo o arquivo esteja ordenado. Os algoritmos para ordenao externa devem procurar reduzir o nmero de passadas sobre o arquivo. Os bons mtodos de ordenao geralmente envolvem no total menos do que 10 passadas sobre o arquivo. Ordenao Externa sobre o arquivo. Uma boa medida de complexidade de um algoritmo de ordenao por intercalao o nmero de vezes que um item lido ou escrito na memria auxiliar. Ordenao por Intercalao Mergesort Princpio: 1. Partir o arranjo em dois. 2. Intercalar dois arranjos independentes. Vantagens: Ordenao Externa 1. Pior caso: O (n log n) 2. S precisa de acesso seqencial aos dados. 3. Boa opo quando os dados esto em uma lista encadeada. Desvantagem: Espao de armazenamento adicional necessrio. Ordenao de Seqncias - Fuso (intercalao ou merge) Direta Corresponde a combinar duas ou mais seqncias ordenadas para formar uma nica seqncia ordenada atravs da aplicao de repetidas selees entre os componentes Ordenao Externa repetidas selees entre os componentes acessveis em cada ocasio. A operao de fuso muito mais simples que a de ordenao, sendo empregada, como operao auxiliar, no processo mais complexo de ordenao seqencial. Ordenao Externa O mtodo Merge Sort (intercalao direta) funciona da seguinte maneira: divida o arquivo em n sub-arquivos de tamanho 1 e intercale pares de arquivos adjacentes. Temos, ento, aproximadamente n/2 arquivos de tamanho 2. Repita esse processo at restar apenas um arquivo de tamanho n. Exemplo: As fases de particionamento no oferecem nenhuma contribuio ao processo de ordenao propriamente dito, uma vez que elas, de modo algum, efetuam a permutao de elementos. Estas operaes podem ser eliminadas, atravs da combinao da fase de particionamento com a de fuso. Ordenao Externa de fuso. Ao invs de se efetuar uma fuso para produzir uma seqncia nica, o resultado do processo de fuso imediatamente redistribudo em duas ou mais sequncias (fitas), as quais constituiro as fontes de dados que alimentaro o passo subseqente. Este mtodo chamado: Fuso de uma nica Fase ou Fuso Balanceada. Estudaremos agora o processo de Intercalao Balanceada de Vrios Caminhos, para tal consideraremos o processo de ordenao externa quando o arquivo a ser ordenado encontra-se armazenado em fita magntica. Exemplo: Considere um arquivo composto pelos registros Ordenao Externa Considere um arquivo composto pelos registros com as seguintes chaves: A S O R T I N G A N D M E R G I N G E X A M P L E Os 25 registros devem ser ordenados de acordo com as chaves e colocados em uma fita de sada. Neste caso os registros so lidos um aps o outro. Assuma que a memria interna do computador a ser utilizado s tem espao para 3 registros, e o nmero de unidades de fita magntica 6. Chaves: A S O R T I N G A N D M E R G I N G E X A M P L E Na 1 a etapa o arquivo lido de 3 em 3 registros. Ordenao Externa Na 1 etapa o arquivo lido de 3 em 3 registros. Cada bloco de 3 registros ordenado e escrito em uma das fitas de sada. Para o exemplo so lidos os registros: 1. A S O e escrito o bloco A O S na fita 1. 2. A seguir so lidos os registros R T I e escrito o bloco I R T na fita 2, e assim por diante, conforme mostra o exemplo a seguir. Chaves: A S O R T I N G A N D M E R G I N G E X A M P L E fita 1: A O S D M N A E X fita 2: I R T E G R L M P fita 3: A G N G I N E Observao: Quando 3 fitas so utilizadas Ordenao Externa Observao: Quando 3 fitas so utilizadas denomina-se intercalao-de-3-caminhos. Na 2 a etapa os blocos ordenados devem ser intercalados. 1. O 1 o registro de cada uma das 3 fitas lido para a memria interna, ocupando toda a memria interna. 2. O registro contendo a menor chave dentre as 3 retirado e colocado em uma fita de sada; e o prximo registro da fita que continha tal chave lido para a memria interna. 3. Repete-se o processo at que o 3 o registro de um dos blocos lido, o que faz com que a fita em Ordenao Externa um dos blocos lido, o que faz com que a fita em questo fique inativa at que o 3 o registro das outras fitas tambm sejam lidos e escritos na fita de sada, formando um bloco de 9 registros ordenados. A seguir o 2 o bloco de 3 registros de cada fita lido para formar outro bloco ordenado de 9 registros, o qual escrito em uma outra fita. Ao final 3 novos blocos ordenados so obtidos, conforme mostra o exemplo: Fitas obtidas na primeira etapa: fita 1: A O S D M N A E X fita 2: I R T E G R L M P fita 3: A G N G I N E Ordenao Externa Fitas gerada na segunda etapa: fita 4: A A G I N O R S T fita 5: D E G G I M N N R fita 6: A E E L M P X A seguir mais uma intercalao-de-3-caminhos das fitas 4, 5 e 6 para as fitas 1, 2 e 3 completa a ordenao. Consideraes sobre a Intercalao Se o arquivo exemplo tivesse um nmero maior de registros, ento vrios blocos ordenados de 9 registros seriam formados nas fitas 4, 5 e 6. Neste caso, a segunda passada produziria Ordenao Externa Neste caso, a segunda passada produziria blocos ordenados de 27 registros nas fitas 1, 2 e 3. A terceira passada produziria blocos ordenados de 81 registros nas fitas 4, 5 e 6, e assim sucessivamente, at obter-se um nico bloco ordenado. Neste ponto cabe a seguinte pergunta: quantas passadas so necessrias para ordenar um arquivo de tamanho arbitrrio? Considere um arquivo contendo n registros (neste caso cada registro contm apenas uma palavra) e uma memria interna de m palavras. Ordenao Externa palavra) e uma memria interna de m palavras. A passada inicial sobre o arquivo produz n/m blocos ordenados (se cada registro contiver k palavras, k > 1, ento teramos n/m/k blocos ordenados.) Seja P uma funo de complexidade tal que P(n) o nmero de passadas para a fase de intercalao dos blocos ordenados. Seja f o nmero de fitas utilizadas em cada passada. Ento, para uma intercalao-de-f-caminhos o Ordenao Externa Ento, para uma intercalao-de-f-caminhos o nmero de passadas : P(n) = log f (n/m) No exemplo anterior, temos n=25, m=3 e f=3. Logo, P(n) = log 3 (25/3) = 2 Grafos Os primeiros slides relacionados histrico dos grafos foram baseados nos slides do professor Jos Augusto Baranauskas do Departamento de Fsica e Matemtica FFCLRP-USP. Grafos A primeira evidncia sobre grafos remonta a 1736, quando Euler fez uso deles para solucionar o problema clssico das pontes de Koenigsberg; Na cidade de Koenigsberg (na Prssia Oriental), o rio Pregal flui em torno da ilha de Kneiphof, dividindo-se em seguida em duas partes; Assim sendo, existem quatro reas de terra que Grafos - Histrico Assim sendo, existem quatro reas de terra que ladeiam o rio: as reas de terra (A-D) esto interligadas por sete pontes (a-g); O problema das pontes de Koenigsberg consiste em determinar se, ao partir de alguma rea de terra, possvel atravessar todos as pontes exatamente uma vez, para, em seguida, retornar rea de terra inicial. possvel caminhar sobre cada ponte exatamente uma nica vez e retornar ao ponto de origem? Grafos - Histrico b Um caminho possvel consistiria em iniciar na rea de terra B, atravessar a ponte a para a ilha A; pegar a ponte e para chegar rea D, atravessar a ponte g, chegando a C; cruzar a ponte d at A; cruzar a ponte b at B e a ponte f, chegando a D. Grafos - Histrico b Esse caminho no atravessa todas as pontes uma vez, nem tampouco retorna rea inicial de terra B. Euler provou que no possvel o povo de Koenigsberg atravessar cada ponte exatamente Grafos - Histrico Koenigsberg atravessar cada ponte exatamente uma vez, retornando ao ponto inicial. Ele resolveu o problema, representando as reas de terra como vrtices e as pontes como arestas de um grafo (na realidade, um multigrafo). Um grafo consiste num conjunto de ns (ou vrtices) e num conjunto de arcos (ou arestas). Cada arco num grafo especificado por um par de ns. Grafos - Definies B D E G A A seqncia de ns {A,B,C,D,E,F,G,H},e o conjunto de arcos {(A,B), (A,D), (A,C), (C,D), (C,F), (E,G), (A,A)}. C D E G H F A Se os pares de ns que formam os arcos forem pares ordenados, diz-se que o grafo um grafo orientado (ou dgrafo). Exemplos: Grafos - Definies B C D E G A As setas entre os ns representam arcos. A ponta de cada seta representa o segundo n no par ordenado de ns que forma um arco, e o final de cada seta representa o primeiro n no par. O conjunto de arcos do grafo acima {<A,B>, <A,C>, <A,D>, <C,D>, <F,C>, <E,G>, <A,A>}. C H F Note que foram usados parnteses para indicar um par no-ordenado (desordenado) e chaves angulares para indicar um par ordenado. Concentraremos inicialmente nosso estudo nos dgrafos. Observe que, como vimos, um grafo no precisa ser uma rvore, mas uma rvore tem de ser um Grafos - Definies ser uma rvore, mas uma rvore tem de ser um grafo. Note tambm que um n no precisa ter arcos associados a ele (por exemplo, n H no grafo anterior). Um n n incide em um arco x se n for um de seus dois ns no par ordenado de ns que constituem x. (Dizemos tambm que x incide em n.) O grau de um n o nmero de arcos incidentes nesse n. O grau de entrada de um n n o nmero de arcos que tm n como cabea, e o grau de sada de n o nmero de arcos que tm n como terminao da seta. Por exemplo, o n C no grafo abaixo tem grau Grafos - Definies Por exemplo, o n C no grafo abaixo tem grau de entrada 2, grau de sada 1 e grau 3. B C D E G H F A Um n n ser adjacente a um n m se existir um arco de m at n. Se n for adjacente a m, n ser chamado sucessor de m e m ser um predecessor de n. Uma relao R num conjunto A uma seqncia de pares ordenados de elementos de A. Por exemplo, se A = {3, 5, 6, 8, 10, 17}, o conjunto Grafos - Definies Por exemplo, se A = {3, 5, 6, 8, 10, 17}, o conjunto R = {<3,10>, <5,6>, <5,8>, <6,17>, <8,17>, <10,17>} ser uma relao. Se <x, y> for um membro de uma relao R, diz-se que x est relacionado a y em R. A relao R anterior pode ser descrita dizendo-se que x est relacionado com y se x for menor que y e o resto obtido a partir da diviso de y por x for mpar. Uma relao pode ser representada por um grafo no qual os ns representam o conjunto bsico e os arcos representam os pares ordenados da relao. O grafo abaixo representa a relao anterior. Grafos - Definies 3 10 3 17 8 10 6 5 Um nmero pode ser associado a cada arco de um grafo, como no grafo abaixo. Grafos - Definies 3 17 8 10 5 1 7 1 5 3 1 Neste grafo, o nmero associado a cada arco o resto obtido da diviso do inteiro posicionado na cabea do arco pelo inteiro posicionado em sua terminao. Um grafo desse tipo, no qual existe um nmero associado a cada arco, chamado grafo ponderado ou rede. O nmero associado a um arco chamado peso. 6 5 Identificaremos vrias operaes primitivas que sero teis ao lidar com grafos. A operao ligar(a,b) introduz um arco do n a at o n b se ainda no existir um; ligarComPeso(a,b,x) insere um arco de a at b com peso x num grafo ponderado; remover(a,b) e removerComPeso (a,b,x) eliminam um arco de a at b, caso exista Grafos - Definies (a,b,x) eliminam um arco de a at b, caso exista (removerComPeso define tambm x com seu peso). Embora possamos tambm acrescentar ou eliminar ns de um grafo, discutiremos essas possibilidades posteriormente. A funo adjacente(a,b) retorna true se b for adjacente a a, e false, caso contrrio. Um caminho de comprimento k do n a ao n b definido como uma seqncia de k + 1 ns n1, n2,..., nk + 1, tal que n1 = a, nk + 1 = b e adjacente(ni, ni + i) true para todo i entre 1 e k. Se, para algum inteiro k, existir um caminho de comprimento k entre a e b, existir um caminho de a at b. Grafos - Definies de a at b. Um caminho de um n para si mesmo chamado ciclo. Se um grafo contiver um ciclo, ele ser cclico; caso contrrio, ser acclico. Um grafo acclico orientado chamado dag, uma aglutinao das iniciais de directed acyclic graph. Uma anlise do grafo abaixo possibilita perceber a existncia de: Grafos - Definies H G C B um caminho de comprimento 1 de A at C; dois caminhos de comprimento 2 de B at G; e um caminho de comprimento 3 de A at F. Note que no existe um caminho de B at C. Existem ciclos de B para B, de F para F e de H para H. D F A E Com base no que foi exposto e considerando que o nmero de ns no grafo seja constante, ou seja, os arcos podem ser acrescentados ou eliminados, mas os ns no. Que estrutura poderia ser utilizada para sua representao? Grafos - Representao Um vetor bidimensional. Se considerarmos que os ns de um grafo sero numerados de 0 a MAXNODES - 1 e nenhuma informao atribuda (associada) a eles. Alm disso, tambm consideraremos a existncia de arcos sem a associao de pesos ou outras informaes aos mesmos. Nesse caso, o grafo poderia ser declarado simplesmente por: #define MAXNODES valorInteiroPositivo int adj[MAXNODES][MAXNODES]; Grafos - Representao int adj[MAXNODES][MAXNODES]; O valor de adj[i][j] TRUE ou FALSE, dependendo de o n j ser ou no adjacente ao n i. O vetor bidimensional adj[ ][ ] chamado matriz de adjacncia. Seguindo esta linha de raciocnio, podemos vislumbrar uma representao mais completa para um grafo, como sendo: #define MAXNODES valorInteiroPositivo struct node { /* informacao associada a cada noh */ }; Grafos - Representao }; struct arc { int adj; /* informacao associada a cada arco */ }; struct graph { struct node nodes[MAXNODES]; struct arc arcs[MAXNODES][MAXNODES]; }; struct graph g; Onde, assim como na representao anterior, cada n do grafo representado por um inteiro entre 0 e MAXNODES - 1, e o campo vetor nodes representa as informaes corretas associadas a cada n. O campo vetor arcs um vetor bidimensional representando todo possvel par ordenado de ns. O valor de g.arcs[i][j].adj Grafos - Representao ordenado de ns. O valor de g.arcs[i][j].adj TRUE ou FALSE, dependendo de o n j ser ou no adjacente ao n i. Neste caso, o vetor bidimensional g.arcs[][].adj a matriz de adjacncia. No caso de um grafo ponderado, cada arco poder tambm receber a atribuio de informaes. Considerando a representao de um grafo apenas pela matriz de adjacncia, ou seja, onde no sero atribudos pesos e outras informao arestas e nem informaes ao ns. Implemente a operao ligar(a,b). void ligar (int adj[][MAXNODES], int node1, int Grafos - Representao void ligar (int adj[][MAXNODES], int node1, int node2) { adj[node1][node2] = 1; } Considerando a representao de um grafo em questo. Implemente a operao remover (a,b). void remover (int adj[][MAXNODES], int node1, int node2) { Grafos - Representao { adj[node1][node2] = 0; } Considerando a representao de um grafo em questo. Implemente a operao adjacente (a,b). int adjacente (int adj[][MAXNODES], int node1, int node2) { Grafos - Representao { return adj[node1][node2]; } Proponha uma estrutura capaz de representar um grafo ponderado com um nmero fixo de ns. #define MAXNODES valorInteiroPositivo struct arc { int adj; Grafos - Representao int adj; int peso; }; struct arc g[MAXNODES][MAXNODES]; Considerando a representao para um grafo ponderado apresentada, implemente a operao ligarP(...). void ligarP (struct arc adj[][MAXNODES], int node1, int node2, int peso) Grafos - Representao int node1, int node2, int peso) { adj[node1][node2].adj = 1; adj[node1][node2].peso = peso; } Considerando a representao para um grafo ponderado apresentada, implemente a operao removerP(...). void removerP (struct arc adj[][MAXNODES], int node1, int node2, int peso) Grafos - Representao int node1, int node2, int peso) { adj[node1][node2].adj = 0; adj[node1][node2].peso = peso; } Considerando a representao para um grafo ponderado apresentada, implemente a operao adjacenteP(...). void adjacenteP (struct arc adj[][MAXNODES], int node1, int node2) Grafos - Representao int node1, int node2) { return adj[node1][node2].adj; } Examinaremos agora um exemplo de aplicao de um grafo. Vamos supor o seguinte problema: Considerando a existncia de n cidades. Considerando que alguns pares destas cidades possuem estradas que as ligam. Determine se possvel sair de uma cidade A e chegar em uma Grafos - Aplicao possvel sair de uma cidade A e chegar em uma cidade B utilizando exatamente nr estradas. Determine uma estratgia para solucionar o problema apresentado. Uma estratgia para a soluo a seguinte: crie um grafo com as cidades como ns e as estradas como arcos. Para achar um caminho de comprimento nr do n A ao n B, procure um n C de modo que exista um arco de A at C e um caminho de comprimento nr - 1 de C at B. Se essas condies forem atendidas para um n C, o Grafos - Aplicao essas condies forem atendidas para um n C, o caminho desejado existir; se elas no forem atendidas para qualquer n C, o caminho no existir. O algoritmo usar uma funo recursiva auxiliar, procurarCaminho(k,a,b). Essa funo retornar true se existir um segmento de comprimento k de A at B, e false, caso contrrio. Implemente na linguagem C a funo procurarCaminho(...). procurarCaminho(int k, int a, int b) { if (k == 1) return (adjacente (a, b)); Grafos - Aplicao return (adjacente (a, b)); for (c = 0; c < n; ++c) if (adjacente(a,c) && procurarCaminho (k - 1, c, b)) return(1); return(0); } Visando possibilitar o teste da funo apresentada implemente, na linguagem C, uma funo main(), que receba uma linha de entrada contendo quatro inteiros seguidos por um nmero qualquer de linhas de entrada com dois inteiros cada uma. O primeiro inteiro na primeira linha, n, representa um nmero de cidades, que, para simplificar, sero numeradas de 0 a n - 1. O segundo e o terceiro inteiro nessa linha esto entre 0 e n - 1 e representam duas cidades. Queremos sair da primeira Grafos - Aplicao representam duas cidades. Queremos sair da primeira cidade para a segunda usando exatamente nr estradas, onde nr o quarto inteiro na primeira linha de entrada. Cada linha de entrada subsequente contm dois inteiros representando duas cidades, indicando que existe uma estrada da primeira cidade at a segunda. A ltima linha na sequncia conter dois valores inteiros negativos. O problema determinar se existe um percurso do tamanho solicitado pelo qual se possa viajar da primeira cidade para a segunda.