Vous êtes sur la page 1sur 51

Pesquisa em Memria Secundria

ltima alterao: 31 de Agosto de 2010

Transparncias elaboradas por Wagner Meira Jr, Flvia Peligrinelli Ribeiro, Israel Guerra, Nvio Ziviani e Charles Ornelas
Almeida
Projeto de Algoritmos Cap.1 Introduo 1
Contedo do Captulo
6.1 Modelo de Computao para Memria Secundria
6.1.1 Memria Virtual
6.1.2 Implementao de um Sistema de Paginao
6.2 Acesso Sequencial Indexado
6.2.1 Discos pticos de Apenas-Leitura
6.3 rvores de Pesquisa
6.3.1 rvores B
6.3.2 rvores B

6.3.3 Acesso Concorrente em rvores B

6.3.4 Consideraes Prticas


Projeto de Algoritmos Cap.1 Introduo 2
Introduo
Pesquisa em memria secundria: arquivos contm mais registros do que
a memria interna pode armazenar.
Custo para acessar um registro algumas ordens de grandeza maior do que
o custo de processamento na memria primria.
Medida de complexidade: custo de trasferir dados entre a memria principal
e secundria (minimizar o nmero de transferncias).
Memrias secundrias: apenas um registro pode ser acessado em um dado
momento (acesso seqencial).
Memrias primrias: acesso a qualquer registro de um arquivo a um custo
uniforme (acesso direto).
O aspecto sistema de computao importante.
As caractersticas da arquitetura e do sistema operacional da mquina
tornam os mtodos de pesquisa dependentes de parmetros que afetam
seus desempenhos.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1 3
Modelo de Computao para Memria Secundria -
Memria Virtual
Normalmente implementado como uma funo do sistema
operacional.
Modelo de armazenamento em dois nveis, devido necessidade de
grandes quantidades de memria e o alto custo da memria principal.
Uso de uma pequena quantidade de memria principal e uma grande
quantidade de memria secundria.
Programador pode enderear grandes quantidades de dados,
deixando para o sistema a responsabilidade de trasferir o dado da
memria secundria para a principal.
Boa estratgia para algoritmos com pequena localidade de referncia.
Organizao do uxo entre a memria principal e secundria
extremamente importante.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 4
Memria Virtual
Organizao de uxo transformar o endereo usado pelo
programador na localizao fsica de memria correspondente.
Espao de Endereamento endereos usados pelo programador.
Espao de Memria localizaes de memria no computador.
O espao de endereamento N e o espao de memria M podem ser
vistos como um mapeamento de endereos do tipo: f : N M.
O mapeamento permite ao programador usar um espao de
endereamento que pode ser maior que o espao de memria
primria disponvel.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 5
Memria Virtual: Sistema de Paginao
O espao de endereamento dividido em pginas de tamanho igual,
em geral, mltiplos de 512 Kbytes.
A memria principal dividida em molduras de pginas de tamanho
igual.
As molduras de pginas contm algumas pginas ativas enquanto o
restante das pginas esto residentes em memria secundria
(pginas inativas).
O mecanismo possui duas funes:
1. Mapeamento de endereos determinar qual pgina um
programa est endereando, encontrar a moldura, se existir, que
contenha a pgina.
2. Transferncia de pginas transferir pginas da memria
secundria para a memria primria e transfer-las de volta para a
memria secundria quando no esto mais sendo utilizadas.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 6
Memria Virtual: Sistema de Paginao
Endereamento da pgina uma parte dos bits interpretada como
um nmero de pgina e a outra parte como o nmero do byte dentro
da pgina (offset).
Mapeamento de endereos realizado atravs de uma Tabela de
Pginas.
a p-sima entrada contm a localizao p

da Moldura de Pgina
contendo a pgina nmero p desde que esteja na memria
principal.
O mapeamento de endereos : f(e) = f(p, b) = p

+ b, onde e o
endereo do programa, p o nmero da pgina e b o nmero do byte.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 7
Memria Virtual: Mapeamento de Endereos
p
p +b
Tabela_de_Pginas Pgina p
N

da
pgina
N

do
byte
Endereo
de
programa
p b
p = nil pgina no
presente na
memria

Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 8


Memria Virtual: Reposio de Pginas
Se no houver uma moldura de pgina vazia uma pgina dever
ser removida da memria principal.
Ideal remover a pgina que no ser referenciada pelo perodo de
tempo mais longo no futuro.
tentamos inferir o futuro a partir do comportamento passado.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 9
Memria Virtual: Polticas de Reposio de Pginas
Menos Recentemente Utilizada (LRU):
um dos algoritmos mais utilizados,
remove a pgina menos recentemente utilizada,
parte do princpio que o comportamento futuro deve seguir o
passado recente.
Menos Freqentemente Utilizada (LFU):
remove a pgina menos feqentemente utilizada,
inconveniente: uma pgina recentemente trazida da memria
secundria tem um baixo nmero de acessos e pode ser removida.
Ordem de Chegada (FIFO):
remove a pgina que est residente h mais tempo,
algoritmo mais simples e barato de manter,
desvantagem: ignora o fato de que a pgina mais antiga pode ser a
mais referenciada.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 10
Memria Virtual: Poltica LRU
Fim

Incio

Pgina p

`
.
.
.
.

Toda vez que uma p-


gina utilizada ela
removida para o m da
la.
A pgina que est no
incio da la a pgina
LRU.
Quando uma nova p-
gina trazida da me-
mria secundria ela
deve ser colocada na
moldura que contm a
pgina LRU.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 11
Memria Virtual: Estrutura de Dados
const TAMANHODAPAGINA = 512;
ITENSPORPAGINA = 64; { TamanhodaPagina/TamanhodoItem }
type Registro = record
Chave: TipoChave;
{ outros componentes }
end;
TipoEndereco = record
p: integer ;
b: 1. . ITENSPORPAGINA;
end;
TipoItem = record
Reg: TipoRegistro;
Esq, Dir : TipoEndereco;
end;
TipoPagina = array [ 1. . ITENSPORPAGINA] of TipoItem;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 12
Memria Virtual
Em casos em que precisamos manipular mais de um arquivo ao
mesmo tempo:
A tabela de pginas para cada arquivo pode ser declarada
separadamente.
A la de molduras nica cada moldura deve ter indicado o
arquivo a que se refere aquela pgina.
type TipoPagina = record
case byte of
0 : (Pa : TipoPaginaA) ;
1 : (Pb : TipoPaginaB) ;
2 : (Pc : TipoPaginaC) ;
end;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 13
Memria Virtual
Procedimentos para comunicao com o sistema de paginao:
ObtemRegistro torna disponvel um registro.
EscreveRegistro permite criar ou alterar o contedo de um
registro.
DescarregaPaginas varre a la de molduras para atualizar na
memria secundria todas as pginas que tenham sido
modicadas.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 14
Memria Virtual - Transformao do Endereo Virtual para
Real
P2
Determina
endereo
real
P4
Recupera pgina
da memria
secundria
A1
Tabela
de
pginas
A3
Memria
secundria
Programa
Usurio
A2
Fila
de
molduras
P5
Grava pgina
na memria
secundria
P1
Consulta
tabela de
pginas
P3
Determina
moldura
para pgina

?
6
6
?

6
6
-
-
?
-

p
p
p
p
p
Pgina
p
p
p
Pgina
p
p
p
p
p
Pgina
p
Quadrados resulta-
dos de processos ou ar-
quivos.
Retngulos proces-
sos transformadores de
informao.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.2 15
Acesso Seqencial Indexado
Utiliza o princpio da pesquisa seqencial cada registro lido
seqencialmente at encontrar uma chave maior ou igual a chave de
pesquisa.
Providncias necessrias para aumentar a ecincia:
o arquivo deve ser mantido ordenado pelo campo chave do registro,
um arquivo de ndices contendo pares de valores < x, p > deve ser
criado, onde x representa uma chave e p representa o endereo da
pgina na qual o primeiro registro contm a chave x.
Estrutura de um arquivo seqencial indexado para um conjunto de
15 registros:
3 14 25 41
1 2 3 4
3 5 7 11 1 14 17 20 21 2 25 29 32 36 3 41 44 48 4
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.2 16
Acesso Seqencial Indexado: Disco Magntico
Dividido em crculos concntricos (trilhas).
Cilindro todas as trilhas verticalmente alinhadas e que possuem o
mesmo dimetro.
Latncia rotacional tempo necessrio para que o incio do bloco
contendo o registro a ser lido passe pela cabea de leitura/gravao.
Tempo de busca (seek time) tempo necessrio para que o
mecanismo de acesso desloque de uma trilha para outra (maior parte
do custo para acessar dados).
Acesso seqencial indexado = acesso indexado + organizao
seqencial,
Aproveitando caractersticas do disco magntico e procurando
minimizar o nmero de deslocamentos do mecanismo de acesso
esquema de ndices de cilindros e de pginas.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.2 17
Acesso Seqencial Indexado: Discos ticos de
Apenas-Leitura (CD-ROM)
Grande capacidade de armazenamento (600 MB) e baixo custo.
Informao armazenada esttica.
A ecincia na recuperao dos dados afetada pela localizao dos dados
no disco e pela seqncia com que so acessados.
Velocidade linear constante trilhas possuem capacidade varivel e tempo
de latncia rotacional varia de trilha para trilha.
A trilha tem forma de uma espiral contnua.
Tempo de busca: acesso a trilhas mais distantes demanda mais tempo que
no disco magntico. H necessidade de deslocamento do mecanismo de
acesso e mudanas na rotao do disco.
Varredura esttica: acessa conjunto de trilhas vizinhas sem deslocar
mecanismo de leitura.
Estrutura seqencial implementada mantendo-se um ndice de cilindros na
memria principal.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 18
rvores B
rvores n-rias: mais de um registro por nodo.
Em uma rvore B de ordem m:
pgina raiz: 1 e 2m registros.
demais pginas: no mnimo m registros e m + 1 descendentes e no
mximo 2m registros e 2m + 1 descendentes.
pginas folhas: aparecem todas no mesmo nvel.
Registros em ordem crescente da esquerda para a direita.
Extenso natural da rvore binria de pesquisa.
rvore B de ordem m = 2 com trs nveis:

30

10 20

40 50

3 4 8 9 11 13 17 25 28 33 36 43 45 48 52 55
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 19
rvores B - TAD Dicionrio
Estrutura de Dados:
type TipoRegistro = record
Chave: TipoChave;
{ outros componentes}
end;
TipoApontador = ^TipoPagina;
TipoPagina = record
n: 0. . mm;
r : array [ 1. . mm] of TipoRegistro;
p: array [ 0. . mm] of TipoApontador
end;
TipoDicionario = TipoApontador;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 20
rvores B - TAD Dicionrio
Operaes:
Inicializa
procedure I ni ci al i za ( var Dicionario : TipoDicionario) ;
begin
Dicionario : = ni l ;
end; { I ni ci al i za }
Pesquisa
Insere
Remove
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 21
rvores B - Pesquisa
procedure Pesquisa ( var x: TipoRegistro; Ap: TipoApontador ) ;
var i : Integer ;
begin
i f Ap = ni l
then writeln ( Registro nao esta presente na arvore )
else with Ap^ do
begin
i : = 1;
while ( i < n) and ( x.Chave > r [ i ] .Chave) do i : = i + 1;
i f x.Chave = r [ i ] .Chave
then x : = r [ i ]
else i f x.Chave < r [ i ] .Chave
then Pesquisa ( x, p[ i 1])
else Pesquisa ( x, p[ i ] )
end;
end; { Pesquisa }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 22
rvores B - Insero
1. Localizar a pgina apropriada aonde o regisro deve ser inserido.
2. Se o registro a ser inserido encontra uma pgina com menos de 2m
registros, o processo de insero ca limitado pgina.
3. Se o registro a ser inserido encontra uma pgina cheia, criada uma
nova pgina, no caso da pgina pai estar cheia o processo de diviso
se propaga.
Exemplo: Inserindo o registro com chave 14.
_

1 10

2 3 3 4 8 9 16 20 25 29
(a)
_

1 10 20

2 3 4 3 4 8 9 14 16 25 29
(b)
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 23
rvores B - Insero
Exemplo de insero das chaves: 20, 10, 40, 50, 30, 55, 3, 11, 4, 28, 36,
33, 52, 17, 25, 13, 45, 9, 43, 8 e 48

(a)
20

(b)
30
>
>

10 20 40 50

(c)
10 20 30 40

3 4 11 13 17 25 28 33 36 50 52 55

(d)
30

10 20

40 50

3 4 8 9 11 13 17 25 28 33 36 43 45 48 52 55
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 24
rvores B - Primeiro renamento do algoritmo Insere
procedure Insere (Reg: Registro; var Ap: Apontador ) ;
procedure Ins (Reg: Registro; Ap: Apontador ; var Cresceu: Boolean;
var RegRetorno: Registro; var ApRetorno: Apontador ) ;
var i : integer ;
begin
i f Ap = ni l
then begin
Cresceu : = true;
Atri bui Reg a RegRetorno;
Atri bui ni l a ApRetorno;
end
else with Ap^ do
begin
i : = 1;
while ( i < n) and ( x.Chave > r [ i ] .Chave) do i : = i + 1;
i f x.Chave = r [ i ] .Chave
then writeln ( Erro: Registro j a esta presente na arvore )
else i f x.Chave < r [ i ] .Chave
then Ins ( x, p[ i 1], Cresceu, RegRetorno, ApRetorno)
else Ins ( x, p[ i ] , Cresceu, RegRetorno, ApRetorno) ;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 25
rvores B - Primeiro renamento do algoritmo Insere
i f Cresceu then i f (Numero de registros em Ap) < mm
then Insere na pagina Ap e Cresceu : = false
else begin { Overflow: pagina tem que ser dividida }
Cria nova pagina ApTemp;
Transfere metade dos registros de Ap para ApTemp;
Atri bui registro do meio a RegRetorno;
Atri bui ApTemp a ApRetorno;
end;
end;
end;
begin { Insere}
Ins (Reg, Ap, Cresceu, RegRetorno, ApRetorno) ;
i f Cresceu then Cria nova pagina rai z para RegRetorno e ApRetorno;
end;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 26
rvores B - Procedimento InsereNaPgina
procedure InsereNaPagina (Ap: TipoApontador ; Reg: TipoRegistro; ApDir : TipoApontador ) ;
var NaoAchouPosicao: Boolean;
k : Integer ;
begin
with Ap^ do
begin
k : = n;
NaoAchouPosicao : = k > 0;
while NaoAchouPosicao do
i f Reg.Chave < r [ k] .Chave
then begin
r [ k+1] := r [ k ] ; p[ k+1] := p[ k] ;
k : = k 1;
i f k < 1 then NaoAchouPosicao : = false;
end
else NaoAchouPosicao : = false;
r [ k+1] := Reg; p[ k+1] := ApDir;
n : = n + 1;
end;
end; { InsereNaPagina }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 27
rvores B - Renamento nal do algoritmo Insere
procedure Insere (Reg: TipoRegistro; var Ap: TipoApontador ) ;
var Cresceu: Boolean; RegRetorno: TipoRegistro;
ApRetorno, ApTemp: TipoApontador;
procedure Ins(Reg: TipoRegistro; Ap: TipoApontador ; var Cresceu:Boolean;
var RegRetorno: TipoRegistro; var ApRetorno: TipoApontador ) ;
var i , j : Integer ; ApTemp: TipoApontador;
begin
i f Ap = ni l
then begin Cresceu : = true; RegRetorno : = Reg; ApRetorno : = ni l ; end
else with Ap^ do
begin
i : = 1;
while ( i < n) and (Reg.Chave > r [ i ] .Chave) do i : = i + 1;
i f Reg.Chave = r [ i ] .Chave
then begin writeln ( Erro: Registro j a esta presente ) ; Cresceu:=false ; end
else begin i f Reg.Chave < r [ i ] .Chave then i : = i 1;
Ins (Reg, p[ i ] , Cresceu, RegRetorno, ApRetorno) ;
i f Cresceu
then i f n < mm
then begin { Pagina tem espaco }
InsereNaPagina (Ap, RegRetorno, ApRetorno) ; Cresceu : = false;
end
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 28
rvores B - Renamento nal do algoritmo Insere
else begin { Overflow: Pagina tem que ser dividida }
new (ApTemp) ;
ApTemp^.n : = 0; ApTemp^.p[ 0] : = ni l ;
i f i < M+ 1
then begin InsereNaPagina (ApTemp, r [ mm] , p[ mm] ) ; n : = n 1;
InsereNaPagina (Ap, RegRetorno, ApRetorno)
end
else InsereNaPagina (ApTemp, RegRetorno, ApRetorno) ;
for j : = M + 2 to mm do
InsereNaPagina (ApTemp, r [ j ] , p[ j ] ) ;
n : = M; ApTemp^.p[ 0] : = p[M+1];
RegRetorno : = r [M+1]; ApRetorno : = ApTemp;
end;
end;
end;
end; { Ins }
begin Ins (Reg, Ap, Cresceu, RegRetorno, ApRetorno) ;
i f Cresceu then begin { Arvore cresce na altura pela rai z }
new (ApTemp) ; ApTemp^.n : = 1;
ApTemp^. r [ 1] : = RegRetorno;
ApTemp^.p[ 1] : = ApRetorno;
ApTemp^.p[ 0] : = Ap; Ap : = ApTemp
end
end; { Insere }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 29
rvores B - Remoo
Pgina com o registro a ser retirado folha:
1. retira-se o registro,
2. se a pgina no possui pelo menos de m registros, a propriedade
da rvore B violada. Pega-se um registro emprestado da pgina
vizinha. Se no existir registros sucientes na pgina vizinha, as
duas pginas devem ser fundidas em uma s.
Pagina com o registro no folha:
1. o registro a ser retirado deve ser primeiramente substitudo por um
registro contendo uma chave adjacente.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 30
rvores B - Remoo
Exemplo: Retirando a chave 3.
_
4

6 8

_
2
>
>
>
_
1

_
3

_
5
/
/
_
7
_
9
`
`

1 2
_
*

_
5
/
/
_
4
_
7

6 8
`
`
_
9
`
`

1 2

_
4

_
5
`
`
_
6
_
7

_
8
`
`
_
9
`
`
(a) Pgina vizinha possui mais do que m registros
_
1

_
2

_
3
`
`
_
4
_
5

_
6
`
`
_
7
`
`

1 2
_
*

_
4
_
5

_
6
`
`
_
7
`
`
_

4 6

1 2

_
5
_
7
`
`
(b) Pgina vizinha possui exatamente m registros
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 31
rvores B - Remoo
Remoo das chaves 45 30 28; 50 8 10 4 20 40 55 17 33 11 36; 3 9 52.

(d)
13 25 43 48

(c)
13
>
>

3 9 25 43 48 52

(b)
10 25 40 50

3 4 8 9 11 13 17 20 33 36 43 48 52 55

(a)
30

10 20

40 50

3 4 8 9 11 13 17 25 28 33 36 43 45 48 52 55
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 32
rvores B - Procedimento Retira
procedure Ret(Ch:TipoChave; var Ap: TipoApontador; var Diminuiu:Boolean) ;
var Ind , j : Integer ;
procedure Reconstitui (ApPag: TipoApontador ; ApPai : TipoApontador;
PosPai : Integer ; var Diminuiu: Boolean) ;
var Aux: TipoApontador ; DispAux, j : Integer ;
begin
i f PosPai < ApPai^.n
then begin { Aux = Pagina a di rei t a de ApPag }
Aux : = ApPai^.p[PosPai+1];
DispAux : = (Aux^.n M + 1) div 2;
ApPag^. r [ApPag^.n+1] := ApPai^. r [PosPai+1];
ApPag^.p[ApPag^.n+1] := Aux^.p[ 0] ;
ApPag^.n : = ApPag^.n + 1;
i f DispAux > 0
then begin { Existe folga : transfere de Aux para ApPag }
for j : = 1 to DispAux 1 do
InsereNaPagina (ApPag, Aux^. r [ j ] , Aux^.p[ j ] ) ;
ApPai^. r [PosPai+1] := Aux^. r [DispAux] ;
Aux^.n : = Aux^.n DispAux;
for j : = 1 to Aux^.n do Aux^. r [ j ]:=Aux^. r [ j +DispAux] ;
for j : = 0 to Aux^.n do Aux^.p[ j ]:=Aux^.p[ j +DispAux] ;
Diminuiu : = false
end
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 33
rvores B - Procedimento Retira
else begin { Fusao: intercala Aux em ApPag e l i bera Aux }
for j : = 1 to Mdo
InsereNaPagina (ApPag, Aux^. r [ j ] , Aux^.p[ j ] ) ;
dispose (Aux) ;
for j : = PosPai + 1 to ApPai^.n 1 do with ApPai^ do
begin
r [ j ] : = r [ j +1]; p[ j ] : = p[ j +1]
end;
ApPai^.n : = ApPai^.n 1;
i f ApPai^.n >= M
then Diminuiu : = false;
end
end
else begin { Aux = Pagina a esquerda de ApPag }
Aux : = ApPai^.p[PosPai1];
DispAux : = (Aux^.n M + 1) div 2;
for j : = ApPag^.n downto 1 do
ApPag^. r [ j +1] := ApPag^. r [ j ] ;
ApPag^. r [ 1] : = ApPai^. r [PosPai ] ;
for j : = ApPag^.n downto 0 do
ApPag^.p[ j +1] := ApPag^.p[ j ] ;
ApPag^.n : = ApPag^.n + 1;
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 34
rvores B - Procedimento Retira
i f DispAux > 0
then begin { Existe folga : transfere de Aux para ApPag }
for j : = 1 to DispAux 1 do with Aux^ do
InsereNaPagina (ApPag, r [Aux^.n+1j ] , p[n+1j ] ) ;
ApPag^.p[ 0] : = Aux^.p[Aux^.n+1DispAux] ;
ApPai^. r [PosPai ] : = Aux^. r [Aux^.n+1DispAux] ;
Aux^.n : = Aux^.n DispAux;
Diminuiu : = false
end
else begin { Fusao: intercala ApPag em Aux e l i bera ApPag }
for j : = 1 to Mdo
InsereNaPagina (Aux, ApPag^. r [ j ] , ApPag^.p[ j ] ) ;
dispose (ApPag) ;
ApPai^.n : = ApPai^.n 1;
i f ApPai^.n >= M then Diminuiu : = false;
end;
end;
end;
end; { Reconstitui }
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 35
rvores B - Procedimento Retira
procedure Antecessor (Ap: TipoApontador ; Ind: Integer ;
ApPai : TipoApontador;
var Diminuiu: Boolean) ;
begin
with ApPai^ do
begin
i f p[n] <> ni l
then begin
Antecessor (Ap, Ind , p[n] , Diminuiu) ;
i f Diminuiu then Reconstitui (p[n] , ApPai , n, Diminuiu) ;
end
else begin
Ap^. r [ Ind] : = r [n] ; n : = n 1;
Diminuiu : = n < M;
end;
end
end; { Antecessor }
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 36
rvores B - Procedimento Retira
begin { Ret }
i f Ap = ni l
then begin writeln ( Erro: registro nao esta na arvore ) ; Diminuiu : = false ; end
else with Ap^ do
begin
Ind : = 1;
while ( Ind < n) and (Ch > r [ Ind] .Chave) do Ind : = Ind + 1;
i f Ch = r [ Ind] .Chave
then i f p[ Ind1] = ni l
then begin { Pagina folha }
n : = n 1; Diminuiu : = n < M;
for j : = Ind to n do
begin
r [ j ] : = r [ j +1];
p[ j ] : = p[ j +1];
end;
end
else begin { Pagina nao e folha : trocar com antecessor }
Antecessor (Ap, Ind , p[ Ind1], Diminuiu) ;
i f Diminuiu then Reconstitui (p[ Ind1], Ap, Ind1, Diminuiu) ;
end
{ Continua na prxima transparncia }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 37
rvores B - Procedimento Retira
else begin
i f Ch > r [ Ind] .Chave then Ind : = Ind + 1;
Ret (Ch, p[ Ind1], Diminuiu) ;
i f Diminuiu
then Reconstitui (p[ Ind1], Ap, Ind1, Diminuiu) ;
end
end
end; { Ret }
begin { Retira }
Ret (Ch, Ap, Diminuiu) ;
i f Diminuiu and (Ap^.n = 0)
then begin { Arvore diminui na altura }
Aux : = Ap; Ap : = Aux^.p[ 0] ;
dispose (Aux) ;
end
end; { Retira }
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.2 38
rvores B* - TAD Dicionrio
Estrutura de Dados:
type
TipoRegistro = record
Chave: TipoChave;
{ outros componentes }
end;
TipoApontador = ^TipoPagina;
TipoIntExt = ( Interna , Externa) ;
TipoPagina = record
case Pt : TipoIntExt of
Interna : ( ni : 0. . mm;
r i : array [ 1. . mm] of TipoChave;
pi : array [ 0. . mm] of TipoApontador ) ;
Externa: ( ne: 0. . mm2;
re : array [ 1. . mm2] of TipoRegistro) ;
end;
TipoDicionario = TipoApontador;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.2 39
rvores B* - Pesquisa
Semelhante pesquisa em rvore B,
A pesquisa sempre leva a uma pgina folha,
A pesquisa no pra se a chave procurada for encontrada em uma
pgina ndice. O apontador da direita seguido at que se encontre
uma pgina folha.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.2 40
rvores B* - Procedimento para pesquisar na rvore B

procedure Pesquisa ( var x: TipoRegistro; var Ap: TipoApontador ) ;


var i : integer ;
begin
i f Ap^. Pt = Interna
then with Ap^ do
begin
i : = 1;
while ( i < ni ) and ( x.Chave > r i [ i ] ) do i : = i + 1;
i f x.Chave < r i [ i ]
then Pesquisa(x, pi [ i 1])
else Pesquisa(x, pi [ i ] )
end
else with Ap^ do
begin
i : = 1;
while ( i < ne) and ( x.Chave > re[ i ] .Chave) do i : = i + 1;
i f x.Chave = re[ i ] .Chave
then x : = re[ i ]
else writeln( Registro nao esta presente na arvore ) ;
end;
end;
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.2 41
rvores B* - Insero e Remoo
Insero na rvore B*
Semelhante insero na rvore B,
Diferena: quando uma folha dividida em duas, o algoritmo
promove uma cpia da chave que pertence ao registro do meio
para a pgina pai no nvel anterior, retendo o registro do meio na
pgina folha da direita.
Remoo na rvore B*
Relativamente mais simples que em uma rvore B,
Todos os registros so folhas,
Desde que a folha que com pelo menos metade dos registros, as
pginas dos ndices no precisam ser modicadas, mesmo se uma
cpia da chave que pertence ao registro a ser retirado esteja no
ndice.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.3 42
Acesso Concorrente em rvore B*
Acesso simultneo a banco de dados por mais de um usurio.
Concorrncia aumenta a utilizao e melhora o tempo de resposta do
sistema.
O uso de rvores B* nesses sistemas deve permitir o processamento
simultneo de vrias solicitaes diferentes.
Necessidade de criar mecanismos chamados protocolos para garantir
a integridade tanto dos dados quanto da estrutura.
Pgina segura: no h possibilidade de modicaes na estrutura da
rvore como conseqncia de insero ou remoo.
insero pgina segura se o nmero de chaves igual a 2m,
remoo pgina segura se o nmero de chaves maior que m.
Os algoritmos para acesso concorrente fazem uso dessa propriedade
para aumentar o nvel de concorrncia.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.3 43
Acesso Concorrente em rvore B* - Protocolos de
Travamentos
Quando uma pgina lida, a operao de recuperao a trava, assim,
outros processos, no podem interferir com a pgina.
A pesquisa continua em direo ao nvel seguinte e a trava liberada
para que outros processos possam ler a pgina .
Processo leitor executa uma operao de recuperao
Processo modicador executa uma operao de insero ou
retirada.
Dois tipos de travamento:
Travamento para leitura permite um ou mais leitores acessarem
os dados, mas no permite insero ou retirada.
Travamento exclusivo nenhum outro processo pode operar na
pgina e permite qualquer tipo de operao na pgina.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 44
rvore B - Consideraes Prticas
Simples, fcil manuteno, eciente e verstil.
Permite acesso seqencial eciente.
Custo para recuperar, inserir e retirar registros do arquivo logaritmico.
Espao utilizado , no mnimo 50% do espao reservado para o
arquivo,
Emprego onde o acesso concorrente ao banco de dados necessrio,
vivel e relativamente simples de ser implementado.
Insero e retirada de registros sempre deixam a rvore balanceada.
Uma rvore B de ordem m com N registros contm no mximo cerca
de log
m+1
N pginas.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 45
rvore B - Consideraes Prticas
Limites para a altura mxima e mnima de uma rvore B de ordem m
com N registros: log
2m+1
(N + 1) altura 1 + log
m+1

N+1
2

Custo para processar uma operao de recuperao de um registro


cresce com o logaritmo base m do tamanho do arquivo.
Altura esperada: no conhecida analiticamente.
H uma conjectura proposta a partir do clculo analtico do nmero
esperado de pginas para os quatro primeiros nveis (das folha em
direo raiz) de uma rvore 2-3 (rvore B de ordem m = 1).
Conjetura: a altura esperada de uma rvore 2-3 randmica com N
chaves h(N) log
7/3
(N + 1).
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 46
rvores B Randmicas - Medidas de Complexidade
A utilizao de memria cerca de ln 2.
Pginas ocupam 69% da rea reservada aps N inseres
randmicas em uma rvore B inicialmente vazia.
No momento da insero, a operao mais cara a partio da pgina
quando ela passa a ter mais do que 2m chaves. Envolve:
Criao de nova pgina, rearranjo das chaves e insero da chave
do meio na pgina pai localizada no nvel acima.
Pr{j parties}: probabilidade de que j parties ocorram durante
a N-sima insero randmica.
rvore 2-3: Pr{0 parties} =
4
7
, Pr{1 ou mais parties} =
3
7

rvore B de ordem m: Pr{0 parties} = 1


1
(2 ln 2)m
+ O(m
2
),
Pr{1 ou + parties} =
1
(2 ln 2)m
+ O(m
2
).
rvore B de ordem m = 70: 99% das vezes nada acontece em
termos de parties durante uma insero.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 47
rvores B Randmicas - Acesso Concorrente
Foi proposta uma tcnica de aplicar um travamento na pgina segura
mais profunda (Psmp) no caminho de insero.
Uma pgina segura se ela contm menos do que 2m chaves.
Uma pgina segura a mais profunda se no existir outra pgina
segura abaixo dela.
J que o travamento da pgina impede o acesso de outros processos,
interessante saber qual a probabilidade de que a pgina segura
mais profunda esteja no primeiro nvel.
rvore 2-3: Pr{Psmp esteja no 1

nvel} =
4
7
,
Pr{Psmp esteja acima do 1

nvel} =
3
7

rvore B de ordem m:
Pr{Psmp esteja no 1

nvel} = 1
1
(2 ln2)m
+ O(m
2
),
Pr{Psmp esteja acima do 1

nvel} =
3
7
=
1
(2 ln 2)m
+ O(m
2
).
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 48
rvores B Randmicas - Acesso Concorrente
Novamente, em rvores B de ordem m = 70: 99% das vezes a Psmp
est em uma folha. (Permite alto grau de concorrncia para processos
modicadores.)
Solues muito complicadas para permitir concorrncia de operaes
em rvores B no trazem grandes benefcios.
Na maioria das vezes, o travamento ocorrer em pginas folha.
(Permite alto grau de concorrncia mesmo para os protocolos mais
simples.)
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 49
rvore B - Tcnica de Transbordamento (ou Overow)
Assuma que um registro tenha de ser inserido em uma pgina cheia,
com 2m registros.
Em vez de particion-la, olhamos primeiro para a pgina irm direita.
Se a pgina irm possui menos do que 2m registros, um simples
rearranjo de chaves torna a partio desnecessria.
Se a pgina direita tambm estiver cheia ou no existir, olhamos
para a pgina irm esquerda.
Se ambas estiverem cheias, ento a partio ter de ser realizada.
Efeito da modicao: produzir uma rvore com melhor utilizao de
memria e uma altura esperada menor.
Produz uma utilizao de memria de cerca de 83% para uma rvore
B randmica.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 50
rvore B - Inuncia do Sistema de Paginao
O nmero de nveis de uma rvore B muito pequeno (trs ou quatro)
se comparado com o nmero de molduras de pginas.
Assim, o sistema de paginao garante que a pgina raiz esteja
sempre na memria principal (se for adotada a poltica LRU).
O esquema LRU faz com que as pginas a serem particionadas em
uma insero estejam disponveis na memria principal.
A escolha do tamanho adequado da ordem m da rvore B
geralmente feita levando em conta as caractersticas de cada
computador.
O tamanho ideal da pgina da rvore corresponde ao tamanho da
pgina do sistema, e a transferncia de dados entre as memrias
secundria e principal realizada pelo sistema operacional.
Estes tamanhos variam entre 512 bytes e 4.096 bytes, em mltiplos de
512 bytes.