GV: NGUYỄN XUÂN VINH
CẤU TRÚC DỮ LIỆU
DATA STRUCTURES
MÔN: CẤU TRÚC DỮ LIỆU
[214331]
HASH TABLE
Nguyễn Xuân Vinh
1
/XX
12/3/15
GV: NGUYỄN XUÂN VINH
Giới thiệu
Các vấn đề cơ bản với ArrayList, Linked List
Bảng băm “hoàn hảo”
Hàm băm hoàn hảo
Phương pháp xây dựng hàm băm
Ưu điểm của bảng băm
Các cách giải quyết xung đột (collision)
Các bảng băm phổ biến (đọc them)
Java Map Interface
Map implementations in Java
HashMap example
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Nội dung
2
2
GV: NGUYỄN XUÂN VINH
Giới thiệu
MÔN: CẤU TRÚC DỮ LIỆU
Tất cả các thao tác
12/3/15
phải so sánh khoá!!!
/XX
Khắc phục?
3
3
Bài toán: cần lưu trữ các mẫu tin và thực hiện các thao tác
Thêm mẫu tin
Xoá mẫu tin
Tìm mẫu tin theo khóa
Tìm cách thức thực hiện một cách hiệu quả?
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Vấn đề cơ bản
4
4
Unsorted array
Sử dụng mảng để lưu mẫu tin, không có thứ tự
Thêm: thêm cuối nhanh O(1)
Xoá: chậm do tìm rồi xoá O(n)
Tìm kiếm: tuần tự chậm O(n)
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Vấn đề cơ bản
5
5
Sorted array
Sử dụng mảng lưu trữ mẫu tin, có thứ tự
Thêm: chèn vào đúng vị trí, chậm O(n)
Xoá: phải dời các phần tử phía sau, chậm O(n)
Tìm: nhị phân, nhanh O(logn)
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Vấn đề cơ bản
6
6
Linked list
Lưu trữ mẫu tin trong danh sách liên kết
Thêm: nhanh, O(1)
Xoá: nhanh khi xoá nút, chậm khi tìm O(n)
Tìm kiếm: tìm kiếm tuần tự O(n)
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Vấn đề cơ bản
7
7
Cấu trúc dữ liệu phức tạp hơn, nhưng thực thi tốt hơn
Tree BST
Hash table
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Vấn đề cơ bản
8
8
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
Array as table
0012345
An
8.15
0033333
Binh
90
0056789
Danh
5.68
9801010
Phuong
2.0
9802020
Minh
10.0
9903030
Thao
7.3
9908080
Tung
4.9
...
9
/XX
12/3/15
...
Vấn đề: lưu trữ 10,000,000 mẫu tin sinh viên và tìm kiếm theo mã số sinh viên.
Vấn đề: lưu trữ 10,000,000 mẫu tin sinh viên và tìm kiếm theo mã số sinh viên.
GV: NGUYỄN XUÂN VINH
Array as table
0
MÔN: CẤU TRÚC DỮ LIỆU
:
:
:
An
8.15
:
:
Binh
9.0
:
:
Danh
5.68
:
:
:
:
:
:
Tung
4.9
:
:
12345
:
33333
:
56789
:
9999999
/XX
12/3/15
9908080
Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0..9999999
Một cách “stupid” là lưu trữ mẫu tin trong mảng cực lớn 0..9999999
Index được sử dụng như là mã số sinh viên. Khi đó mẫu tin sv với
Index được sử dụng như là mã số sinh viên. Khi đó mẫu tin sv với
ms 0012345 được lưu trữ ở A[12345]!
ms 0012345 được lưu trữ ở A[12345]!
10
10
Dạng bảng băm với địa chỉ trực tiếp
Mỗi vị trí tương ứng một khoá trong U
Nếu 1 phần tử x có khoá k, thì T[k] chứa tham chiếu đến x
Ngược lại T[k] = Ø được thể hiện là null
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Array as table
-
U
-
0
1
(universe of key)
2
3
4
6
2
3
9
0
7
-
4
1
5
5
12/3/15
K (actual keys)
2
-
3
8
-
6
7
11
/XX
5
8
-
8
9
11
Lưu trữ mẫu tin trong mảng lớn: chỉ mục tương đương khóa
Thêm: rất nhanh O(1)
Xóa: rất nhanh O(1)
Tìm: rất nhanh O(1)
Nhưng lãng phí rất nhiều bộ nhớ!
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Array as table
12
12
GV: NGUYỄN XUÂN VINH
Hàm băm “hoàn hảo”
MÔN: CẤU TRÚC DỮ LIỆU
int Hash(KeyType key)
H(‘0012345’) = 134
Giả sử có hàm “magic” hash. Nó ánh xạ mã số của 1000
Giả sử có hàm “magic” hash. Nó ánh xạ mã số của 1000
H(‘0033333’) = 67
sinh viên vào các số 0..999, ánh xạ one to one. Không có
sinh viên vào các số 0..999, ánh xạ one to one. Không có
H(‘0056789’) = 764
2 mã số cùng giá trị ánh xạ.
2 mã số cùng giá trị ánh xạ.
…
13
/XX
12/3/15
H(‘9908080’) = 3
GV: NGUYỄN XUÂN VINH
Hàm băm “hoàn hảo”
MÔN: CẤU TRÚC DỮ LIỆU
0
3
Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu
Để lưu trữ 1 mẫu tin, gọi Hash(stud_id) và lưu
67
trữ vào vị trí Hash(stud_id) trong mảng.
trữ vào vị trí Hash(stud_id) trong mảng.
Để tìm một sinh viên, chỉ cần gọi
Để tìm một sinh viên, chỉ cần gọi
Hash(stud_id).
Hash(stud_id).
134
999
:
:
9908080
Tung
4.9
:
:
:
0033333
Binh
9.0
:
:
:
0012345
An
8.15
:
:
:
0056789
Danh
5.68
:
:
:
:
:
:
14
14
score
:
/XX
12/3/15
764
name
Magic hash
Thêm: rất nhanh O(1)
Xóa: rất nhanh O(1)
Tìm: rất nhanh O(1)
Thực tế rất khó xây dựng được hàm băm hoàn hảo (khi không gian khóa quá lớn)
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Bảng băm với hàm băm hoàn hảo
15
15
Dung hòa tốt giữa thời gian truy xuất và dung lượng bộ nhớ
Nếu ko giới hạn bộ nhớ: one-to-one, truy xuất tức thì
Nếu dung lượng bộ nhớ có giới hạn thì tổ chức khóa cùng địa chỉ
Bảng băm ứng dụng nhiều trong thực tế, thích hợp tổ chức dữ liệu có kích thước lớn và lưu trữ ngoài
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Ưu điểm bảng băm
16
16
GV: NGUYỄN XUÂN VINH
Hàm băm: biến đổi khóa thành chỉ mục trên bảng băm
Khóa có thể là dạng số hay dạng chuỗi
Chỉ mục được tính từ 0..M-1, với M là số chỉ mục của bảng băm
Hàm băm thường dùng: key % M, với M là độ lớn của bảng băm
Hàm băm tốt phải thoả yêu cầu
Tính toán nhanh.
Các khoá được phân bố đều trong bảng.
Ít xảy ra đụng độ.
Xử lý được các loại khóa có kiểu dữ liệu khác nhau.
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Hàm băm
17
17
GV: NGUYỄN XUÂN VINH
Hàm băm: Một số PP xây dựng
Hàm băm dạng bảng tra
Ví dụ: cho bảng chữ cái alphabet, chữ cái a được băm vào địa chỉ 0, chữ cái b được băm vào địa chỉ 1,..., của
bảng băm
18
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Hàm băm sử dụng phương pháp chia
Dùng số dư: h(x) = x % M
x là khóa, M là kích thước bảng băm (nên là số nguyên tố )
GV: NGUYỄN XUÂN VINH
Hàm băm: Một số PP xây dựng
Sử dụng phương pháp trung phương(Middle Square)
k
Với M = 2 (k>=1) (M là kích thước của mảng)
19
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
w
W = 2 (w: là số lượng bit của một số int = 32)
GV: NGUYỄN XUÂN VINH
Hàm băm: Một số PP xây dựng
Sử dụng phương pháp nhân
Sử dụng công thức
20
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
x là khóa, M là kích thước bảng
GV: NGUYỄN XUÂN VINH
Mỗi bảng băm ta cần xác định:
Tập khóa k
Tập địa chỉ M
Hàm băm
Khi xây dựng mong muốn các khóa ánh xạ vào các địa chỉ khác nhau
Thực tế thường xảy ra hai khóa cùng địa chỉ ⇒ Gọi là xung đột (collision)
Phải có chiến lược giải quyết xung đột!
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Collision!!!
22
22
GV: NGUYỄN XUÂN VINH
Collision: PP kết nối trực tiếp
Mỗi địa chỉ bảng băm tương ứng một DSLK
Các nút bị xung đột nối kết với nhau trên một DSLK
Danh sách liên kết từ 0 đến M-1
Khi tìm địa chỉ hàm băm f(key) sẽ xác định địa chỉ i ∈[0..M-1], ứng với danh sách thứ i chứa phần tử ⇒ tiếp tục
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
tìm kiếm trên danh sách liên kết
23
23
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
24
Collision: PP kết nối trực tiếp
Bảng băm có tập khóa là số nguyên, tập địa chỉ có 10 địa chỉ
Bảng
0
30
50
1
11
21
2
32
62
3
33
53
4
54
74
5
25
55
6
36
56
7
27
47
8
48
98
9
39
59
41
74
địa chỉ
57
69
GV: NGUYỄN XUÂN VINH
Collision: PP 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, nếu bị xung đột nữa thì băm lai lần 2,… Quá trình băm lại diễn ra
cho đến khi không còn xung đột nữa.
Các phép băm lại (rehash function) thường sẽ chọn địa chỉ khác cho các phần tử.
hi(key)=(h(key)+i) %M
25
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
với h(key) là hàm băm chính của bảng băm
GV: NGUYỄN XUÂN VINH
Collision: PP dò bậc hai (Quadratic Probing)
Hàm băm lại của phương pháp dò bậc hai là truy xuất các địa chỉ cách bậc 2.
Hàm băm lại hàm i được biểu diễn bằng công thức sau:
2
hi(key)=( h(key) + i ) % M
26
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
với h(key) là hàm băm chính của bảng băm.
Nếu đã dò đến cuối bảng thì trở về dò lại từ đầu bảng.
M nên là số nguyên tố.