Escolar Documentos
Profissional Documentos
Cultura Documentos
2007
(Aulas 1, 2 e 3)
Clodis Boscarioli
Agenda:
Estruturas de Índices;
Conceitos;
Tipos de Índices:
Primários;
Secundários;
Clustering;
Multiníveis;
Árvore B e B+;
Hash;
Exemplos.
Índice - Conceitos
índice(valor)
Estrutura de dados que recebe como entrada
uma propriedade de registro (por exemplo, um
valor de um ou mais campos) e encontra os
registros com essa propriedade rapidamente;
Um índice permite localizar um registro sem
ter que examinar mais que uma pequena
fração dos registros possíveis;
O(s) campo(s) cujos valores o índice se Blocos contendo
baseia formam a chave de pesquisa; registros
Índice Denso
Seqüência de blocos contendo apenas as chaves dos
registros e os ponteiros para os próprios registros
Índice denso = (chave-ponteiro, registro)
Índice Esparso
Usa menos espaço de armazenamento que o índice
denso ao custo de um tempo um pouco maior para
localizar um registro dada a sua chave
Índice esparso = (chave-ponteiro, blocos de dados)
10
Arquivo seqüencial
20
30
40
50
60
Exemplo:
40
40
B C D nível 1
E F G H I nível 2
J K nível 3
Sub-árvore de grau 2
Árvore de grau 3
P1 K1 ... Ki-1 Pi Ki ... Kq-1 Pq
Um nó de uma
árvore de pesquisa
X X X
Árvores de Busca
5
3 6 9
1 7 8 12
Uma árvore de
busca de ordem p = 3
Árvores B
Árvore de busca projetada com dois objetivos:
Manter a árvore balanceada e
Evitar o desperdício de espaço dentro de um nó, à
custa de maior complexidade nos algoritmos de
inserção e remoção.
X X X
dados dados
3 8
1 4 6 7 9 12
Capacidade das Árvores B
Objetivo: Cada nó da árvore corresponde a um bloco de disco, por exemplo:
Tamanho da chave de pesquisa V = 9 bytes
Tamanho do ponteiro de blocos P = 6 bytes
Tamanho do bloco de disco B = 512 bytes
Cada nó pode ter no máximo:
p-1 ponteiros de dados
p-1 valores de chave de pesquisa
p ponteiros de árvore
(p-1) x 6 + (p-1) x 9 + p x 6 ≤ 512
21 x p ≤ 527
p = 25
Capacidade máxima em número de chaves:
24 + 25 x 24 + 25 x 25 x 24 + 25 x 25 x 25 x 24 + ...
(extremamente improvável sob inserções e remoções aleatórias)
O número mínimo de chaves em um nó é p/2. Navathe et. Al (2005) afirmam que, por análise
e simulação, após várias inserções e remoções em uma árvore B, os nós se estabilizam com
aproximadamente 69% da capacidade. Nesta situação, separação e combinação de nós
ocorrem muito raramente.
p x 0,69 = 27 x 0,69 = 17
capacidade média: 16 + 17 x 16 + 17 x 17 x 16 + 17 x 17 x 17 x 16 + ...
16 288 4.912 83.520
Árvores B+
Os nós de uma árvore-B+. (a) Nó interno de uma árvore-B+ com q - 1 valores de busca. (b) Nó
folha de uma árvore-B+ com q - 1 valores de busca e q - 1 ponteiros de dados.
Capacidade de Árvores B+
Mesmo exemplo anterior:
Tamanho da chave de pesquisa V = 9 bytes
Tamanho do ponteiro de blocos P = 6 bytes
Tamanho do bloco de disco B = 512 bytes
Cada nó pode ter no máximo:
p-1 valores de chave de pesquisa
p ponteiros de árvore
(p-1) x 9 + p x 6 ≤ 512
15 x p ≤ 521
p = 34 (maior do que na árvore B correspondente)
3 7 8
1 3 4 5 6 7 8 9 12
Um exemplo de inclusão em
uma árvore-B+ de ordem p = 3 e
pfolha = 2.
Exemplo:
Um exemplo de remoção em
uma árvore-B+.
Índice Estruturado por Hash
Hash Estático
0 …
h(chave) mod N
1 …
chave 2
h
h = função hash …
N-1
0 … N=6
h(14) mod 6 = 2
1 …
….
14 2 >
<14,*
h
3
4
5 …
7 2 Cheia
h
3
4
5 …
25 2
h
3
4
5 …
h(x) = a*x + b
a, b: parâmetros de ajuste
Hash - Custos
Alternativa 1:
Periodicamente modificar a função hash e
reestruturar todo o arquivo de modo a evitar páginas
de overflow.
«rehash» toma muito tempo.
Indice não pode ser utilizado durante o processo de
«rehash».
Alternativa 2: Hash dinâmicos
Extensível
Hash Extensível
Bucket 1
1
2 Bucket 2
00 2
Últimos
1* 5* 21* Bucket B
2 dígitos da
01 representação
2 binária de h(k)
10* Bucket C
10
2
11 15* 7* 19* Bucket D
2 Inserindo 13*
4* 12* 32* 16*
2
00 2
1* 5* 21* 13*
01
2
10*
10
2
11 15* 7* 19*
2 Inserindo 20*
4* 12* 32* 16*
2
00 2
1* 5* 21* 13*
01
2
10*
10
2
11 15* 7* 19*
2
Diretório
4* 12* 20*
Exemplo – Inserção
Local Inserindo 20*
Global 3
32* 16* Bucket A1
2
3
N = 8 = 23
000 2
00
001 1* 5* 21* 13* Bucket C
010 Últimos
01
011 2 3 dígitos da
representação
100 10* Bucket C binária de h(k)
10
101 2
110
11 15* 7* 19* Bucket D
111
3
Diretório
4* 12* 20* Bucket A2
Exemplo – Inserção
2
3
Global 4* 12* 32* 16*
Inserindo 9*
2
2
3
1* 5* 21* 13*
000
001 2
10*
010
011 2
100 15* 7* 19*
101 3
110 4* 12* 20*
111
100
Diretorio
Diretório
Exemplo – Inserção
2
3
Global 4* 12* 32* 16*
Inserindo 9*
3
2
3
1* 9*
000
001 2
10*
010
011 2
100 15* 7* 19*
101 3
110 4* 12* 20*
111
100 3
Diretorio 5* 21* 13*
Regra Geral para Inserção de k*
Se Nível global = d
Calcula h(k);
Considera a entrada m do diretório, onde
m = número correspondente aos d últimos dígitos da representação
binária de h(k);
Dirige-se para o bucket indicado;
Se o bucket estiver cheio e nível local = d
Divide o bucket e duplica o diretório de buckets;
Se o bucket estiver cheio e nível local = d-1
Divide o bucket, mas não duplica diretório.
Hash - Possíveis Problemas