1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm - Phan Mạnh Hiển (2020)

16 42 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm cung cấp cho người học các kiến thức: Bảng băm, so sánh các cấu trúc dữ liệu, hàm băm (hash function), một hàm băm đơn giản, một hàm băm cho các xâu ký tự,... Mời các bạn cùng tham khảo nội dung chi tiết.

Bảng băm (Hash Tables) Nguyễn Mạnh Hiển hiennm@tlu.edu.vn 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ự: − VD: tìm phần tử lớn nhỏ Ví dụ bảng băm Mỗi phần tử cặp khóa-giá trị: - Tên khóa - Thu nhập giá trị 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) − Bảng băm: O(1) 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 − Khi đụng độ xảy ra, ta phải tìm cách phân giải cho phần tử không ghi đè lên (sẽ xem xét sau) 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, • Để giảm đụng độ, ta thường chọn kích thước bảng số nguyên tố 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 + x1*ak−2 + ··· + xk−2*a + xk−1) % tableSize − Nếu xâu ký tự từ tiếng Anh, chọn a = 33, 37, 39 41 Thiết kế bảng băm Hàm băm: Ánh xạ khóa sang vị trí bảng băm − VD: hash(key) = key % tableSize Phân giải đụng độ: − Giải trường hợp nhiều khóa ánh xạ đến vị trí − Hai giải pháp thường gặp: • Dây chuyền (separate chaining) • Thăm dị (probing) Giải pháp dây chuyền • Mỗi mảng giữ danh sách liên kết phần tử (dây chuyền) • Các phần tử có khóa ánh xạ tới giữ danh sách liên kết • Ví dụ: – hash(key) = key % 10 – chèn 10 số phương vào bảng băm Phân tích giải pháp dây chuyền • Xét bảng băm có M chứa N phần tử • Chèn khơng kiểm tra tính nhất: O(1) – Tìm vị trí chèn dùng hàm băm – Gọi pushFront • Tìm/xóa/chèn có kiểm tra tính nhất, trường hợp tồi (phải quét hết danh sách liên kết có N phần tử): O(N) • Tìm/xóa/chèn có kiểm tra tính nhất, tính trung bình: + O(N/M) – Ta tăng kích thước bảng số phần tử trung bình ô, N/M, vượt hệ số tải  (≤ 1) – Do đó, thời gian trung bình = + O() = O(1) Bảng băm thăm dị • Bảng băm dây chuyên phức tạp phải trì danh sách liên kết • Giải pháp thăm dị trống: − Nếu đụng độ xảy ra, thử ô khác bảng − Thử ô h0(x), h1(x), h2(x), h3(x), … tìm trống • hi(x) = [hash(x) + f(i)] % tableSize • f(0) = (vì ta bắt đầu thăm dị từ vị trí thu sau áp dụng phép băm) Thăm dị tuyến tính hi(x) = [hash(x) + f(i)] % tableSize, f(i) = i • Phép chèn (giả sử khóa khơng trùng nhau): index = hash(x) table[index] rỗng, đặt phần tử (gồm khóa giá trị) vào table[index] table[index] không rỗng: – index++; index = index % tableSize – quay lại bước • Tìm kiếm: index = hash(x) table[index] rỗng, trả -1 (không tìm thấy) table[index].key == x, trả index (tìm thấy) index++; index = index % tableSize; quay lại bước Ví dụ Chèn 89, 18, 49, 58, 69 (hash(x) = x % 10) Thăm dò bậc hai hi(x) = [hash(x) + f(i)] % tableSize, f(i) = i2 Tổ chức lại bảng băm • Bảng băm bị đầy − Khi khơng thể chèn thêm • Bảng băm đầy (nhưng chưa đầy 100%) − Chèn, xóa tìm kiếm nhiều thời gian • Giải pháp: Tổ chức lại bảng băm − Tạo bảng có kích thước lớn (VD: gấp hai lần) − Định nghĩa hàm băm − Di chuyển phần tử từ bảng cũ sang bảng • Chi phí tổ chức lại bảng băm = O(N) (N số phần tử) − Khá tốn xảy không thường xuyên − Chỉ xảy bảng băm đầy (đầy X%, X tham số điều chỉnh được) Ví dụ tổ chức lại bảng băm thăm dị tuyến tính Bảng băm ban đầu Chèn thêm 23 Tổ chức lại bảng băm: ‒ Gấp đơi kích thước cũ tìm số ngun tố (ở 17) để dùng làm kích thước ‒ Quét bảng băm cũ từ đầu đến cuối để lấy giá trị chèn vào bảng theo thứ tự lấy ... Ví dụ bảng băm Mỗi phần tử cặp khóa-giá trị: - Tên khóa - Thu nhập giá trị 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) − Bảng băm: ... Tổ chức lại bảng băm • Bảng băm bị đầy − Khi khơng thể chèn thêm • Bảng băm đầy (nhưng chưa đầy 100%) − Chèn, xóa tìm kiếm nhiều thời gian • Giải pháp: Tổ chức lại bảng băm − Tạo bảng có kích... dụ tổ chức lại bảng băm thăm dị tuyến tính Bảng băm ban đầu Chèn thêm 23 Tổ chức lại bảng băm: ‒ Gấp đơi kích thước cũ tìm số nguyên tố (ở 17) để dùng làm kích thước ‒ Quét bảng băm cũ từ đầu

Ngày đăng: 31/10/2020, 15:16

Xem thêm:

HÌNH ẢNH LIÊN QUAN

Ví dụ bảng băm - Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm - Phan Mạnh Hiển (2020)
d ụ bảng băm (Trang 3)
− tableSize: kích thước bảng băm - Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm - Phan Mạnh Hiển (2020)
table Size: kích thước bảng băm (Trang 6)
Tổ chức lại bảng băm: - Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm - Phan Mạnh Hiển (2020)
ch ức lại bảng băm: (Trang 16)
Ví dụ tổ chức lại bảng băm thăm dò tuyến tính - Bài giảng Cấu trúc dữ liệu và giải thuật: Bảng băm - Phan Mạnh Hiển (2020)
d ụ tổ chức lại bảng băm thăm dò tuyến tính (Trang 16)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN