You are on page 1of 33

rvores B+

As operaes nas rvores B+ no so


muito diferentes das operaes das rvores
B.
Inserir uma chave em uma folha que ainda
tenha algum espao exige que se coloque as
chaves desta folha em ordem. Nenhuma
mudana feita no conjunto de ndices. Se
uma chave inserida em uma folha cheia, a
folha dividida, o novo n folha includo no
conjunto de seqncia, as chaves so
distribudas homogeneamente entre a folha
velha e a nova folha e a primeira chave do
novo n copiada (no movida, como na
rvore B) para o ascendente. Veja o slide a
149seguir.

29
11 19
1

10

11 13 15

19 26

A insero da chave 6 da rvore acima resulta


na rvore abaixo.
29
6
1

11 19
10

11 13 15

19 26

Se o ascendente no est cheio, isso pode


exigir reorganizao local das chaves do
ascendente como no caso acima.
Se o ascendente est cheio, o processo de
diviso realizado do mesmo modo que nas
rvore B. Depois de tudo, o conjunto de ndices
150 uma rvore B.

rvores B+

Remover uma chave de uma folha sem


subaproveitamento exige colocar as chaves
remanescentes em ordem, nenhuma mudana
feita ao conjunto de ndices. Em particular,
se uma chave que no ocorre somente em
uma folha removida, ela simplesmente
removida da folha, mas pode permanecer no
n interno.
A razo que ele ainda serve como guia
apropriado quando se navega para baixo na
rvore
B+,
porque
ainda
separa
apropriadamente as chaves entre dois filhos
adjacentes mesmo se o prprio separador no
ocorre em nenhum dos filhos. Observe o
processo no prximo slide.
151

rvores B+
29
6
1

11 19
10

19 26

11 13 15

A remoo da chave 6 da rvore acima


resulta na rvore abaixo. Note que o nmero
6 no removido de um n interno.
29
6
1

152

10

11 19
11 13 15

19 26

rvores B+

Quando a remoo de uma chave causa


subaproveitamento, ambas as chaves dessa
folha e as chaves de um irmo so
redistribudas entre a folha e seu irmo, ou a
folha removida e as chaves remanescentes
so includas no seu irmo. As rvores
abaixo ilustram o segundo caso. 29
6
1

11 19

10

11 13 15
29

Remover 2
11 19
1
153

10

11 13 15

19 26

19 26

rvores B+

Como vimos, depois de remover o nmero


2, um subaproveitamento ocorre e duas
folhas so combinadas para formar uma
folha. A primeira chave do irmo direita do
n que permanece depois da fuso copiada
ao n ascendente, e as chaves no
ascendente so colocadas em ordem. Essas
duas operaes exigem atualizao do
separador no ascendente. Alm disso,
remover uma folha pode disparar fuses no
conjunto de ndices.
154

Tabelas de hash

Consideraes iniciais:
At o momento foram estudados
basicamente dois tipos de estruturas de
dados para o armazenamento flexvel
de dados:
Listas;
rvores.
Como vimos, cada um desses grupos
possui muitas variantes.
155

Tabelas de hash

As Listas so simples de se implementar,


mas, com um tempo mdio de acesso T =
n/2, tornando-se impraticveis para grandes
quantidades de dados.
 Por exemplo: em uma lista com 100.000
dados, para recuperar 3 elementos em
seqncia faremos um nmero esperado de
150.000 acessos a nodos.
 Logo: listas so timas porm, para
pequenas quantidades de dados.

156

Tabelas de hash

As rvores so estruturas mais


complexas, mas que possuem um tempo
mdio de acesso T= logGn, onde G = ordem
da rvore.
 A organizao de uma rvore depende da
ordem de entrada dos dados.
 Para evitar a deteriorao, h modelos de
rvores que se reorganizam sozinhas. As
principais so AVL e rvore B.

157

Tabelas de hash

Imagine uma estrutura de dados que


possibilite o armazenamento de uma tabela
onde o acesso a um de seus registros seja
efetuado diretamente.
Esta estrutura representa um modelo
ideal, contudo em aplicaes reais este
ideal pode ser aproximado.
Ideal: Indexao direta (transformao chave-ndice)
pesq(T:tabela, C: chave)
baseado em h(C:chave)-> ndice
158

Tabelas de hash

Uma tabela hash, tambm chamada de


tabela de disperso ou tabela de escrutnio,
trata-se de uma forma extremamente
simples, fcil de se implementar e intuitiva
de se organizar grandes quantidades de
dados, permitindo armazenar e encontrar
rapidamente dados por meio da utilizao
de uma chave.
A idia central prope a diviso de um
universo de dados a ser organizado em
subconjuntos mais gerenciveis.
159

Tabelas de hash

Possui dois conceitos centrais:


Tabela de Hashing: Estrutura que permite
o acesso aos subconjuntos.
Funo de Hashing: Funo que realiza
um mapeamento entre valores de
chaves e entradas na tabela.
h(chave) -> min .. max
min
C:Chave

160

h(c)

I: min .. max

max

Tabelas de hash

interessante ressaltar que uma tabela


hash possui limitaes em relao s
rvores, como por exemplo:
 No permite recuperar/imprimir todos
os elementos em ordem de chave nem
tampouco outras operaes que exijam
seqncia dos dados.
 No permite operaes do tipo
recuperar o elemento com a maior ou a
menor chave.
161

Tabelas de hash

Idia geral: Se eu possuo um universo de


dados classificveis por chave, posso:
Criar um critrio simples para dividir este
universo em subconjuntos com base em
alguma qualidade do domnio das chaves.
Saber em qual subconjunto procurar e
colocar uma chave.
Gerenciar estes subconjuntos bem menores
por algum mtodo simples.

162

Tabelas de hash
Para isso necessrio:
Saber quantos subconjuntos so desejados e
criar uma regra de clculo que permita, dada
uma chave, determinar em qual subconjunto
deve-se procurar pelos dados com esta chave
ou colocar este dado, caso seja um novo
elemento. (funo de hashing).
Possuir um ndice que permita encontrar o
incio do subconjunto certo, depois de calcular
o hashing. (tabela de hashing).
Possuir uma ou um conjunto de estruturas de
dados para os subconjuntos. hashing fechado
(endereamento aberto) ou o hashing aberto
163
(encadeado).

Tabelas de hash: Exemplo


Antnia
Jos
Olegrio
Maria
lvaro
Magda
Murilo
Jonas
Othon
Ana
Olga
Judite

164

Qual a 1 letra?

A
J
M
O

Antnia
lvaro
Ana
Jos
Jonas
Judite
Maria
Magda
Murilo
Olegrio
Othon
Olga

Tabelas de hash

Devemos garantir um tratamento coerente


das operaes de insero e pesquisa na
tabela
Inserir: calcula-se endereo da nova
entrada usando a funo h
Pesquisa: mesma funo deve informar o
mesmo ndice para a mesma entrada

165

Tabelas de hash

chaves -> ndices

Mais de uma
chave gera o
mesmo ndice

COLISO

Funo de
Disperso

Subconjuntos (classes) de sinnimos


(chaves com o mesmo ndice)

166

Tabelas de hash

Implementao de tabelas por clculo de


endereo envolve dois problemas
Escolha da funo de disperso adequada
para o tipo de chave usada
gerar endereos em todo o intervalo
[min..max]
estabelecer distribuio uniforme na tabela

Adoo de um processo de soluo das


colises
167

Tabelas de hash: Nomenclatura


n: Tamanho do universo de dados.
b: Nmero de subconjuntos em que dividimos os
dados: depsitos.
s: Capacidade de cada depsito (quando for
limitada. Aplica-se somente a hashing fechado ou
endereamento aberto).
T: Cardinalidade do domnio das chaves. Quantas
chaves podem existir ?
n/T: Densidade identificadora.
= n/(bs): Densidade de carga. bs fornece a
capacidade
mxima
(quando
existir
explicitamente). n/(bs) indica o fator de
preenchimento. Aplica-se somente a hashing
fechado (endereamento aberto).
168

Tabelas
Hashingde
Aberto
hash:ou
Nomenclatura
Encadeado
Forma mais intuitiva de se implementar o
conceito de Hashing.
Utiliza a idia de termos uma tabela com b
entradas, cada uma como cabea de lista
para uma lista representando o conjunto bi.
Calculamos a partir da chave qual entrada da
tabela a cabea da lista que queremos.
Utilizamos uma tcnica qualquer para
pesquisa dentro de bi. Tipicamente ser a
tcnica de pesquisa seqencial em lista
encadeada.

169

Podemos utilizar qualquer outra estrutura para


representar os bi. Uma rvore, por exemplo, poderia
ser uma opo.

Propostas de Funo de Disperso

Um dos mtodos mais simples para criar


funes hashing o mtodo da diviso.
No qual uma chave C mapeada para um
dos b endereos da tabela hashing.
Resto da Diviso

h(C) = C mod b
[0,b-1]
170

n mximo de
entradas da
tabela

Hashing Aberto ou Encadeado: Exemplo

Para
uma
melhor
analisaremos um exemplo
tabela com 8 entradas
acomodar registros cujas
valores pertencentes ao
nmeros naturais.
0
1
Inicialmente a tabela
2
est vazia.
3
4
5
6
7
171

compreenso
no qual uma
utilizada para
chaves so
conjunto dos

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 14.


14%8=6
0
1
2
3
4
5
6
7

172

14

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 20.


20%8=4
0
1
2
3
4

20

5
6
7

173

14

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 17.


17%8=1
0
1

17

2
3
4

20

5
6
7

174

14

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 36.


36%8=4
0
1

17

2
3
4

36
20

5
6
7

175

14

20

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 22.


22%8=6
0
1

17

2
3
4

36

20

14
22

14

5
6
7

176

Hashing Aberto ou Encadeado: Exemplo

Inserir chave 4.
4%8=4
0
1

17

2
3
4

4
36

20
36

14
22

14

5
6
7

177

20

Hashing Aberto ou Encadeado: Exemplo

Remover chave 17.


17%8=1
0
1

17

2
3
4

36

22

14

5
6
7

178

20

Hashing Aberto ou Encadeado: Exemplo

Remover chave 36.


36%8=4
0
1
2
3
4

36
20

22

14

5
6
7

179

20

Hashing Aberto ou Encadeado: Exerccio

Com base no que foi apresentado defina


a(s) estrutura(s) de dados necessria(s)
para a implementao de uma tabela
hashing aberta.
#define numEntradas 8
typedef struct _Hash
{
int chave;
struct _Hash *prox;
} Hash;
typedef Hash* Tabela[numEntradas];
180

Hashing Aberto ou Encadeado: Exerccio

Agora, implemente a funo de insero


de uma chave na tabela hashing aberta em
questo.

181