Você está na página 1de 21

ESTRUTURA DE DADOS

Mtodos de Ordenao Externa

Ordenao Externa
Ordenao: 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 ordenao Ordenao externa ou ordenao de arquivos:
O nmero de registros a serem ordenados usa mais memria interna do que a disponvel no computador

Os mtodos de ordenao externa so muito diferentes dos de ordenao interna

Ordenao Interna x Externa


Na ordenao externa deve-se levar em conta que os dados esto armazenados em unidades de memria externa, muito mais lentas Memrias externas (discos, fitas, etc) armazenam os dados como um arranjo seqencial: apenas 1 registro pode ser acessado por vez
Compare com o acesso aos elementos de uma estrutura do tipo vetor na memria...

Problemas na Ordenao Externa


1. Custo de acesso dos itens muito superior ao custo de processamento na memria interna:
Transferncia de dados entre memria externa e interna a parte principal do custo Fita s permite acesso aos itens de forma seqencial Discos podem acessar itens diretamente, mas com custo maior do que seqencialmente, inviabilizando o acesso direto Como boa parte do custo para a ordenao dependente do tempo de acesso memria externa, os mtodos podem se tornar dependentes de parmetros tecnolgicos

1. Acesso aos dados:


1. Mtodos dependem da tecnologia:

Ordenao Externa Eficiente


Buscar a minimizao do nmero de vezes que cada item transferido entre memria interna e externa Mtodo mais importante: FUSO (merge)
Fundir: combinar duas ou mais seqncias ordenadas para formar uma nica seqncia ordenada atravs da aplicao de repetidas selees entre os componentes acessveis em cada ocasio

A operao de fuso muito mais simples que a de ordenao e empregada como uma operao auxiliar no processo mais complexo de ordenao externa

Passos a seguir na Ordenao por Fuso ou Intercalao


1. Realizar uma leitura do arquivo e quebrar o arquivo em blocos de tamanho da memria interna disponvel; ordenar em seguida cada bloco na memria interna. 2. Fundir/intercalar os blocos ordenados aps vrias passadas sobre o arquivo; a cada passada blocos ordenados maiores so criados at que todo o arquivo esteja ordenado Eficincia:
Reduo do nmero de leituras do arquivo Reduo do nmero de vezes em que um item escrito ou lido na memria auxiliar

Fuso Direta [Wirth]


1. Dividir a seqncia a em duas metades, chamadas b ec 2. Fundir b e c por meio da combinao de elementos isolados para formarem pares ordenados 3. Denominar a a seqncia assim obtida e repetir os passos 1 e 2, desta vez efetuando a fuso de pares ordenados em qudruplas ordenadas 4. Iterar os passos anteriores, executando a fuso das qudruplas em ctuplas, e assim prosseguir duplicando o comprimento das subseqncias envolvidas no processo de fuso a cada vez, at que toda a seqncia esteja ordenada

Ordenao por Fuso (Merge)


Princpio:
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 seqencial aos dados 3. Trabalha bem com dados em lista encadeada

Desvantagens:
1. Exige espao extra: O(n)

Exemplo (Wirth, Cap 2)


Seja a seqncia inicial: 44 55 12 42 94 18 06 67 No passo 1, o particionamento produz as seqncias 44 55 12 42 94 18 06 67 A fuso dos componentes isolados (que so seqncias ordenadas de comprimento 1) em pares ordenados resulta em: 44 94 18 55 06 12 42 67 Divindo-se novamente a seqncia ao meio e efetuando-se a fuso: 06 12 44 94 18 42 55 67 Uma outra diviso seguida de fuso produz finalmente o resultado esperado: 06 12 18 42 44 55 67 94

Um pouco mais sobre a Fuso Direta


Cada operao que trata de uma s vez todo o conjunto de dados denominada fase O menor subprocesso que implementa o processo de ordenao propriamente dito atravs de repeties sucessivas chamado passo O exemplo anterior produz uma seqncia ordenada em 3 passos, cada qual consistindo de 1 fase de partio e de 1 fase de fuso Note que para que a ordenao seja efetuada, so necessrias 3 fitas (sries de dados)

Melhorando a Fuso Direta


O mtodo pode ser melhorado pela combinao das fases de particionamento e fuso:
Ao invs de se efetuar uma fuso para produzir uma seqncia nica, o resultado do processo de fuso imediatamente redistribudo em duas fitas as quais vo se tornar as fontes de dados que alimentaro o prximo passo...

Este mtodo chamado Fuso de Fase nica ou Fuso Balanceada


O mtodo tem desempenho superior ao anterior, mas o preo a pagar o uso de uma quarta fita...

Exemplo de Fuso 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 so lidos um aps outro (como numa fita magntica, por ex) Suponha ainda que a memria do computador s tem espao para 3 registros, e o nmero 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 sada 1. Para o exemplo so lidos os registros A S O e escrito o bloco A O S na fita 1 2. Em seguida, so lidos os registros R T I e escrito o bloco I R T na fita 2, e assim sucessivamente... 3 fitas so usadas em uma fuso de 3 caminhos...

Assim, a repetio dos passos 1 e 2 produz: fita 1: fita 2: fita 3: AOS I RT AGN DMN EGR GIN AEX LMP E

Segunda Parte
Na 2a. Parte, os blocos devem ser fusionados
1. O 1o. registro de cada uma das trs fitas lido para a memria interna, ocupando-a totalmente 2. O registro contendo a menor chave retirado e o prximo registro da mesma fita lido para a memria 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 sada, 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 so obtidos:

fita 4: fita 5: fita 6:

AAGINORST DEGGIMNNR AEELMPX

Aps mais uma fuso das fitas 4, 5 e 6 para as fitas 1, 2 e 3 finaliza a ordenao

MergeSort Externo
Executa em 2 etapas Etapa 1 Sort
Quebra-se o conjunto em parties tamanho da partio depende da disponibilidade de buffers em memria (nbuf = no de buffers disponveis) gera um arquivo temporrio ordenado para cada partio

Etapa 2 Merge de n iteraes


ordena um conjunto de temporrios a cada iterao gera um novo temporrio resultante da ordenao ordenao termina quando existir somente um temporrio que mantm a relao 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 =

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;

Ordenao por Mergesort


1 Vetor A i=1 i=2 i=3 i=4 i=5 i=6 i=7 2 3 4 5 6 7 8

O O

R R

D D E O

E R A N A A A O N R R R R

Outros mtodos
Captulo 2 do Wirth traz todos os mtodos, com anlises aprofundadas. Captulo 4 de Ziviani traz alguns mtodos com boas explicaes

Referncias do Curso
Transparncias disponibilizadas pelo Prof. Ziviani, a partir do Livro Projeto de Algoritmos com Implementao em Pascal e C, M. A. da Silva Bigonha e Nvio Ziviani, Campus Algoritmos e Estruturas de Dados, N. Wirth, Prentice-Hall

Você também pode gostar