ESTRUTURA DE DADOS
Métodos de Ordenação Externa
Ordenação Externa
• Ordenação: re-arranjar um conjunto de registros
em ordem ascendente ou descendente
• Os algoritmos sempre trabalham sobre os
registros de um arquivo, sendo que apenas parte
deste registro (a chave) é usada na ordenação
• Ordenação externa ou ordenação de arquivos:
– O número de registros a serem ordenados usa mais
memória interna do que a disponível no computador
• Os métodos de ordenação externa são muito
diferentes dos de ordenação interna
Ordenação Interna x Externa
• Na ordenação externa deve-se levar em conta
que os dados estão armazenados em unidades
de memória externa, muito mais lentas
• Memórias externas (discos, fitas, etc) armazenam
os dados como um arranjo seqüencial: apenas 1
registro pode ser acessado por vez
– Compare com o acesso aos elementos de uma estrutura
do tipo vetor na memória...
Problemas na Ordenação Externa
1. Custo de acesso dos itens é muito superior ao
custo de processamento na memória interna:
•
Transferência de dados entre memória externa e interna é
a parte principal do custo
2. Acesso aos dados:
•
•
Fita só permite acesso aos itens de forma seqüencial
Discos podem acessar itens diretamente, mas com custo
maior do que seqüencialmente, inviabilizando o acesso
direto
3. Métodos dependem da tecnologia:
•
Como boa parte do custo para a ordenação é dependente
do tempo de acesso à memória externa, os métodos
podem se tornar dependentes de parâmetros
tecnológicos
Ordenação Externa Eficiente
•
•
Buscar a minimização do número de vezes que
cada item é transferido entre memória interna e
externa
Método mais importante: FUSÃO (“merge”)
– Fundir: combinar duas ou mais seqüências ordenadas
para formar uma única seqüência ordenada através da
aplicação de repetidas seleções entre os componentes
acessíveis em cada ocasião
•
A operação de fusão é muito mais simples que a
de ordenação e é empregada como uma operação
auxiliar no processo mais complexo de ordenação
externa
Passos a seguir na Ordenação por
Fusão ou Intercalação
1. Realizar uma leitura do arquivo e quebrar o
arquivo em blocos de tamanho da memória
interna disponível; ordenar em seguida cada bloco
na memória interna.
2. Fundir/intercalar os blocos ordenados após várias
passadas sobre o arquivo; a cada passada blocos
ordenados maiores são criados até que todo o
arquivo esteja ordenado
• Eficiência:
– Redução do número de leituras do arquivo
– Redução do número de vezes em que um item é escrito
ou lido na memória auxiliar
Fusão Direta [Wirth]
1. Dividir a seqüência a em duas metades, chamadas
bec
2. Fundir b e c por meio da combinação de elementos
isolados para formarem pares ordenados
3. Denominar a a seqüência assim obtida e repetir os
passos 1 e 2, desta vez efetuando a fusão de pares
ordenados em quádruplas ordenadas
4. Iterar os passos anteriores, executando a fusão das
quádruplas em óctuplas, e assim prosseguir
duplicando o comprimento das subseqüências
envolvidas no processo de fusão a cada vez, até
que toda a seqüência esteja ordenada
Ordenação por Fusão (Merge)
•
Princípio:
1. Dividir o vetor (arquivo) em duas partes
2. Intercalar os vetores ordenados de maneira independente
•
Vantagens:
1. Pior caso: O(n log n)
2. Exige apenas acesso seqüencial aos dados
3. Trabalha bem com dados em lista encadeada
•
Desvantagens:
1. Exige espaço extra: O(n)
Exemplo (Wirth, Cap 2)
Seja a seqüência inicial:
44 55 12 42 94 18 06 67
No passo 1, o particionamento produz as seqüências
44 55 12 42
94 18 06 67
A fusão dos componentes isolados (que são seqüências ordenadas
de comprimento 1) em pares ordenados resulta em:
44 94 18 55 06 12 42 67
Divindo-se novamente a seqüência ao meio e efetuando-se a fusão:
06 12 44 94 18 42 55 67
Uma outra divisão seguida de fusão produz finalmente o resultado
esperado:
06 12 18 42 44 55 67 94
Um pouco mais sobre a Fusão Direta
• Cada operação que trata de uma só vez todo o
conjunto de dados é denominada fase
• O menor subprocesso que implementa o processo
de ordenação propriamente dito através de repetições sucessivas é chamado passo
• O exemplo anterior produz uma seqüência ordenada em 3 passos, cada qual consistindo de 1 fase de
partição e de 1 fase de fusão
• Note que para que a ordenação seja efetuada, são
necessárias 3 fitas (séries de dados)
Melhorando a Fusão Direta
• O método pode ser melhorado pela combinação
das fases de particionamento e fusão:
– Ao invés de se efetuar uma fusão para produzir uma
seqüência única, o resultado do processo de fusão é
imediatamente redistribuído em duas fitas as quais vão
se tornar as fontes de dados que alimentarão o próximo
passo...
• Este método é chamado Fusão de Fase Única ou
Fusão Balanceada
– O método tem desempenho superior ao anterior, mas o
preço a pagar é o uso de uma quarta fita...
Exemplo de Fusão Balanceada (Ziviani)
• Seja um arquivo composto pelos registros com
as seguintes chaves armazenado numa fita:
ASORTINGANDMERGINGEXAMPLE
• Os registros devem ser ordenados de acordo
com as chaves e re-inseridos na fita
• Os registros são lidos um após outro (como
numa fita magnética, por ex)
• Suponha ainda que a memória do computador só
tem espaço para 3 registros, e o número de
unidades de fita é 6.
Primeira Parte
•
Na 1a. Parte, o arquivo é lido de 3 em 3 registros
– Cada bloco de 3 registros é ordenado e escrito em uma
das fitas de saída
1. Para o exemplo são lidos os registros A S O e escrito o
bloco A O S na fita 1
2. Em seguida, são lidos os registros R T I e escrito o bloco I
R T na fita 2, e assim sucessivamente...
– 3 fitas são usadas em uma fusão de 3 caminhos...
•
Assim, a repetição dos passos 1 e 2 produz:
fita 1:
AOS
DMN
AEX
fita 2:
I RT
EGR
LMP
fita 3:
AGN
GIN
E
Segunda Parte
•
Na 2a. Parte, os blocos devem ser fusionados
1. O 1o. registro de cada uma das três fitas é lido para a
memória interna, ocupando-a totalmente
2. O registro contendo a menor chave é retirado e o próximo
registro da mesma fita é lido para a memória interna
3. O processo é repetido até a leitura de todos os registros
Segunda Parte
•
•
•
•
Quando o terceiro registro de uma fita é lido, aquela fita fica
“inativa” até que todas as outras fitas sejam lidas e escritas na
fita de saída, formando um bloco com 9 registros ordenados
Em seguida, o 2o. bloco de 3 registros de cada fita é lido para
formar outro bloco ordenado de 9 registros, que é escrito em
outra fita
Por fim, 3 novos blocos ordenados são obtidos:
fita 4:
AAG I N O R S T
fita 5:
DEGGIMNNR
fita 6:
AEELMPX
Após mais uma fusão das fitas 4, 5 e 6 para as fitas 1, 2 e 3
finaliza a ordenação
MergeSort Externo
• Executa em 2 etapas
• Etapa 1 – Sort
– Quebra-se o conjunto em partições
• tamanho da partição depende da disponibilidade de buffers em
memória (nbuf = no de buffers disponíveis)
• gera um arquivo temporário ordenado para cada partição
• Etapa 2 – Merge de “n” iterações
– ordena um conjunto de temporários a cada iteração
• gera um novo temporário resultante da ordenação
• ordenação termina quando existir somente um temporário que
mantém a relação inteira ordenada
Algoritmo do Mergesort
Mergesort(A,Esq,Dir);
if Esq < Dir then
m:= |(Esq+Dir) div 2|
Mergesort(A,Esq,m);
Mergesort(A,m+1,Dir);
Merge(A,Esq,m+1,Dir);
Nbuf =
1
Exemplo:
A = [O R D E N A R A]
[O] [R]
[D] [E]
[N] [A]
[R] [A]
[O R]
[D E]
[A N]
[A R]
[D E O R]
[A A N R]
[A A D E N O R R]
procedure Mergesort(var A:vetor; Esq,Dir: integer);
var i, j, k, m: integer;
begin
if Esq < Dir then begin
m:= (Esq+Dir) div 2;
Mergesort(A,Esq,m);
Mergesort(A,m+1,Dir);
for i:=m donwto Esq do
A[i]:=B[j];
for j:=m+1 to Dir do
B[Dir+m+1-j]:=A[j];
for k:=Esq to Dir do begin
if B[i] < B[j] then begin
A[k]:=B[i];
i:=i+1;
end
else begin
A[k]:=B[j];
j:=j-1;
end
end;
Ordenação por Mergesort
1
2
3
4
5
6
7
8
Vetor A
O
R
D
E
N
A
R
A
i=1
O
R
D
E
O
R
A
N
A
R
i=2
i=3
D
E
i=4
i=5
i=6
i=7
A
A
D
E
A
A
N
R
N
O
R
R
Outros métodos
• Capítulo 2 do Wirth traz todos os métodos, com
análises aprofundadas.
• Capítulo 4 de Ziviani traz alguns métodos com
boas explicações
Referências do Curso
• Transparências disponibilizadas pelo Prof.
Ziviani, a partir do Livro Projeto de Algoritmos
com Implementação em Pascal e C, M. A. da Silva
Bigonha e Nívio Ziviani, Campus
• Algoritmos e Estruturas de Dados, N. Wirth,
Prentice-Hall
Download

Métodos de Ordenação Externa