Estrutura de Dados II - Arvores B-(BTREE)
Click here to load reader
-
Upload
arnaldo-araujo -
Category
Documents
-
view
1.511 -
download
3
description
Transcript of Estrutura de Dados II - Arvores B-(BTREE)
Estrutura de Dados II
Árvores B (B-Tree)
Conteúdo
� Criação� Motivação� Definição� Pesquisa� Inserção� Remoção
Criação
� Bayer and McGreight, 1972.
� Em 1979 o uso de B-trees se tornou o padrão de indexação
Motivação
� Bayer e McCreight propuseram que as árvores sejam construídas de baixo para cima;
� As chaves raiz da árvore emergem naturalmente;
� A árvore é auto-balanceada e todos os nós filhos estão sempre em um mesmo nível;
� Uma idéia elegante e poderosa.
Definição
� Cada página é formada por um seqüência de chaves e conjunto de ponteiros.
� O número de ponteiros em um nó excede o número de chaves em 1.
� O número máximo de ponteiros em um nó é a ordem ou grau da árvore.
� O número máximo de ponteiros é igual ao número máximo de descendentes de um nó.
Ex: uma árvore B de ordem 8 possui nós com no máximo 7 chaves e 8 filhos.
� Um nó folha não possui filhos, e seus ponteiros são nulos.
Definição
� Ordem
A definição atual de B-Tree vincula a ordem de uma árvore ao número de descententes de um nó (isto é,. de ponteiros). Deste modo, numa árvore B de ordem ou grau m o número máximo de chaves é m-1.
Ex: Uma árvore B de ordem 8 tem um máximo de 7 chaves por página.
� Número mínimo de chaves por página
Quando uma página é dividida na inserção, os nós são divididos igualmente entre as páginas velha e nova. Deste modo, o número mínimo de chaves em um nó é dado por (m / 2) - 1 (exceto para a raiz).
Ex: Uma árvore B de ordem 8 que tem um máximo de 7 chaves por página tem um mínimo de 3 chaves por página.
� Nó folha Os nós folhas são aqueles alocados no nível mais baixo da árvore.
Definição formal das Propriedades de uma B-trees � Para uma B-tree de ordem m:
1. Cada página tem um máximo de m descendentes;
2. Cada página, exceto a raiz e as folhas, tem um mínimo de (m / 2) - 1 descendentes;
3. A raiz tem um mínimo de dois descendentes - a menos que seja uma folha;
4. Todas as folhas aparecem num mesmo nível;
5. Uma página que não é folha e possui k descendentes contém k-1 chaves;
6. uma página folha contém no mínimo (m / 2) -1 e no máximo m - 1 chaves
Pesquisa� Árvores B de ordem 4 com 3 níveis
30
10 20
3 4 8 9 11 13 17 25 28
40 50
33 36 43 45 48 52 55
chave1 chave 2 ....... chave2m
p1 p2 p3
Inserção
� Inserção do registro com chave 14
� O registro deve ser inserido na página 3.
� A página está cheia
� A pagina 3 é dividida em duas (3,4)
� Os m +1 registros são distribuídos igualmente e o registro do meio movido para a página pai
� Se a página pai estivesse cheia aplicar o mesmo método
10
3 4 8 9 16 20 25 29
10 20
3 4 8 9 14 16 25 29
1
2 3
1
2 3 4
Remoção
� O processo de divisão (split) de páginas garante a manutenção das propriedades da B-tree durante a inserção. Essas propriedades precisam ser mantidas, também, durante a eliminação de chaves.
Caso 1: eliminação mantém número mínimo de chaves na página. Solução: Chave é retirada e registros internos à página reorganizados.
Caso 2: eliminação de chave que não está numa folha. Solução: Sempre eliminamos da folha. Se uma chave deve ser eliminada de uma página que não é folha, trocamos a chave com sua sucessora imediata, a qual, com certeza está numa folha, e então eliminamos a chave da folha.
Caso 3: eliminação causa underflow na página. O número mínimo de chaves por página nessa árvore é m/2 -1 = 6/2 -1=2. Solução: Redistribuição. Procura-se uma página irmã (mesmo pai) que contenha mais chaves que o mínimo: se existir redistribui-se as chaves entre essas páginas. A redistribuição causa a colocação de uma nova chave de separação no nó pai.
Remoção
Caso 4: ocorre underflow e a redistribuição não pode ser aplicada. Quando não existirem chaves suficientes para dividir entre as duas páginas irmãs. Solução: Deve-se utilizar concatenação: combina-se o conteúdo das duas páginas e a chave da página pai para formar uma única página. Concatenação é o inverso do Splitting. Como conseqüência, pode causar o underflow da página pai.
Caso 5: underflow da página pai Solução: No exemplo, a concatenação das páginas 3 e 4 retira D a página 1, causando underflow na página 1. Redistribuição não pode ser aplicada (por quê?). Deve-se utilizar concatenação novamente.
Caso 6: Diminuição da altura da árvore. Conseqüência da concatenação dos filhos do nó. Solução: A concatenação das páginas 1 e 2 absorve a única chave da raiz.
� Este caso mostra o que ocorre quando a concatenação é propagada até a raiz. Note que esse nem sempre é o caso: se a página 2 (Q e W) tivesse mais uma chave, aplicaria-se redistribuição em vez de concatenação.
4
2
1 3
6 8
5 7 9
Retirar a chave 34
1 2
6 8
5 7 9
6
4
1 2
8
5 7 9
Remoção
Árvore B*
� A árvore B* é uma das alternativas de implementação para a árvore B original, onde:
� todos os registros são armazenados no último nível (páginas folhas)
� os níveis acima são um índice com a organização de uma árvore B
� no índice só estão as chaves e os apontadores, sem nenhuma informação associada enquanto nas páginas folhas estão todos os registros do arquivo
� Vantagens� As páginas folhas são conectadas da esquerda
para direita o que permite um acesso seqüencial mais eficiente do que o acesso através do índice
� Facilita o acesso concorrente ao arquivo
Árvore B
...
índice
registros
Árvore B*
� Pesquisar sempre até a página folha. Quando a chave é encontrada em uma página de índice segue-se o apontador a direita até encontrá-la na página folha. Ex. 29, 60,75
� Inserção similar a árvore B. Exceto quando uma folha é dividida em duas: fazer uma cópia do registro do meio para a página pai e deixar o registro na página folha da direita.
� Retirada mais simples que na árvore B.
45
9 29
1 4 5 9 18 19 22 29 33
60 75
45 50 52 60 65 70 75 80
Implementação Árvore B/B*
type Registro = record
Chave: TipoChave;
{Outros Componentes}
end;
Apontador = ^Pagina;
Pagina = record
Numero-registros: 0 ...2m;
Registros: array[1 ..2m] of Registro;
Ponteiros: array[0 ..2m] of Apontador; End;
TipoDicionario = Apontador;
type Registro = record
Chave: TipoChave;
{Outros Componentes}
end;
Apontador = ^Pagina;
PaginaTipo = (Interna, Externa);
Pagina = record
Case Pt: PaginaTipo of Interna:
(Numero-registros: 0 ...2m;
Registros: array[1 ..2m] of TipoChave;
Ponteiros: array[0 ..2m] of Apontador;);
Externa:
(Numero-registros: 0 ...4m;
Registros: array[1 ..4m] of Registro;)
End;
TipoDicionario = Apontador;
Procedure PesquisaArvoreB (var x : Registro; var Ap : Apontador);var i: integer;
beginif Ap = nil then {chegou na página folha}
writeln( ‘Registro não está presente na árvore’)
else with Ap^ do
begin i := 1; while (i < n) and (x.Chave > r[i]. Chave do
i := i + 1;
if x. Chave = r[i].Chave then {achou}x:= r[i]
else if x. Chave < r[i].Chave then {esquerda}
PesquisaArvoreB (x, p[i-1])
else {direita }
PesquisaArvoreB (x, p[i]);
end;end ;
Procedure PesquisaArvoreBEstrela (var x : Registro; var Ap : Apontador);var i: integer;
beginif Ap^.Pt = Internal then
with Ap^ do
begin i := 1; while (i < n) and (x.Chave > r[i]. Chave do i := i + 1;
if x. Chave < r[i].Chave then {esquerda}PesquisaArvoreBEstrela (x, p[i-1])
else {Maior ou igual - direita}PesquisaArvoreBEstrela (x, p[i])
end else with Ap^ do {Externa}
begini := 1;while (i < n) and (x.Chave > r[i]. Chave do i := i + 1;
if x. Chave = r[i].Chave then {achou} x:= r[i]
else writeln( ‘Registro não está presente na árvore’);
end;end ;
Acesso Concorrente em Árvore B*
� Acesso para apenas um processo de cada vez cria um gargalo inaceitável no sistema
� Acesso simultâneo ao Banco de Dados é importante� Concorrência aumenta utilização e tempo de resposta do sistema� Problemas: Dois processos acessam simultaneamente o banco
� um processo pesquisa uma chave e está seguindo um apontador para a subárvore correspondente
� outro processo insere um novo registro que provoca divisões de páginas na mesma subárvore
� o apontador utilizado pelo processo de pesquisa fica apontando para a subárvore errada ou inexistente.
� Deve-se criar protocolos para garantir a integridade dos dados� Página segura: não provoca modificação na estrutura da árvore
� inserção: número atual de chaves na árvore < 2m� retirada: número atual de chaves na árvore > m� pesquisa: não altera a estrutura da árvore
Protocolos de Bloqueio (Lock Protocols)
� Bloqueio para leitura� Processos leitores: pesquisa� Permite um ou mais leitores acessarem os dados mas não permite
inserção ou retirada de dados� Bloquear para leitura a raiz � Ler a página raiz (página corrente = raiz)� Bloquear para leitura o descendente apropriado � Liberar bloqueio na página corrente� Ler página descendente (página corrente = descendente)� Seguir seqüência de bloqueios até página corrente = página folha
Protocolos de Bloqueio (Lock Protocols)
� Bloqueio exclusivo� Processos modificadores: inserção, remoção� Bloqueia a página apenas para um processo que pode executar
qualquer tipo de operação� Colocar bloqueio exclusivo na raiz � Ler a página raiz (página corrente = raiz)� Colocar Bloqueio exclusivo no descendente apropriado � Ler página descendente (pag. corrente = descendente)� Se a página corrente é segura então libere todos os bloqueios
mantidos sobre as páginas antecessoras da página corrente� Senão mantenha os bloqueio� Seguir seqüência de bloqueios até página corrente = página folha
� Evitar Deadlock: dois processos estão se bloqueando mutuamente e cada um dos processos fica esperando pelo desbloqueio do outro eternamente
Arvores B
� Exemplo
� http://slady.net/java/bt/view.php?w=800&h=600