Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouFábio Octavio Rosa Correia Alterado mais de 7 anos atrás
1
INE5408 Estruturas de Dados Árvores B Exemplos de inserção e deleção segundo a interpretação de Alan Tharp do algoritmo de Bayer
2
Definição (interpretação de Alan Tharp) Uma árvore B de ordem mínima t >= 1 é uma árvore com as seguintes propriedades: Cada nodo possui os seguintes campos:, P 1,,...,,P q > Descrição dos campos: NChaves – número de chaves armazenadas no nodo; Folha – flag indicando se o nodo é folha ou não; P i – ponteiro para o nodo filho i; K – chaves; Info i – ponteiro para o elemento de dados na memória ou para um registro em disco onde se encontra a chave K i ; Nº de chaves t <= q <= 2t + 1. –A situação q = 2t + 1 é instável e provoca a explosão do nodo no ajuste subseqüente da árvore. –A situação 0 < q < t é estável somente na raiz. Quando é forçada por uma deleção fora da raiz, provoca a imediata rotação de uma chave ou fusão do nodo com um irmão.
3
Inserção em uma árvore B (Alan Tharp) Algoritmo de inserção em uma árvore B: desça a árvore em busca da chave; a inserção é sempre feita nas folhas; ao retornar da inserção: verifique se o nodo está cheio (se contém 2t+1 chaves); se o nodo estiver cheio: –dividir o nodo ao meio; –colocar a chave do meio no nodo pai (se este também encher, repetir o processo recursivamente).
4
Inserção em uma árvore B (Alan Tharp) insere_B_tharp(nodoB raiz, infoB dado) variaveis nodoB filho = nulo; /* inicializa p/folha */ inicio SE raiz->folha ENTÃO /* insira na folha */ insere_folha_B(raiz, dado); SENÃO /* continua descendo */ filho <- selecionaRamoDescida_B(raiz, dado); insere_B(filho, dado); FIM SE /* retorna ajustando */ SE nodo_cheio_B(filho) ENTÃO /* se nodo possuir 2t+1 chaves, divida, lembrando de passar a raiz que se altera */ divide_nodo_B (raiz, filho); FIM SE fim
5
Exemplo: Criação de uma árvore-B de Ordem t=2 e inserção do 80 k 2t+1. Neste modelo você tem de prever uma área no nodo para a chave k 2t+1 e o ponteiro p 2t+1 para armazenar o dado de overflow. Esta posição não é mostrada na animação.
6
Inserção do 50: 80 move-se uma posição
7
Inserção do 95: inserção no fim
8
Inserção do 90: 95 move-se uma posição
9
Inserção do 60: Overflow. Valor central é 80 e dois novos nodos são gerados. 50. 60. 80. 90. 95. Área de Overflow do Nodo: q = 2t + 1
10
Inserção do 65
11
Inserção do 70
12
Inserção do 75: Overflow. Nodo dividido. Valor central é 65: sobe e desloca 80 uma posição.
13
Inserção do 55 e do 64: Só provocam reposicionamentos dentro da folha.
14
Inserção do 51: Overflow. Nodo dividido: 50 e 55 permanecem, 60 e 64 vão para o nodo novo. Valor central é 55: sobe e desloca 65 e 80 uma posição.
15
Inserção do 76 e 77.
16
Inserção do 78: Overflow. Nodo dividido: 70 e 75 permanecem, 77 e 78 vão para o nodo novo. Valor central é 76: sobe e desloca 80 uma posição Raiz finalmente está completa.
17
Inserção do 98 e 99.
18
Inserção do 96: Overflow. Nodo dividido: 90 e 95 permanecem, 98 e 99 vão para o nodo novo. Valor central é 96: sobe e provoca novo Overflow na raiz. Nodo-raiz dividido: 55 e 65 permanecem. 80 e 96 vão para o novo nodo. 76 sobre para nova raiz que é criada.
19
Deleções na mesma árvore (c/base na interpretação de Alan Tharp)
20
Deleção em uma árvore B (Alan Tharp) Regra 1 at : se a chave k está no nodo X e X é folha, então remova.
21
Deleção em uma árvore B (Alan Tharp) Regra 2 at : se a chave k está no nodo X e X é um nodo interno: a)se a subárvore Y predecessora inordem de X possui pelo menos t + 1 chaves: determine a chave predecessora inordem k' em Y substitua k por k' recursivamente exclua k' da subárvore Y b)se a subárvore Z sucessora inordem de X possui pelo menos t + 1 chaves: determine a chave sucessora inordem k' em Z substitua k por k' recursivamente exclua k' da subárvore Z c)se as subárvores Y e Z possuem apenas t chaves: funda k e todo o nodo Z em Y retire k e o apontador para Z de X libere o nodo Z recursivamente exclua k da subárvore Y
22
Deleção em uma árvore B (Alan Tharp) Regra 3 at : se a chave k não está em X e X é um nodo interno. 1.determine a raiz P i [X] da subárvore onde K deve estar 2.exclua recursivamente k de P i [X] 3.SE P i [X] tem apenas t-1 chaves: a)Rotação de chaves - se um dos vizinhos de P i [X] tem pelo menos t + 1 chaves : mova uma chave de X descendo para P i [X] mova uma chave do vizinho de P i [X] subindo para X mova o apontador apropriado do vizinho para P i [X] b)Fusão de nodos: se P i [X] e seus vizinhos têm apenas t chaves: funda P i [X] com um dos seus vizinhos e com a chave k i de X remova o par k i e p i de X libere o nodo apontado por Info i
23
Algoritmo de Deleção em Árvore B (o ajuste de nodo é que é diferente) deleta_B(nodoB pai, nodoB nodo, infoB dado) variaveis nodoB filho; inicio SE contem_chave_B(nodo, dado) ENTÃO SE raiz->folha ENTÃO /* caso 1 */ deleta_folha_B(nodo, dado); SENÃO /* caso 2 */ deleta_interno_B(pai, nodo, dado); FIM SE SENÃO /* desce recursivamente */ filho <- selecionaRamoDescida_B(nodo, dado); deleta_B(nodo, filho, dado); /* caso 3 depois de fazer tudo */ ajusta_nodo_B_tharp(nodo, filho, dado); FIM SE fim
24
Inserção de 62, 79, 91, 93 e 97 são realizadas nas folhas com apenas deslocamentos intra-nodais de posição de chaves.
25
Deleção do 90: deletamos de um nodo folha que não viola a condição de capacidade mínima (underflow).
26
Deleção do 76: Seu sucessor inordem (77) sobe da folha para ocupar seu lugar raiz sem causar underflow na folha.
27
Deleção do 79: deletamos de um nodo-folha: underflow. Rearranjamos: descendo seu sucessor inordem (80) do nodo-pai e subindo o sucessor inordem do pai (90) de seu nodo-irmão da direita. Recursivamente deletamos 90 do nodo-irmão da direita.
28
Deleção do 77: underflow provoca seqüência de junções de nodos. Ao deletar 77 seu, sucessor inordem 78 sobe da folha para a raiz: underflow nessa folha. Desce o sucessor inordem da folha (80): 91. Como a subida do sucessor inordem de 91 para repô-lo provoca underflow na folha-irmã, temos de fundir essa folha com o 91 (que desce) e a folha com (93,95). Isso provoca underflow no nodo interno (96), de onde o 91 saiu. Temos de fundir com a raiz e seu irmão da esquerda (55,65).
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.