Estrutura de Dados II - Arvores B-(BTREE)

4

Click here to load reader

description

Tutorial sobre a estrutura da dados - arvore B

Transcript of Estrutura de Dados II - Arvores B-(BTREE)

Page 1: 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.

Page 2: Estrutura de Dados II - Arvores B-(BTREE)

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

Page 3: Estrutura de Dados II - Arvores B-(BTREE)

Á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

Page 4: Estrutura de Dados II - Arvores B-(BTREE)

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