• Ánh xạ khóa sang số nguyên (vị trí trong bảng băm) • Nếu nhiều khóa ánh xạ sang cùng một số nguyên. (cùng vị trí trong bảng băm) thì sẽ dẫn đến đụng độ[r]
(1)Bảng băm
(Hash Tables)
Nguyễn Mạnh Hiển
(2)Bảng băm
• Các phần tử dạng cặp khóa-giá trị (key-value) • Mỗi phần tử lưu trữ vào ô
mảng tùy theo khóa
• Thực phép tìm/chèn/xóa thời gian O(1) • Khơng hiệu với thao tác địi hỏi thơng tin thứ
tự:
(3)Ví dụ bảng băm
Mỗi phần tử cặp khóa-giá trị:
- Tên khóa
(4)So sánh cấu trúc liệu
• So sánh thời gian tìm kiếm:
− Vector danh sách liên kết: O(N) − Cây AVL: O(log N)
(5)Hàm băm (hash function)
• Ánh xạ khóa sang số ngun (vị trí bảng băm) • Nếu nhiều khóa ánh xạ sang số nguyên
(cùng vị trí bảng băm) dẫn đến đụng độ
− Đụng độ giảm khóa phân bố đồng bảng băm
(6)Một hàm băm đơn giản
• Gọi:
− key: khóa có giá trị ngun
− tableSize: kích thước bảng băm
• Một hàm băm đơn giản dùng phép chia lấy phần dư: hash(key) = key % tableSize
• Giả sử:
− key = 24, 48, 51, 78, 15 − tableSize = 10
• Thế thì: key % tableSize = 4, 8, 1, 8,
(7)Một hàm băm cho xâu ký tự
int hash(const string & key, int tableSize) { int hashVal = 0;
for (int i = 0; i < key.size(); i++) hashVal += key[i];
return hashVal % tableSize; }
• Ví dụ:
− tableSize = 100
− key = "ABC" (mã ASCII A, B, C 65, 66, 67) − hashVal = (65 + 66 + 67) % 100 = 198 % 100 = 98 − Nếu key = "CBA" hashVal = ?
• Một hàm băm tốt cho xâu ký tự key = x0x1 xk-2xk-1 sau: hash(key) = (x0*ak−1 + x
1*ak−2 + ··· + xk−2*a + xk−1) % tableSize