Tài liệu hướng dẫn thực hành môn Cấu trúc dữ liệu và giải thuật HCMUS 2010 T ra n g 1 LAB 09 HÀM BĂM BẢNG BĂM MỤC TIÊU Hoàn tất bài thực hành này, sinh viên có thể Hiểu và sử dụng bảng băm Xây dưn[.]
LAB 09 HÀM BĂM - BẢNG BĂM MỤC TIÊU Hoàn tất thực hành này, sinh viên có thể: Hiểu sử dụng bảng băm Xây dưng hàm băm Hiểu vận dụng thuật toán xử lý đụng độ THỜI GIAN THỰC HÀNH Từ 120phút-240phút KHÁI NIỆM VỀ HASH Vấn đề: Cho trước tập S gồm phần tử đặc trưng giá trị khố Trên giá trị khố có quan hệ thứ tự Tổ chức S để tìm kiếm phần tử có khố k cho trước có độ phức tạp giới hạn nhớ cho phép? Ý tưởng: Biến đổi khoá k thành số (bằng hàm hash) sử dụng số địa để tìm kiếm bảng liệu Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 Trang ĐỊNH NGHĨA HÀM BĂM Ví dụ: Định nghĩa: hàm biến đổi khoá k phần tử thành địa bảng băm Ví dụ: H(k) = k mod M Tổng quát phép biến đổi khoá: Là ánh xạ thích hợp từ tập khố U vào tập địa A H: U K A a = h(k) Tập giá trị khố (U) lớn nhiều so với số khoá thực tế (K) Ví dụ: Quản lý danh sách 1000 sinh viên, MSSV gồm chữ số Như có U = 107 khoá so với K = 1000 Bảng băm thích hợp cho tốn “từ điển (dictionary)” Các toán dạng chủ yếu sử dụng hai thao tác: chèn (insert) tìm kiếm (search) XÂY DỰNG HÀM BĂM 3.1 Hàm băm Bài tốn: Cho mảng số ngun U có M phần tử U bảng băm Có k khoá số nguyên, khoá lưu vào bảng băm sử dụng cơng thức tính modulo (H(k) = k mod M) Sau nhập giá trị khoá, in giá trị tương ứng Nhiệm vụ: giúp hiểu cách bảng băm, hàm băm Xây dựng hàm băm Xây dựng hàm khởi tạo giá trị cho bảng băm sử dụng hàm băm Nhập khố cần tìm, dùng hàm băm Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 Trang - Cách thực hiện: Code mẫu: #include int Hash(int k, int M) { if (M == 0) return 0; return (k % M); } void InitHash(int *&U, int M) { int K[5] = {1,2,4,6,9}; int i, pos; for(i = 0; i < M; i++) U[i] = 0; for(i = 0; i < 5; i++) { pos = Hash(K[i], M); U[pos] = K[i]; } } int main(int argc, char* argv[]) { int M = 10; int *U = new int[M]; int pos; InitHash(U, M); int x; printf("Nhap khoa tim kiem: "); scanf("%d", &x); pos = Hash(x, M); if (U[pos] == 0){ printf("Khong tim thay khoa bang bam\n"); } else{ printf("Gia tri phan tu can tim kiem: %d\n", U[pos]); } return 0; } Biên dịch chạy chương trình Hãy cơng thức tốn hàm băm đoạn code mẫu Trong hàm khởi tạo bảng băm, tập U có phần tử, tập khố k lưu bảng băm có phần tử Mơ tả quy trình bước chi tiết từ xây dựng bảng băm đến xuất kết tìm kiếm Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 Trang Sau nắm khái niệm hàm băm, bảng băm quy trình bước chi tiết, sinh viên vận dụng vào toán tra tên SV theo MSSV 3.2 Hàm băm cho toán tra tên sinh viên Bài toán: Cho tập U đối tượng sinh viên, thông tin SV bao gồm MSSV tên SV Giả sử ta có tập k SV Khoa CNTT, lưu vào bảng băm U theo hàm băm modulo tương tự toán Hãy xây dựng ứng dụng cho phép tìm kiếm tên SV theo MSSV nhập từ bàn phím Cách thực hiện: - Tạo cấu trúc Word biểu diễn cho thông tin SV, gồm hai trường: key (MSSV) value (tên SV) Thực hàm băm giống toán Hàm khởi tạo bảng băm đưa danh sách SV có vào bảng băm U Khi tra cứu, băm MSSV SV cần tra cứu, sau lấy thông tin SV bảng băm U dựa theo giá trị vừa băm Code mẫu: #include #include struct Word { int key; char value[128]; }; int Hash(int k, int M) { if (M == 0) return 0; return (k % M); } void InitHash(Word *&U, int M) { Word K[5]; K[0].key = 1;//MSSV strcpy(K[0].value, "Messi"); K[1].key = 3; strcpy(K[1].value, "Ronaldo"); K[2].key = 5; strcpy(K[2].value, "Rooney"); K[3].key = 7; strcpy(K[3].value, "Drogba"); K[4].key = 9; strcpy(K[4].value, "Xavi"); int i, pos; int main(int argc, char* argv[]) { Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 Trang } for(i = 0; i < M; i++) U[i].key = 0; for(i = 0; i < 5; i++) { pos = Hash(K[i].key, M); U[pos] = K[i]; } int M = 10; Word *U = new Word[M]; int pos; InitHash(U, M); int x; printf("Nhap MSSV tim kiem: "); scanf("%d", &x); pos = Hash(x, M); if (U[pos].key == 0){ printf("Khong tim thay SV nao bang bam\n"); } else{ printf("Ten cua SV can tim kiem la: %s\n", U[pos].value); } return 0; } Biên dịch đoạn chương trình Chỉ thay đổi chương trình so với chương trình Nếu bỏ đoạn code sau hàm băm if (M == 0) return 0; Thì có khơng? Giải thích lý Nếu thay K[i].key đoạn code sau pos = Hash(K[i].key, M); Thành pos = Hash(K[i], M); Thì chuyện xảy ra? Giải thích lý Nếu thay giá trị K[2].key chỗ dòng code sau K[2].key = 5; Thành K[2].key = 13; Sự đụng độ xảy tồn hai khố có giá trị băm Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 Trang GIẢI QUYẾT ĐỤNG ĐỘ Và lúc chạy, nhập MSSV Kết xuất bao nhiêu? Đúng hay sai? Nếu sai, giải thích lý sao? Viết lại chương trình trên, cho phép người dùng tự nhập số lượng giá trị k thông tin SV cần đưa vào bảng băm (ở đoạn code tác giả định cứng số lượng 5) k1 ≠ k2, H(k1) = H(k2) Các phương pháp giải đụng độ: - Phương pháp nối kết (chaining) Phương pháp địa mở (open-addressing) Chi tiết phương pháp xem phần lý thuyết Bài tập nâng cao: Trang Áp dụng phương pháp nối kết để giải đụng độ cho toán tra tên SV Áp dụng phương pháp địa mở (dị tuyến tính) để giải đụng độ cho toán tra tên SV Áp dụng phương pháp địa mở (dò bậc 2) để giải đụng độ cho toán tra tên SV Áp dụng phương pháp địa mở (băm kép) để giải đụng độ cho toán tra tên SV Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010 ... (tên SV) Thực hàm băm giống toán Hàm khởi tạo bảng băm đưa danh sách SV có vào bảng băm U Khi tra cứu, băm MSSV SV cần tra cứu, sau lấy thơng tin SV bảng băm U dựa theo giá trị vừa băm Code mẫu:... Nhiệm vụ: giúp hiểu cách bảng băm, hàm băm Xây dựng hàm băm Xây dựng hàm khởi tạo giá trị cho bảng băm sử dụng hàm băm Nhập khố cần tìm, dùng hàm băm Tài liệu hướng dẫn thực hành môn Cấu trúc liệu... phần tử U bảng băm Có k khố số ngun, khố lưu vào bảng băm sử dụng cơng thức tính modulo (H(k) = k mod M) Sau nhập giá trị khoá, in giá trị tương ứng Nhiệm vụ: giúp hiểu cách bảng băm, hàm băm Xây