Professional Documents
Culture Documents
Hàm băm Các phương pháp giải quyết đụng độ
Hàm băm Các phương pháp giải quyết đụng độ
Hàm băm Các phương pháp giải quyết đụng độ
11/07/2020 1
Hàm băm
Các phương pháp giải quyết đụng độ
11/07/2020 2
1
11/07/2020
Đặt vấn đề
❖Phương pháp tìm kiếm trong các chương
trước chủ yếu dựa vào khóa
➢Mảng
➢Danh sách liên kết
➢Cây nhị phân tìm kiếm
Tìm kiếm bằng cách so sánh lần lượt các
phần tử Thời gian tìm kiếm không nhanh và
phụ thuộc N (số phần tử)
11/07/2020 3
11/07/2020 4
2
11/07/2020
Hàm băm
❖Hàm băm (hash function) là hàm biến đổi
khóa k thành địa chỉ trong bảng băm
❖Phép biến đổi khóa: là một ánh xạ khoá thành
địa chỉ
ℎ: 𝑈 → 0, 1, … , 𝑚 − 1
𝑘 → ℎ(𝑘)
❖Trong đó
➢U là tập các khóa
➢{0, 1, …, m – 1} là tập các địa chỉ trên bảng băm
➢Giá trị h(k) gọi là hash code hoặc địa chỉ
11/07/2020 5
Hàm băm
11/07/2020 6
3
11/07/2020
11/07/2020 7
Sự đụng độ (Collision)
❖Sự đụng độ hay xung đột địa chỉ
➢Một cách lý tưởng, hàm băm sẽ ánh xạ mỗi
khoá vào một slot riêng biệt của bảng T
11/07/2020 8
4
11/07/2020
Sự đụng độ
❖Đụng độ là
∃𝑘𝑖, 𝑘𝑗 ∈ 𝐾: 𝑘𝑖≠ 𝑘𝑗 , ℎ(𝑘𝑖 ) = ℎ(𝑘𝑗 )
11/07/2020 9
11/07/2020 10
10
5
11/07/2020
11/07/2020 12
12
void init()
{
z = new Node;
z->next = z;
for (int i = 0; i < M; i++)
heads[i] = z;
}
11/07/2020 13
13
6
11/07/2020
11/07/2020 14
14
11/07/2020 15
15
7
11/07/2020
11/07/2020 16
16
17
8
11/07/2020
Node* insert(int k)
11/07/2020 19
19
9
11/07/2020
11/07/2020 20
20
21
10
11/07/2020
z->key = k;
while (t->key < k)
{
t = t->next;
}
if (t->key != k)
return z;
return t;
}
11/07/2020 22
22
23
11
11/07/2020
struct Node
{
int key;
int next;
};
Node T[M];
int r = M - 1;
11/07/2020 24
24
11/07/2020 25
25
12
11/07/2020
11/07/2020 26
26
11/07/2020 27
27
13
11/07/2020
11/07/2020 28
28
11/07/2020 29
29
14
11/07/2020
11/07/2020 30
30
int insert(int x)
PP nối kết
{
bảng băm
} while ((T[i].key != x) && (i != -1));
if (i == -1)
{
while (r != -1 && T[r].key != -1)
r--;
if (r < 10) return -1;
if (r != -1) T[j].next = r;
i = r;
}
}
if (i != -1 && T[i].key != x)
T[i].key = x;
return i;
11/07/2020 31
}
31
15
11/07/2020
32
Bài tập
Bài 1: Dùng cấu trúc bảng băm – phương
pháp kết nối trực tiếp, quản lý 5000 phần từ
kiểu số int.
a. Khai báo cấu trúc bảng băm
b. Viết thủ tục khởi bảng băm rỗng
c. Viết thủ tục thêm một phần tử vào bảng
băm
d. Viết thủ tục tìm kiếm một phần tử trong
bảng băm
11/07/2020 33
33
16
11/07/2020
Bài tập
Bài 2: Dùng cấu trúc bảng băm – phương
pháp kết nối hợp nhất, quản lý 200 phần từ
kiểu số int.
a. Khai báo cấu trúc bảng băm
b. Viết thủ tục khởi bảng băm rỗng
c. Viết thủ tục thêm một phần tử vào bảng
băm
d. Viết thủ tục tìm kiếm một phần tử trong
bảng băm
11/07/2020 34
34
11/07/2020 35
35
17
11/07/2020
11/07/2020 36
36
11/07/2020 37
37
18
11/07/2020
11/07/2020 38
38
19