Buscar

Organização de Arquivos - Processamento Co-sequencial (Parte 3)

Prévia do material em texto

Introduc¸a˜o a` Organizac¸a˜o de Arquivos: Aula 16
Departamento de Cieˆncia da Computac¸a˜o
Instituto de Cieˆncias Exatas
Universidade de Bras´ılia
1 / 40
Suma´rio
Processamento Co-sequencial
1 Descric¸a˜o de uma atividade de processamento, frequentemente utilizada, chamada
de processamento co-sequencial.
2 Apresentac¸a˜o de um modelo gene´rico para implementar todas as variac¸o˜es de
processamento co-sequencial.
3 Ilustrac¸a˜o do uso do modelo para resolver diferentes problemas de processamento
co-sequencial.
4 Apresentac¸a˜o do algoritmo “K-way merge” (intercalac¸a˜o mu´ltipla).
5 Apresentac¸a˜o do heapsort como uma abordagem para sorting em RAM.
6 Mostrar como merging (intercalac¸a˜o) fornece a base para ordenac¸a˜o de arquivos
grandes.
2 / 40
Ordenando Arquivos Grandes
Desvantagem
Depois de ordenar a chaves, existe um custo substancial de seeking para ler e
reescrever cada registro no arquivo novo.
O tamanho do arquivo e´ limitado pelo nu´mero de pares chave/ponteiro que pode ser
armazenado na RAM. Invia´vel para arquivo realmente grandes.
3 / 40
Ordenando Arquivos Grandes
Exemplo
Caracter´ısticas do arquivo a ser ordenado:
8.000.000 de registros.
Tamanho do registro: 100 bytes.
Tamanho da chave: 10 bytes.
Memo´ria dispon´ıvel para o trabalho: 10 MB (Sem contar memo´ria para manter o
programa, SO, buffer de I/O, etc.)
Tamanho total do arquivo: 800 MB.
Nu´mero total de bytes para todas as chaves: 80 MB.
Na˜o e´ possivel fazer Internal Sorting nem Keysorting!
Observac¸a˜o
Para facilitar as contas estamos utilizando o padra˜o do Sistema Internacional de
Unidades, onde 1 MB = 1000 KB = 1000000Bytes. (Sendo que o normal em sistemas de
computac¸a˜o e´ utilizar o padra˜o potencia de 2).
4 / 40
Ordenando Arquivos Grandes
Soluc¸a˜o
Soluc¸a˜o ⇒ Mergesort.
Criar sub-arquivos chamados “runs”:
Trazer o ma´ximo de registros poss´ıveis para a memo´ria.
Fazer o Internal Sorting e salvar num arquivo menor.
Repetir este processo ate´ que todos os registros do arquivo original tenham sido lidos.
Fazer o Multi-way Merge (Intercalac¸a˜o Mu´ltipla) dos arquivos ordenados.
5 / 40
Ordenando Arquivos Grandes
Exemplo
No exemplo em questa˜o, qual seria o tamanho de cada run?
Memo´ria dispon´ıvel = 10 MB = 10.000.000 bytes
Tamanho do registro = 100 bytes
Nu´mero de registros que cabem na memo´ria dispon´ıvel = 100.000 registros.
Se o nu´mero total de registros e´ 8.000.000, o nu´mero total de runs e´ = 80 runs.
6 / 40
Ordenando Arquivos Grandes
7 / 40
Ordenando Arquivos Grandes
Ordenando Arquivos Grandes
A soluc¸a˜o “criar runs” + “intercalac¸a˜o mu´ltipla” tem as seguintes caracter´ısticas:
Pode-se, de fato, ordenar arquivos grandes, e e´ extens´ıvel para arquivos de qualquer
tamanho. Leitura do arquivo input durante o passo de criac¸a˜o do run e´ sequencial.
A leitura do run durante o processo de merge e escrita dos reg ordenados tambe´m e´
sequencial.
Acesso randoˆmico e´ necessa´rio somente quando alternamos de um run para outro
durante o merge.
8 / 40
Ordenando Arquivos Grandes
Operac¸o˜es de I/O
Operac¸o˜es de I/O sa˜o realizadas 4 vezes:
Durante a fase do Sort:
1) Leitura de cada registro na memo´ria para ordenar e criar os runs.
2) Escrita dos runs ordenados no disco.
Durante a fase do Merge:
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
3) Escrita do arquivo ordenado no disco.
9 / 40
Ordenando Arquivos Grandes
1) Leitura de cada registro na memo´ria para ordenar e criar os runs.
2) Escrita dos runs ordenados no disco.
Os passos 1 e 2 sa˜o feitos da seguinte forma:
Leˆ blocos de 10MB e escreve blocos de 10MB.
Repete isto 80 vezes.
Em termos de operac¸o˜es ba´sicas em disco:
Para leitura: 80 seeks + tempo de transfereˆncia p/ 800MB
Para escrita: idem
10 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
3) Leitura dos runs ordenados na memo´ria para realizar o merge.
8.000.000 reg
ordenados
1° run = 80 blocos (80 acessos)
2° run = 80 blocos (80 acessos)
80° run = 80 blocos (80 acessos)
11 / 40
Ordenando Arquivos Grandes
Passo 3
O passo 3 e´ feito da seguinte forma:
Para minimizar o nu´mero de seeks, leia um bloco de cada run, ou seja, 80 blocos.
Uma vez que a memo´ria dispon´ıvel e´ 10MB cada bloco pode ter
10.000.000 bytes
80 blocos
= 125.000 bytes = 1.250 reg.
Quantos blocos sera˜o lidos para cada run?
Tamanho do run/tamanho do bloco = 10.000.000
125.000
= 80
Nu´mero total de seeks = nu´mero total de blocos.
Nu´mero total de blocos = nro runs × nro blocos por run.
80 runs × 80 blocos / run = 802 blocos = 6.400 seeks .
12 / 40
Ordenando Arquivos Grandes
4) Escrita do arquivo ordenado no disco.
Passo 4
Para escrever o arquivo ordenado no disco, o nu´mero de seeks depende do tamanho
do buffer de sa´ıda (output buffer): Bytes no arquivo / bytes no buffer de sa´ıda.
Observac¸a˜o
O passo 3 domina o tempo de execuc¸a˜o, ou seja, e´ o gargalo deste me´todo.
13 / 40
Ordenando Arquivos Grandes
Maneiras de reduzir o tempo do passo 3 (gargalo)
1) Alocar mais hardware
2) Realizar o merge em mais de um passo (reduz a ordem do merge e aumenta o
tamanho dos runs).
3) Aumentar algoritimicamente o tamanho de cada run.
4) Encontrar maneiras de sobrepor operac¸o˜es de I/O.
14 / 40
Ordenando Arquivos Grandes
1) Alocar mais Hardware
Aumentar a quantidade de memo´ria RAM:
Uma memo´ria maior significa menos e maiores runs na fase do sort, e menos seek
por run durante a fase do merge.
Aumentar o nu´mero de discos:
Se tive´ssemos dois discos dedicados para o merge, poder´ıamos designar um para
input e outro para output, portanto leitura e escrita poderia se sobrepor sempre que
ocorressem simultaneamente.
Aumentar o nu´mero de canais de I/O:
Se existir um canal de I/O para cada disco, I/O pode-se sobrepor completamente.
15 / 40
Ordenando Arquivos Grandes
2) Realizar o merge em mais de um passo
Uma das maneiras de reduzir seeking e´ reduzir o nu´mero de runs que no´s temos que
fazer o merge, portanto, dandopara cada run uma parcela maior do espac¸o
dispon´ıvel do buffer.
Multiple-step Merging: quebramos o conjunto original de runs em grupos menores
e fizemos o merge dos runs nestes grupos, separadamente.
Em cada um destes merges menores, mais espac¸o do buffer fica dispon´ıvel para
cada run, portanto menos seeks sa˜o necessa´rio por run.
16 / 40
Ordenando Arquivos Grandes
Figura: 5 conjuntos de 16 runs cada um ( = 80 runs)
17 / 40
Ordenando Arquivos Grandes
Multiple-step Merging
Temos menos seeks na primeira passada, mas ainda ha´ uma segunda passada.
Existe vantagem em ler cada registro duas vezes?
80-way merge original: 6.400 seeks.
Multiple-step merging:
Primeira passada:
nro total de seeks = nro total de blocos,
16 runs x 16 blocos/run = 162 blocos = 256 seeks.
5 conjuntos × 256 = 1280 seeks.
Segunda passada:
temos 5 runs finais, enta˜o 15 do espac¸o do buffer e´ alocado para cada run (Cabem 100.000
reg por vez na RAM, logo os blocos devem ser de 20.000 reg cada)
Cada run tem 8.000.0005 = 1.600.000 reg.
Para ler cada run precisamos 80 blocos. Portanto, na segunda passada temos 80 seeks × 5
= 400 seeks.
Total: 1280 + 400 = 1680 seeks.
18 / 40
Ordenando Arquivos Grandes
Multiple-step Merging
Encontramos uma maneira de aumentar o espac¸o dispon´ıvel no buffer para cada run.
Trocamos passadas extras sobre os dados por uma diminuic¸a˜o significativa no acesso
randoˆmico.
Se fizermos um merge em 3 passos, podemos obter resultados ainda melhores?
Talvez na˜o, pois temos que considerar o tempo de transmissa˜o dos dados. No
merge original, os dados eram transmitidos apenas 2 vezes, no merge com 2
passos, sa˜o 4 vezes.
19 / 40
Ordenando Arquivos Grandes
3) Aumentar Algoritimicamente o Tamanho de Cada Run
Se pudermos, de alguma maneira, aumentar o tamanho dos runs iniciais:
Diminu´ımos o trabalho necessa´rio durante a passo do merge, durante o processo de
ordenac¸a˜o:
Runs iniciais maiores, significam menos runs no total, e um merge de baixa ordem.
Consequentemente, buffers maiores, e menos seeks.
Sem a possibilidade de comprarmos o dobro de memo´ria, como podemos criar runs
iniciais que sejam duas vezes maiores do que o nu´mero de registros que no´s
podemos armazenar na RAM?
Replacement Selection
20 / 40
Ordenando Arquivos Grandes
Algoritmo 1 Replacement Selection
1: Leia uma colec¸a˜o de registros e ordene-os usando o heapsort. Isto cria uma heap de
valores ordenados. Chame esta heap de heap prima´ria.
2: while Existir registros na heap prima´ria do
3: Ao inve´s de escrever (output) toda a heap prima´ria ordenada (como fazemos num
heapsort normal), escreva (output) somente o registro cuja chave tem o menor valor.
4: Traga um novo valor e compare sua chave com aquela que acabara de ser escrita
5: if Se a nova chave tem uma valor maior then
6: insira o novo registro no local apropriado dentro da heap prima´ria juntamente
com os outros registros que esta˜o sendo selecionados para output.
7: else
8: Se a nova chave tem um valor menor, coloque aquele registro numa heap se-
cunda´ria de registros cujas chaves tem valores menores do que aquela chave que
ja´ foi escrita (output).
9: end if
10: if Se a heap prima´ria estiver vazia then
11: fac¸a a heap secunda´ria ser a heap prima´ria.
12: end if
13: end while
21 / 40
Ordenando Arquivos Grandes
Exemplo do Funcionamento do Replacement Selection
Input: 21, 67, 12, 5, 47, 16 ← frente da string de input.
Input remanescente Memo´ria (P=3) Output run
21, 67, 12 5 47 16 -
21, 67 12 47 16 5
21 67 47 16 12, 5
- 67 47 21 16, 12, 5
- 67 47 - 21, 16, 12, 5
- 67 - - 47, 21, 16, 12, 5
- - - - 67, 47, 21, 16, 12, 5
O processo produz uma lista de seis chaves usando apenas treˆs posic¸o˜es de memo´ria.
22 / 40
Ordenando Arquivos Grandes
“Replacement selection” Formando Dois Runs Ordenados
Input: 33, 18, 24, 58, 14, 17, 7, 21, 67, 12, 5, 47, 16 ← frente da string de input.
Input remanescente Memo´ria (P=3) Output run
33, 18, 24, 58, 14, 17, 7, 21, 67, 12 5 47 16 -
33, 18, 24, 58, 14, 17, 7, 21, 67 12 47 16 5
33, 18, 24, 58, 14, 17, 7, 21 67 47 16 12, 5
33, 18, 24, 58, 14, 17, 7 67 47 21 16, 12, 5
33, 18, 24, 58, 14, 17 67 47 (7) 21, 16, 12, 5
33, 18, 24, 58, 14 67 (17)(7) 47, 21, 16, 12, 5
33, 18, 24, 58 (14)(17)(7) 67, 47, 21, 16, 12, 5
1◦ run completo!
23 / 40
“Replacement selection” Formando Dois Runs Ordenados.
Comec¸a a construc¸a˜o do 2◦ run.
Input remanescente Memo´ria (P=3) Output run
33, 18, 24, 58 14 17 7 -
33, 18, 24 14 17 58 7
33, 18 24 17 58 14, 7
33 24 18 58 17, 14, 7
- 24 33 58 18, 17, 14, 7
- - 33 58 24, 18, 17, 14, 7
- - - 58 33, 24, 18, 17, 14, 7
- - - - 58, 33, 24, 18, 17, 14, 7
24 / 40
Ordenando Arquivos Grandes
Comparando
No procedimento anterior t´ınhamos:
Ler as chaves na memo´ria
Ordena´-las
Escrever (output) um run que e´ o tamanho do espac¸o em memo´ria dispon´ıvel para
esse procedimento.
No exemplo das 13 chaves, ter´ıamos 5 runs.
Com “replacement selection”, temos:
No exemplo das 13 chaves, temos apenas 2 runs utilizando o mesmo espac¸o de
memo´ria.
Utilizando o procedimento de “replacement selection” temos runs mais
longos, diminuindo assim o nu´mero total de runs necessa´rios.
25 / 40
Ordenando Arquivos Grandes
Utilizando Replacement Selection
Dadas P locac¸o˜es de memo´ria, qual o tamanho me´dio do run que o procedimento
produz?
Na me´dia podemos esperar um de tamanho igual a 2P .
Quais sa˜o os custos de se utilizar “Replacement Selection”?
Sabemos que o custo de buscar cada registro individualmente no disco e´ proibitivo.
Ao inve´s disto, temos que carregar um input num buffer, o que significa que na˜o
temos toda a memo´ria para a operac¸a˜o de “Replacement Selection”. Parte da
memo´ria tem que ser usada para os buffer de input e output.
Observac¸a˜o
Para obter mais eficieˆncia, podemos combinar:
Replacement Selection.
Multi-step Merge.
26 / 40
Ordenando Arquivos Grandes
Ferramentas para melhorar a performance do External Sorting
1) Para o sorting em RAM, podemos usar por exemplo o heapsort (com multibuffering)
formando as listas ordenadas de cada run.
2) Usar o ma´ximo de RAM poss´ıvel. Fazer os runs mais longos e proporcionar mais, ou
maiores, buffers durante a fase do merge.
3) Se o nro de runs iniciais e´ muito grande, usar um multi-step merge. Pode diminuir o
nro de seeks consideravelmente.
4) Considerar a utilizac¸a˜o de “replacement selection” para formar os runs iniciais,
especialmente se existe a possibilidade que os runs estejam parcialmente ordenados.
5) Usar mais do que um disco e canal de I/O de modo que leitura e escrita possam se
sobrepoˆr. Isto e´ especialmente verdade se na˜o existem outros usua´rios no sistema.
6) Ter em mente os elementos fundamentais para o External Sorting e seus custos.
Buscar maneiras de tirar vantagem de novas arquiteturas e sistemas, como
processamento paralelo e redes locais de alta velocidade.
27 / 40
Pro´xima Aula
Pro´xima Aula
A´rvores B.
28 / 40
Co´digos
Co´digos
Os co´digos foram retirados de File Structures: An Object-Oriented Approach with C ++, 3rd Edition e
apresentam a descric¸a˜o das principais classes.
Para a versa˜o escrita em C, consulte File Structures, 2nd Edition.
matching.cpp: Descreve o algoritmo de intersec¸a˜o (matching).
matchingClass.cpp: Classe que descreve os principais me´todos e membros necessa´rios para executarmos a
operac¸a˜o de matching.
stringListProcess: Subclasse que suporta listas, e suas operac¸o˜es, que sa˜o arquivos de strings,uma por linha.
merge.cpp: Descreve o algoritmo de unia˜o (merge).
masterTransactionProcess.cpp: Classe que descreve o processo de transac¸a˜o mestre.
postTransactions.cpp: Implementac¸a˜o dome´todo PostTransactions da classe MasterTransactionProcess.
processMaster.cpp: Implementac¸a˜o dos me´todos ProcessNewMaster, ProcessCurrentMaster e
ProcessEndMaster.
heap.cpp: Descreve uma Heap e o me´todo insert.
heapRemove.cpp: Descreve o me´todo remove para remover elemento de uma heap.
29 / 40
Co´digos
1 // c o s e q u e n t i a l match f u n c t i o n based on a s i n g l e d l oop
2
3 i n t Match ( char∗ List1Name , char∗ List2Name , char∗ OutputListName ) ;
4 {
5 i n t MoreItems ; // t r u e i f i t ems rema ins i n both o f the l i s t s
6 // i n i t i a l i z e i n pu t and output l i s t s
7 I n i t i a l i z e L i s t ( 1 , List1Name ) ; // i n i t i a l i z e L i s t 1
8 I n i t i a l i z e L i s t ( 2 , List2Name ) ; // i n i t i a l i z e L i s t 2
9 I n i t i a l z i e O u t p u t ( OutputListName ) ;
10
11 // get f i r s t i tem from both l i s t s
12 MoreItems = N e x t I t e m I n L i s t ( 1 ) && N e x t I t e m I n L i s t ( 2 ) ;
13 w h i l e ( MoreItems ){ // loop u n t i l no i t ems i n on o f the l i s t s
14 i f ( I tem ( 1 ) < I tem ( 2 ) ){
15 MoreItems = N e x t I t e m I n L i s t ( 1 ) ;
16 }
17 e l s e i f ( I tem (1)== Item ( 2 ) ){ // Item (1) == Item (2)
18 P r o c e s s I t e m ( 1 ) ; //match found
19 MoreItems = N e x t I t e m I n L i s t ( 1 ) && N e x t I t e m I n L i s t ( 2 ) ;
20 }
21 e l s e { // Item (1) > I tem (2)
22 MoreItems = N e x t I t e m I n L i s t ( 2 ) ;
23 }
24 }
25 F i n i s h U p ( ) ;
26 r e t u r n 1 ;
27 }
Co´digo 1: matching.cpp
30 / 40
Co´digos
1 //Main members and methods o f a g e n e r a l c l a s s f o r c o s e q u e n t i a l
2 // p r o c e s s i n g
3
4 template <c l a s s itemType>
5 c l a s s C o s e q u e n t i a l P r o c e s s
6 // base c l a s s f o r c o s e q u e n t i a l p r o c e s s i n g
7 {
8 p u b l i c :
9 // the f o l l o w i n g methods p r o v i d e b a s i c l i s t p r o c e s s i n g
10 // These must be d e f i n e d i n s u b c l a s s e s
11 v i r t u a l i n t I n i t i a l i z e L i s t ( i n t ListNumber , char∗ ListName )=0;
12 v i r t u a l i n t I n i t i a l i z e O u t p u t ( char∗ OutputListName )=0;
13 v i r t u a l i n t N e x t I t e m I n L i s t ( i n t ListNumber )=0;
14 // advance to next i tem i n t h i s l i s t
15 v i r t u a l ItemType Item ( i n t ListNumber ) = 0 ;
16 // r e t u r n c u r r e n t i tem from t h i s l i s t
17 v i r t u a l i n t P r o c e s s I t e m ( i n t ListNumber )=0;
18 // p r o c e s s the i tem i n t h i s l i s t
19 v i r t u a l i n t F i n i s h U p ()=0; // complete the p r o c e s s i n g
20
21 //2−way c o s e q u e n t i a l match method
22 v i r t u a l i n t M a t c h 2 L i s t s
23 ( char∗ List1Name , char∗ List2Name , char∗ OutputListName ) ;
24 } ;
Co´digo 2: matchingClass.cpp
31 / 40
Co´digos
1 //A s u b c l a s s to suppo r t l i s t s t ha t a r e f i l e s o f s t r i n g s , one pe r l i n e
2
3 c l a s s S t r i n g L i s t P r o c e s s : p u b l i c C o s e q u e n t i a l P r o c e s s<S t r i n g&>
4 // C l a s s to p r o c e s s l i s t s t ha t a r e f i l e s o f s t r i n g s
5 {
6 p u b l i c :
7 S t r i n g L i s t P r o c e s s ( i n t NumberOfLists ) ; // c o n s t r u c t o r
8 // Bas i c l i s t p r o c e s s i n g methods
9 i n t I n i t i a l i z e L i s t ( i n t ListNumber , char∗ ListName ) ;
10 i n t I n i t i a l i z e O u t p u t ( char∗ OutputListName ) ;
11 i n t N e x t I t e m I n L i s t ( i n t ListNumber ) ; // get nex t
12 S t r i n g& item ( i n t ListNumber ) ; // r e t u r n c u r r e n t
13 i n t P r o c e s s I t e m ( i n t ListNumber ) . // p r o c e s s the i tem
14 i n t F i n i s h U p ( ) ; // complete the p r o c e s s i n g
15 p r o t e c t e d :
16 i f s t r e a m ∗ L i s t ; // a r r a y o f l i s t f i l e s
17 S t r i n g ∗ I t e m s . // a r r a y o f c u r r e n t Item from each l i s t
18 o f s t r e a m O u t p u t L i s t ;
19 s t a t i c const char∗ LowValue ;
20 s t a t i c const char∗ HighValue ;
21 } ;
Co´digo 3: stringListProcess.cpp
32 / 40
Co´digos I
1 // Co s e qu en t i a l merge p rocedu r e based on s i n g l e l oop
2
3 template <c l a s s ItemType>
4
5 i n t C o s e q u e n t i a l P r o c e s s<ItemType > : : M e r g e 2 L i s t s
6 ( char∗ List1Name , char∗ List2Name , char∗ OutputListName )
7 {
8 i n t MoreItems1 , MoreItems2 ; // t r u e i f more i t ems i n l i s t
9 I n i t i a l i z e L i s t ( 1 , List1Name ) ;
10 I n i t i a l i z e L i s t ( 2 , List2Name ) ;
11 I n i t i a l i z e O u t p u t ( OutputListName ) ;
12 MoreItems1 = N e x t I t e m I n L i s t ( 1 ) ;
13 MoreItems2 = N e x t I t e m I n L i s t ( 2 ) ;
14
15 w h i l e ( MoreItems1 | | MoreItems2 ){ // i f e i t h e r f i l e has more
16 i f ( I tem ( 1 ) < I tem ( 2 ) ){ // l i s t 1 has nex t i tem to be p r o c e s s e d
17 P r o c e s s I t e m ( 1 ) ;
18 MoreItems1 = N e x t I t e m I n L i s t ( 1 ) ;
19 }
20 e l s e i f ( I tem (1)== Item ( 2 ) ){ // l i s t s have the same item , p r o c e s s
21 P r o c e s s I t e m ( 1 ) ; // from l i s t 1
22 MoreItems1 = N e x t I t e m I n L i s t ( 1 ) ;
23 MoreItems2 = N e x t I t e m I n L i s t ( 2 ) ;
24 }
25
26
27
33 / 40
Co´digos II
28 e l s e { // Item (1)> I tem (2)
29 P r o c e s s I t e m ( 2 ) ;
30 MoreItems2 = N e x t I t e m I n L i s t ( 2 ) ;
31 }
32 }
33 F i n i s h U p ( ) ;
34 r e t u r n 1 ;
35 }
Co´digo 4: merge.cpp
34 / 40
Co´digos
1 // C l a s s Mas t e rT ran s a c t i onP roc e s s
2
3 template <c l a s s ItemType>
4 c l a s s M a s t e r T r a n s a c t i o n P r o c e s s : p u b l i c C o s e q u e n t i a l P r o c e s s<itemType>
5 //a c o s e q u e n t i a l p r o c e s s t ha t s uppo r t s
6 //master / t r a n s a c t i o n p r o c e s s i n g
7 {
8 p u b l i c :
9 M a s t e r T r a n s a c t i o n P r o c e s s ( ) ; // c o n s t r u c t o r
10 v i r t u a l i n t ProcessNewMaster ( ) = 0 ;
11 // p r o c e s s i n g when new master r ead
12 v i r t u a l i n t P r o c e s s C u r r e n t M a s t e r ()=0;
13 // p r o c e s s i n g f o r each t r a n s a c t i o n f o r a master
14 v i r t u a l i n t ProcessEndMaster ()=0;
15 // p r o c e s s i n g a f t e r a l l t r a n s a c t i o n s f o r a master
16 v i r t u a l i n t P r o c e s s T r a n s a c t i o n E r r o r ()=0;
17 //no master f o r t r a n s a c t i o n
18 // c o s e q u e n t i a l p r o c e s s i n g o f master and t r a n s a c t i o n r e c o r d s
19 i n t P o s t T r a n s a c t i o n s ( char∗ MasterFi leName , char∗ T r a n s a c t i o n F i l e N a m e ,
20 char∗ OutputListName ) ;
21 } ;
Co´digo 5: masterTransactionProcess.cpp
35 / 40
Co´digos
1 //Three−way−t e s t l oop f o r method Po s tT r an s a c t i o n s o f c l a s s
2 //Mas t e rT ran s a c t i onP roc e s s
3
4 w h i l e ( MoreMasters | | M o r e T r a n s a c t i o n s )
5 i f ( I tem (1)< I tem ( 2 ) ){ // f i n i s h t h i s master r e c o r d
6 ProcessEndMaster ( ) ;
7 MoreMasters = N e x t I t e m I n L i s t ( 1 ) ;
8 i f ( MoreMasters ) ProcessNewMaster ( ) ;
9 }
10 e l s e i f ( I tem ( 1 ) == Item ( 2 ) ){ // t r a n s a c t i o n matches master
11 P r o c e s s C u r r e n t M a s t e r ( ) ; // ano the r t r a n s a c t i o n f o r master
12 P r o c e s s I t e m ( 2 ) ; // output t r a n s a c t i o n r e c o r d
13 M o r e T r a n s a c t i o n s = N e x t I t e m I n L i s t ( 2 ) ;
14 }
15 e l s e { // Item (1) > I tem (2) t r a n s a c t i o n wi th no master
16 P r o c e s s T r a n s a c t i o n E r r o r ( ) ;
17 M o r e T r a n s a c t i o n s = N e x t I t e m I n L i s t ( 2 ) ;
18 }
Co´digo 6: postTransactions.cpp
36 / 40
Co´digos
1 //Master r e c o r d p r o c e s s i n g f o r l e d g e r o b j e c t s
2
3 i n t L e d g e r P r o c e s s : : ProcessNewMaster ( )
4 { // p r in t the heade r and se tup l a s t month ’ s ba l ance
5 l e d g e r . P r i n t H e a d e r ( O u t p u t L i s t ) ;
6 l e d g e r . B a l a n c e s [ MonthNumber ] = l e d g e r . B a l a n c e s [ MonthNumber−1];
7 }
8
9 i n t L e d g e r P r o c e s s : : P r o c e s s C u r r e n t M a s t e r ( )
10 {// add the t r a n s a c t i o n amount to the ba l anc e f o r t h i s month
11 l e d g e r . B a l a n c e s [ MonthNumber]+= j o u r n a l . Amount ;
12 }
13
14 i n t L e d g e r P r o c e s s : : ProcessEndMaster ( )
15 { // p r i n t the ba l a n c e s l i n e to output
16 P r i n t B a l a n c e s ( O u t p u t L i s t , l e d g e r . B a l a n c e s [ MonthNumber−1] ,
17 l e d g e r . B a l a n c e s [ MonthNumber ] ) ;
18 }
Co´digo 7: processMaster.cpp
37 / 40
Co´digos I
1 // C l a s s Heap and Method In se r t
2 c l a s s Heap
3 {
4 p u b l i c :
5 Heap ( i n t maxElements ) ;
6 i n t I n s e r t ( char∗ newKey ) ;
7 char∗ Remove ( ) ;
8
9 p r o t e c t e d :
10 i n t MaxElements ; i n t NumElements ;
11 char∗∗ HeapArray ;
12 v o i d Exchange ( i n t i , i n t j ) ; // exchange e l ement i and j
13 i n t Compare ( i n t i , i n t j ){ // compare e l ement i and j
14 r e t u r n st rcmp ( HeapArray [ i ] , HeapArray [ j ] ) ;
15 }
16 } ;
17
18 i n t Heap : : I n s e r t ( char∗ newKey )
19 {
20 i f ( NumElements == MaxElements ) r e t u r n f a l s e ;
21 NumElements++; //add the new key at the l a s t p o s i t i o n
22 HeapArray [ NumElements ] = newKey ;
23 // re−o r d e r the heao
24 i n t k = NumElements ; i n t p a r e n t ;
25 w h i l e ( k>1) // k has a pa r en t
26 {
27 p a r e n t = k / 2 ;
38 / 40
Co´digos II
28 i f ( Compare ( k , p a r e n t )>=0) break ;
29 //HeapArray [ k ] i s i n the r i g h t p l a c e
30 // e l s e exchange k and pa r en t
31 Exchange ( k , p a r e n t ) ;
32 k = p a r e n t ;
33 }
34 r e t u r n t r u e ;
35 }
Co´digo 8: heap.cpp
39 / 40
Co´digos
1 //MethodRemove o f c l a s s Heap removes the sm a l l e s t e l ement and r e o r d e r s the heap
2 char∗ Heap : : Remove ( )
3 { // remove the sm a l l e s t e lement , r e o r d e r the heap
4 // and r e t u r n the sm a l l e s t e l ement
5 // put the sm a l l e s t v a l u e i n t o ’ v a l ’ f o r use i n r e t u r n
6 char∗ v a l = HeapArray [ 1 ] ;
7
8 // put the l a r g e s t v a l u e i n t o r oo t
9 HeapArray [ 1 ] = HeapArray [ NumElements ] ;
10 // d e c r e a s e the number o f e l ement s
11 NumElements−−;
12
13 // r e o r d e r the heap by exchang ing and moving down
14 i n t k=1; // node o f heap tha t c o n t a i n s the l a r g e s t v a l u e
15 i n t newK ; // node to exchange wi th l a r g e s t v a l u e
16 w h i l e (2∗k <= NumElements ) //k has at l e a s t one c h i l d
17 { // s e t newK to the i ndex o f sm a l l e s t c h i l d o f k
18 i f ( Compare (2∗k ,2∗ k+1)<0) newK=2∗k ;
19 e l s e newK = 2∗k+1;
20 //done i f k and newK are i n o r d e r
21 i f ( Compare ( k , newK)<0) break ; // i n o r d e r
22 Exchange ( k , newK ) ; //k and newK out o f o r d e r
23 k = newK ; // con t i nu e down the t r e e
24 }
25 r e t u r n v a l ;
26 }
Co´digo 9: heapRemove.cpp
40 / 40

Continue navegando