Tải bản đầy đủ (.pptx) (27 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Trần Minh Thái (2016)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (252.53 KB, 27 trang )

Chương 7. Bảng băm
(Hash Table)
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn
1


Nội dung
1. Khái niệm
2. Đặc điểm và cấu trúc
3. Một số phương pháp
4. Giải quyết đụng độ

2


Truy xuất trực tiếp
Giả sử cần lưu trữ thông tin có các đặc điểm
nhau:
 Dữ liệu có các khóa (key) trong phạm vi 0…m-1
 Các khóa này là riêng biệt (không trùng nhau)

 Giải pháp?
3


Truy xuất trực tiếp
 Tạo một mảng T[0..m-1] trong đó
 T[i] = x


nếu x  T và key[x] = i

 T[i] = NULL cho trường hợp ngược lại

 Cấu trúc này được gọi là bảng truy xuất trực
tiếp (direct-address table)
 Độ phức tạp truy xuất: O(1)
 Tuy nhiên?
4


Tuy xuất trực tiếp
 Chỉ thích hợp cho miền giá trị m của các
khóa tương đối nhỏ
 Giả sử khố là số ngun 32-bit:
1. Bảng sẽ có kích thước 232 (hơn 4 tỉ ơ)
2. Giả sử khơng có rào cản về bộ nhớ thì cũng mất
thời gian để khởi tạo giá trị NULL
 Giải pháp: ánh xạ những khoá này thành miền nhỏ
hơn từ 0...p-1  Hash Table
5


Bảng băm (Hash Table)

6


Thành phần dữ liệu
K: tập các khoá (set of keys)

A: tập các địa chỉ (set of addresses)
HF(k): hàm băm dùng để ánh xạ một khoá k
từ tập các khoá K thành một địa chỉ tương
ứng trong tập A

7


Các thao tác
Khởi tạo (Initialize)
Kiểm tra rỗng (Empty)
Lấy kích thước của bảng băm (Size)
Tìm kiếm (Search)
Thêm mới phần tử (Insert)
Loại bỏ (Remove)
Sao chép (Copy)
Duyệt (Traverse)
8


Vấn đề Bảng băm
 O(1) cho tất cả các thao tác
 Khóa khơng phải là một chỉ số mảng trực
tiếp mà chỉ số thơng qua hàm h(key) – hàm
băm
Ví dụ: myArray[h(key)]

 Vấn đề: h()?

9



Vấn đề Bảng băm
U
(universe of keys)

h(k1)

k1
K
(actual
keys)

0

k4

h(k4)
k5

h(k2)
h(k5)

k2

k3

h(k3)
p-1


10


Các loại Bảng băm
Bảng băm đóng: mỗi khóa ứng với một địa
chỉ, thời gian truy xuất là hằng số
Bảng băm mở: một số khóa có cùng địa chỉ,
mỗi mục địa chỉ sẽ là một DSLK các phần tử
có cùng địa chỉ, thời gian truy xuất có thể bị
suy giảm
11


Hàm băm?
Hàm biến đổi giá trị khoá (số, chuỗi…) thành
địa chỉ, chỉ mục trong bảng băm
Hash value

Giá trị
khoá

Hàm
băm

Địa chỉ
hoặc chỉ mục

12



Hàm băm
Ví dụ : hàm băm biến đổi khố dạng chuỗi gồm n kí tự thành 1 địa chỉ (số
nguyên)
int HashFunc(String s)
{
int n = s.Length, i=0;
int sum = 0;
while( n-- ) sum = sum + s[i++];
return sum % 256;
}
Tính địa chỉ của khố “AB” : hashfunc(“AB”)  131
Tính địa chỉ của khoá “BA” : hashfunc(“BA”)  131
Khi hàm băm 2 khố vào cùng 1 địa chỉ thì gọi là đụng độ (Collision)
13


u cầu của hàm băm
Tính tốn nhanh
Các khố được phân bố đều trong bảng
Ít xảy ra đụng độ

14


Hàm băm dạng bảng tra
Khố

Địa chỉ Khóa

Địa chỉ


Khóa

Địa chỉ Khóa

Địa chỉ

a

0

h

7

o

14

v

21

b

1

I

8


p

15

w

22

c

2

j

9

q

16

x

23

d

3

k


10

r

17

y

24

e

4

l

11

s

18

z

25

f

5


m

12

t

19

/

/

g

6

n

13

u

20

/

/

15



Hàm băm sử dụng phương pháp chia
Dùng số dư:
h(k) = |k| mod m
Với k là khố, m là kích thước của bảng
Chọn giá trị m?
 m là nguyên tố
m=100
Khoá
Địa chỉ
325
25
125
25
147
47

m=97 (nguyên tố)
Khoá
Địa chỉ
325
34
125
28
147
50
16



Hàm băm sử dụng phương pháp
nhân
h(k) = m(kA - kA)
Với k là khóa, m là kích thước bảng, A là
hằng số: 0 < A < 1
Chọn m và A?
Thường chọn m = 2p
Knuth: A = (5 - 1)/2
 0.618033987 được xem là tốt
17


Hàm băm sử dụng phương pháp
nhân

m=100, A=0.61803

M=100, A=0.52173

Khoá

Địa chỉ

Khoá

Địa chỉ

325

86


325

56

125

25

125

21

147

85

147

69

18


Hàm băm phổ quát
 Một tập các hàm băm H là phổ quát (universal ) nếu
hH và 2 khoá k, ta có xác suất:
Pr{h(k) = h(l)} <= 1/m
với m là kích thước bảng
 Để xác suất xảy ra đụng độ thấp, khởi tạo một tập các

hàm băm H phổ quát và từ đó h được chọn ngẫu nhiên

19


Đụng độ (collision) địa chỉ
Xảy ra khi h(x) ánh xạ hai khố vào cùng vị trí
U
(universe of keys)

h(k )

collision1

k1
K
(actual
keys)

0

k4

k2

h(k4)

k5

h(k

h(k
) h(k5)
2) 2=
k3

h(k3)
p-1
20


Ví dụ
0

• Sử dụng bảng băm có kích



1

thước N = 10,000

025-612-0001

2
3

• Hàm băm

981-101-0002




4



h(x) = 4 chữ số cuối của x

451-229-0004

9997



9998
9999

200-751-9998



21


Ví dụ
0

• Giả sử chèn thêm khóa




1

176-354-9998

025-612-0001

2
3

 Giá trị băm trùng với

981-101-0002



4



khoá 200-751-9998 !!!

451-229-0004

9997



9998
9999


200-751-9998



176-354-9998

22


Giải quyết đụng độ bằng phương
pháp nối kết

23


Giải quyết đụng độ bằng cách băm lại
Phương pháp dò tuyến tính (Linear Probe)
Nếu băm lần đầu bị xung đột thì băm lại lần
1, lần 2,… Quá trình băm lại diễn ra cho đến
khi khơng cịn xung đột nữa
hi(key)=(h(key)+i) mode m
với h(key) là hàm băm
chính của bảng băm
24


Ví dụ
• h(x) = x mod 13
• Chèn các khố theo thứ tự 18, 41, 22, 44, 59, 32, 31, 73


0 1 2 3 4 5 6 7 8 9 10 11 12

41

18 44 59 32 22 31 73

0 1 2 3 4 5 6 7 8 9 10 11 12

25


×