Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 10: Bảng băm - Hoàng Thị Điệp
Nhận xét (2/2)
Thăm dò bình phương
Ưu điểm: tránh được nhược điểm của thăm dò tuyến
tính
Nhược điểm: không cho phép ta tìm đến tất cả các vị
trí trong mảng
phép insert có thể không thực hiện được
nếu cỡ của mảng là số nguyên tố, thì thăm dò bình phương
cho phép ta tìm đến một nửa số vị trí trong mảng
Băm kép
nếu cỡ của mảng và bước thăm dò h2(k) nguyên tố
cùng nhau thì phương pháp băm kép cho phép tìm
đến tất cả các vị trí trong mảng
21 trang |
Chia sẻ: thucuc2301 | Lượt xem: 836 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 10: Bảng băm - Hoàng Thị Điệp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Giảng viên: Hoàng Thị Điệp
Khoa Công nghệ Thông tin – Đại học Công Nghệ
Bài 10: Bảng băm
Cấu trúc dữ liệu và giải thuật HKI, 2013-2014
Kiểm tra viết, 15 phút
diepht@vnu 2
(Sinh viên có thể sử dụng tài liệu.)
1. Nêu 2 hàm băm
2. Nêu 2 phương pháp giải quyết va chạm trong bảng
băm
nói tới trong Chương 9 Giáo trình.
Nội dung chính
Giới thiệu phương pháp băm
Hashing
Các hàm băm
Hash function
Các chiến lược giải quyết va chạm
Collision resolution
diepht@vnu 3
KDLTT từ điển
Trường hợp riêng của tập
động khi ta chỉ quan tâm tới
tìm kiếm, xen, loại
Là tập hợp trong đó mỗi phần
tử là một cặp (khóa, dữ liệu)
Có thể tìm kiếm theo khóa
Được sắp hoặc không được
sắp
Các phần tử có thể có cùng
khóa*
Dictionary vs. Map
Ứng dụng
Từ vựng – nghĩa
Tên miền – địa chỉ IP
Mã sinh viên – hồ sơ SV
Các phép toán
find(k) trả về 1 phần tử có
khóa k. Nếu không thấy trả
về NULL.
findAll(k)
insert(k, v) thêm phần tử (k,
v) và trả về con trỏ tới nó
erase(k) loại bỏ phần tử bất
kì có khóa bằng k
erase(p) loại bỏ phần tử trỏ
bởi p
size() trả về số lượng phần tử
empty() kiểm tra xem từ điển
rỗng hay không
diepht@vnu 4
Phương án cài KDLTT từ điển
Mảng được sắp / không được sắp
DSLK đơn/kép được sắp / không được sắp
Cây tìm kiếm nhị phân
diepht@vnu 5
Cài KDLTT từ điển bằng mảng
Nếu khoá của dữ liệu là số nguyên không âm và nằm
trong khoảng [0..SIZE-1]
có thể sử dụng một mảng data có cỡ SIZE
dữ liệu có khoá k sẽ được lưu trong data[k]
tìm kiếm, xen, loại đều thực hiện trong thời gian O(1)
Thực tế không khả thi vì
số phần tử dữ liệu có thể rất nhỏ so với SIZE
khoá có thể không phải là số nguyên
Ta muốn lợi dụng tính ưu việt của phép truy cập trực
tiếp của mảng
diepht@vnu 6
Phương pháp băm
diepht@vnu 7
Lưu tập dữ liệu trong mảng T với cỡ là SIZE
Hàm băm: là hàm ứng với mỗi giá trị khoá k của dữ liệu với một chỉ
số i (0 <= i <= SIZE-1)
Dữ liệu này sẽ được lưu trong T[i]
h : K {0,1,,SIZE-1}
0
1
i
SIZE-1
Tính địa chỉ
Hàm băm h
Tập các giá trị khoá
Mảng T
diepht@vnu 8
Sự va chạm
Nếu
có k1 ≠ k2 thì h(k1) ≠ h(k2), và
việc tính chỉ số h(k) ứng với mỗi khoá k chỉ đòi hỏi thời
gian hằng
thì các phép toán tìm kiếm, xen, loại chỉ cần thời gian
O(1)
Va chạm
Trong thực tế k1 ≠ k2 có thể cho h(k1) = h(k2)
Giải quyết va chạm như thế nào?
diepht@vnu 9
Hàm băm
Hàm băm tốt
tính nhanh và dễ dàng
đảm bảo ít va chạm
Một số hàm băm
Khóa là số nguyên không âm
Phương pháp chia
Phương pháp nhân
Khóa là xâu ký tự: đổi xâu thành số nguyên không âm
diepht@vnu 10
Khóa là số nguyên không âm
Phương pháp chia
h(k) = k mod SIZE
nhạy cảm với cỡ của bảng
băm
chọn SIZE để hạn chế xảy ra
va chạm
số nguyên tố có dạng đặc
biệt, chẳng hạn có dạng
4k+3
Phương pháp nhân
h(k) = (αk - αk) . SIZE
Ký hiệu x chỉ phần nguyên
của số thực x
Thực tế thường chọn
61803399,01 ≈Φ= −α
diepht@vnu 11
Khoá là xâu ký tự
Trước tiên, đổi các xâu ký tự thành các số nguyên, dùng
bảng mã ASCII
Xâu ký tự có thể xem như một số trong hệ đếm cơ số 128
Sau đó chuyển sang hệ đếm cơ số 10
Ví dụ
“NOTE” ‘N’.1283 + ‘O’.1282 + ‘T’.128 + ‘E’ =
= 78.1283 + 79.1282 + 84.128 + 69
Nhược điểm: xâu dài cho kết quả vượt quá khả năng biểu diễn của
máy tính
Cải tiến: Xâu ký tự thường được tạo thành từ 26 chữ cái và
10 chữ số, và một vài ký tự khác. Thay 128 bởi 37
Tính số nguyên ứng với xâu ký tự theo luật Horner
Ví dụ
“NOTE” 78.373 + 79.372 + 84.37 + 69=
= ((78.37 + 79).37 +84).37 +69
diepht@vnu 12
Giải quyết va chạm
Dữ liệu d1 với khoá k1 đã được lưu trong T[i], h(k1)=i.
Ta cần thêm dữ liệu d2 với khoá k2
nếu h(k2) = i thì dữ liệu d2 cần được đặt vào vị trí nào?
Các phương pháp
Phương pháp định địa chỉ mở (open
addressing/probing)
mỗi khi xảy ra va chạm, tiến hành thăm dò để tìm một vị trí còn
trống trong bảng và đặt dữ liệu mới vào đó
Phương pháp tạo dây chuyền (separate chaining)
tạo ra một CTDL lưu giữ tất cả các dữ liệu có cùng vị trí i và
“gắn” CTDL này vào vị trí đó trong bảng
diepht@vnu 13
Phương pháp định địa chỉ mở
Giả sử vị trí ứng với khoá k là i, i=h(k)
Từ vị trí này, lần lượt xem xét các vị trí i0, i1 , i2 ,, im ,
Trong đó i0 = i, im là vị trí thăm dò lần thứ m.
Dãy này được gọi là dãy thăm dò.
Xác định dãy thăm dò
Thăm dò tuyến tính (linear probing)
Dãy thăm dò là i , i+1, i+2 ,
Thăm dò bình phương (quadratic probing)
Dãy thăm dò là i , i + 12, i + 22, , i + m2,
Băm kép (double hashing)
Dãy thăm dò là h1(k) + m h2(k), với m = 0, 1, 2,
diepht@vnu 14
Các phép toán
Tìm kiếm? Xen? Loại?
Minh họa
SIZE = 11
Thăm dò tuyến tính
insert(388) => T[3]
insert(130) => T[9]
insert(13) => T[2]
insert(14) => T[3] => T[4]
insert(926) => T[2] => T[3]
=> T[4] => T[5]
insert(47) => T[3] => T[4] =>
T[5] => T[6]
find(47)
remove(926)..
find(47)
remove(388), find(926)
diepht@vnu 15
0 1 2 3 4 5 6 7 8 9 10
{không có data,
data bị xóa,
có data}
Nhận xét (1/2)
Thăm dò tuyến tính
Ưu điểm: cho phép xét tất cả các vị trí trong mảng
phép insert luôn thực hiện được, trừ khi mảng đầy
Nhược điểm:
dữ liệu tập trung thành các đoạn
tìm kiếm tuần tự trong từng đoạn
diepht@vnu 16
Nhận xét (2/2)
Thăm dò bình phương
Ưu điểm: tránh được nhược điểm của thăm dò tuyến
tính
Nhược điểm: không cho phép ta tìm đến tất cả các vị
trí trong mảng
phép insert có thể không thực hiện được
nếu cỡ của mảng là số nguyên tố, thì thăm dò bình phương
cho phép ta tìm đến một nửa số vị trí trong mảng
Băm kép
nếu cỡ của mảng và bước thăm dò h2(k) nguyên tố
cùng nhau thì phương pháp băm kép cho phép tìm
đến tất cả các vị trí trong mảng
diepht@vnu 17
Phương pháp tạo dây chuyền
diepht@vnu 18
Ưu điểm
số dữ liệu được lưu không phụ thuộc vào cỡ của mảng
Các phép toán
Tìm kiếm?
Xen?
Loại?
T
Hàm băm
h
Hiệu quả của phương pháp băm
Tham số α
Băm đ/c mở: mức độ đầy (load factor)
α tăng thì khả năng va chạm tăng
Khi thiết kế, cần đánh giá max của N để lựa chọn SIZE
α không nên vượt quá 2/3
Băm dây chuyền: độ dài trung bình của một dây chuyền
SIZE
N
=α
Băm đ/c mở,
Thăm dò tuyến tính
Băm đ/c mở,
Thăm dò bình
phương
Băm dây chuyền
Thời gian
trung
bình
Tìm kiếm
thành công
Tìm kiếm
thất bại α
α
11+( )
α
α−− 1ln
α−1
1
−
+
α1
11
2
1
( )
−
+ 21
11
2
1
α
diepht@vnu 19
diepht@vnu 20
Chuẩn bị tuần tới
Lý thuyết: Đọc chương 10 (Hàng ưu tiên)
Thực hành: Cài đặt bảng băm
diepht@vnu 21
Các file đính kèm theo tài liệu này:
- hoang_thi_diepw09_hashing_6313_2032020.pdf