Dynamic Hashing
Dynamic Hashing
function h is treated as a 2
binary number and 00 1* 5* 21* Bucket B
interpreted as an 10
10* Bucket C
offset into the directory 11
00 Bucket A
4* 12* 32* 16*
01 Bucket B
5 = 101 1* 5* 21*
10
Bucket C
10*
11
Bucket D
15* 7* 19*
DIRECTORY
DATA PAGES
Extendible Hashing: Inserting Entries
An entry can be inserted as follows:
Find the appropriate bucket (as in search)
Split the bucket if full and redistribute contents
(including the new entry to be inserted) across
the old bucket and its “split image”
Double the directory if necessary
Insert the given entry
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
given entry
00 Bucket A
4* 12* 32* 16*
01 Bucket B
13 = 1101 1* 5* 21* 13*
10
Bucket C
10*
11
Bucket D
15* 7* 19*
DIRECTORY
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
given entry
00 Bucket A
4* 12* 32* 16*
01 Bucket B
20 = 10100 1* 5* 21* 13*
10
Bucket C
10*
11
Bucket D
15* 7* 19*
DIRECTORY
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
given entry
Bucket A
32* 16*
Example: insert 20* 2
00
Bucket B
1* 5* 21* 13*
01
10
20 = 10100 Bucket C
11 10*
DIRECTORY
Bucket D
15* 7* 19*
Bucket A2
Is this enough? 4* 12* 20*
(`split image'
of Bucket A)
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
given entry
Bucket A
32* 16*
Example: insert 20* 2
00
Bucket B
1* 5* 21* 13*
01
10
20 = 10100 Bucket C
11 10*
DIRECTORY
Bucket D
15* 7* 19*
Example: insert 9* 3
000 1* 9* Bucket B
001
010
10* Bucket C
9 = 1001 011
100
101 15* 7* 19* Bucket D
110
Almost there… 111
4* 12* 20* Bucket A2
(`split image‘ of A)
DIRECTORY
5* 21* 13* Bucket B2
(`split image‘ of B)
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
given entry
GLOBAL DEPTH 32* 16* Bucket A
Example: insert 9* 3
000 1* 9* Bucket B
001
010
10* Bucket C
9 = 1001 011
100
There was no need to 101 15* 7* 19* Bucket D
double the directory! 110
111
4* 12* 20* Bucket A2
(`split image‘ of A)
When NOT to double the DIRECTORY
directory? 5* 21* 13* Bucket A2
(`split image‘ of A)
Extendible Hashing: Inserting Entries
Find the appropriate bucket (as in search), split the bucket
if full, double the directory if necessary and insert the
LOCAL DEPTH
given entry 3
GLOBAL DEPTH 32* 16* Bucket A
Example: insert 9* 3 3
000 1* 9* Bucket B
001 2
010
10* Bucket C
9 = 1001 011
100 2
101 15* 7* 19* Bucket D
If a bucket whose local depth 110 3
equals to the global depth is 111
4* 12* 20* Bucket A2
split, the directory must be (`split image‘ of A)
doubled DIRECTORY 3
5* 21* 13* Bucket A2
(`split image‘ of A)
Extendible Hashing: Inserting Entries
Example: insert 9*
LOCAL DEPTH 3
Repeat… 32* 16* Bucket A
GLOBAL DEPTH
FULL, hence, split!
3 2
000 1* 5* 21* 13* Bucket B
001
010 2
9 = 1001 011 10* Bucket C
100
101 2
Because the local depth 110 15* 7* 19* Bucket D
(i.e., 2) is less than the 111
global depth (i.e., 3), NO 3
need to double the DIRECTORY 4* 12* 20* Bucket A2
directory (`split image'
of Bucket A)
Extendible Hashing: Inserting Entries
Example: insert 9*
LOCAL DEPTH 3
Repeat… 32* 16* Bucket A
GLOBAL DEPTH
3 3
000 1* 9* Bucket B
001 2
010
10* Bucket C
9 = 1001 011
100 2
101 15* 7* 19* Bucket D
110 3
111
4* 12* 20* Bucket A2
(`split image‘ of A)
DIRECTORY 3
5* 21* 13* Bucket B2
(`split image‘ of B)
Extendible Hashing: Inserting Entries
Example: insert 9*
LOCAL DEPTH 3
Repeat… 32* 16* Bucket A
GLOBAL DEPTH
3 3
000 1* 9* Bucket B
001 2
010
10* Bucket C
9 = 1001 011
100 2
101 15* 7* 19* Bucket D
FINAL STATE! 110 3
111
4* 12* 20* Bucket A2
(`split image‘ of A)
DIRECTORY 3
5* 21* 13* Bucket B2
(`split image‘ of B)
Extendible Hashing: Inserting Entries
Example: insert 20*
FULL, hence, split!
Repeat… LOCAL DEPTH 2
Bucket A
GLOBAL DEPTH 4* 12* 32* 16*
2 2
Bucket B
00 1* 5* 21* 13*
01
20 = 10100
10 2
Bucket C
11 10*
Because the local depth
and the global depth are
DIRECTORY 2
both 2, we should double
Bucket D
the directory! 15* 7* 19*
DATA PAGES
Extendible Hashing: Inserting Entries
Example: insert 20*
Repeat… LOCAL DEPTH 2
Bucket A
GLOBAL DEPTH 32*16*
2 2
00 1* 5* 21*13* Bucket B
01
10 2
20 = 10100 11 10* Bucket C
2
DIRECTORY Bucket D
15* 7* 19*
Is this enough?
2
4* 12* 20* Bucket A2
(`split image'
of Bucket A)
Extendible Hashing: Inserting Entries
Example: insert 20*
LOCAL DEPTH 2
Repeat… 32* 16* Bucket A
GLOBAL DEPTH
3 2
000 1* 5* 21* 13* Bucket B
001
010 2
3 2
000 1* 5* 21* 13* Bucket B
001
2
FINAL STATE! 010
011 10* Bucket C
100
101 2
32*44* 36*
Level = 0 h0 000 00
5* = 101 01 9* 25* 5*
Data entry r
001 01 with h(r)=5
32*44* 36*
000 00
001 01 9* 25* 5*
31*35* 7* 11*
011 11
Add an overflow page and
insert data entry
Linear Hashing: Inserting Entries
Example: insert 43*
32*44* 36*
000 00
001 01 9* 25* 5*
000 00 32*
001 01 9* 25* 5*
000 00 32*
Next=1
001 01 9* 25* 5*
001 01 9* 25*
100 00 44*36*
101 01 5* 37*29*
Add an overflow page and
insert data entry 110 10 14*30*22*
Linear Hashing: Inserting Entries
Another Example: insert 50*
Level=0, N= 4
PRIMARY OVERFLOW
Level = 0 h0 h1 h0 PAGES PAGES
50* = 110010 10
000 00 32*
001 01 9* 25*
100 00 44*36*
111 11 31*7*
Linear Hashing: Inserting Entries
Another Example: insert 50*
Level=0
PRIMARY OVERFLOW
h1 h0 PAGES PAGES
Next=0
Level = 0 h0 000 00 32*
50* = 110010 10
001 01 9* 25*
111 11 31*7*
Linear Hashing: Inserting Entries
Another Example: insert 50*
Level=1
PRIMARY OVERFLOW
h1 h0 PAGES PAGES
Next=0
Level = 0 h0 000 00 32*
50* = 110010 10
001 01 9* 25*
111 11 31*7*
Linear Hashing: Deleting Entries
Deletion is essentially the inverse of insertion
If the last bucket in the file is empty, it can be removed and Next can be
decremented