Você está na página 1de 50

A ordenao externa envolve arquivos

compostos por um nmero de registros que


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.

Você também pode gostar