Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
719,78 KB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA VIỄN THÔNG I BÀI TIỂU LUẬN INTERNET VÀ GIAO THỨC ĐỀ TÀI: BẢNG BĂM VÀ CÁC KỸ THUẬT XỬ LÝ VA CHẠM Sinh viên thực hiện: Nguyễn Lương Linh- B18DCVT245 Nguyễn Hữu Đức- B18DCVT112 Lê Đức Hiếu- B18DCVT149 Nguyễn Triệu Việt Hùng - B18DCVT189 Nguyễn Văn Nội- B18DCVT309 Nhóm mơn học: 05 Nhóm tiểu luận: 03 Giảng viên hướng dẫn: TS Phạm Anh Thư Hà Nội - 2021 Tiểu luận Lời nói đầu LỜI NĨI ĐẦU Trong này, xem xét cấu trúc liệu, Hash Tables Để làm vậy, trước tiên hiểu phần khác cấu trúc Chúng xem xét hai Bảng băm tuyến tính mở rộng Sau đó, thấy cách thực thao tác khác chúng, tức tìm kiếm, chèn xóa Cuối cùng, chúng tơi tóm tắt với giải thích ưu nhược điểm việc sử dụng Bảng băm khác để lưu trữ truy cập liệu Trong khoa học máy tính, bảng băm (Hash Tables) cấu trúc liệu sử dụng hàm băm để ánh xạ từ giá trị xác định, gọi khóa (ví dụ tên người), đến giá trị tương ứng (ví dụ số điện thoại họ) Do đó, bảng băm một mảng kết hợp Hàm băm sử dụng để chuyển đổi từ khóa thành số (giá trị băm) mảng lưu trữ giá trị tìm kiếm Vì hàm băm cho số nhỏ cho khóa số nguyên lớn chuỗi, nên có khả hai khóa dẫn đến giá trị. Tình mà khóa chèn ánh xạ tới vị trí bị chiếm dụng bảng băm gọi xung đột phải xử lý số kỹ thuật xử lý va chạm. Trong tiểu luận chúng em tập trung nghiên cứu vấn đề Bảng băm kỹ thuật xử lý va chạm Bài tiểu luận gồm có chương : Chương I: Lý thuyết bảng băm CHương II: Các kỹ thuật xử lý va chạm Nhóm 03 I|Page Tiểu luận Mục lục MỤC LỤC LỜI NÓI ĐẦU I MỤC LỤC II DANH SÁCH HÌNH VẼ III CHƯƠNG I: TỔNG QUAN VỀ BẢNG BĂM .2 1.1, Khái niệm bảng băm 1.2, Băm cấu trúc liệu .3 1.2.1, Cơ chế băm 1.2.2, Giá trị khóa băm 1.3, Hàm băm: .4 1.3.1, Khái niệm 1.3.2 Các thuộc tính hàm băm CHƯƠNG II: CÁC KỸ THUẬT XỬ LÝ VA CHẠM 2.1 Separate chaining (open hashing) 2.1.1, Độ phức tạp thời gian 2.1.2 Cài đặt bảng băm sử dụng Separate chaining 2.1.3 Bài toán thực hành dựa vào Separate Chaining 2.2, Linear probing (open addressing or closed hashing) 12 2.2.1, Khái niệm .12 2.2.2, Hoạt động địa mở: 14 2.2.3, Linear Probing( Đầu dị tuyến tính) .15 2.2.4, Bài toán thực hành dựa vào địa mở (open addressing) 15 2.2.5, So sánh Separate Chaining Vs Open Addressing 21 2.3, Phương pháp dò bậc hai (Quadratic Probing) 22 2.4 Double Hashing 24 2.4.1, Tổng quát .24 2.4.2, Ví dụ double hashing : 24 Nhóm 03 II | P a g e Tiểu luận Danh sách hình vẽ DANH SÁCH HÌNH VẼ Nhóm 03 Hình 1.1: Mơ bảng băm Hình 1.2: chế băm Hình 1.3: Cách hàm băm hoạt động Hình 2.1: Separate chaining xảy va chạm III | P a g e Tiểu luận Chương I: Tổng quan bảng băm CHƯƠNG I: TỔNG QUAN VỀ BẢNG BĂM 1.1, Khái niệm bảng băm - Băm kỹ thuật sử dụng để định danh đối tượng cụ thể nhóm đối tượng tương tự Một bảng băm (hash table) cấu trúc liệu ánh xạ khóa giá trị, tức tương ứng với khóa bảng băm trả giá trị - Ví dụ việc sử dụng bảng băm: + Trong trường đại học, sinh viên định mã sinh viên không giống qua mã sinh viên truy xuất thơng tin sinh viên + Trong thư viện, sách mã số riêng mã số dùng để xác định thơng tin sách - Trong ví dụ trên, sinh viên sách “băm” thành mã số (không trùng lặp nhau) - Giả sử có đối tượng muốn gán cho khóa (key) để giúp tìm kiếm dễ dàng - Để lưu giữ cặp (), ta sử dụng mảng bình thường để làm việc với số mảng khóa giá trị số giá trị tương ứng khóa - Tuy nhiên, trường hợp phạm vi khóa lớn khơng thể sử dụng số mảng được, cần tới “băm”(hashing) Nhóm 03 2|Page Tiểu luận Chương I: Tổng quan bảng băm Hình 1.1: Mơ bảng băm 1.2, Băm cấu trúc liệu Trong cấu trúc liệu, - Hashing kỹ thuật tiếng để tìm kiếm phần tử cụ thể số số phần tử - Nó giảm thiểu số lượng so sánh thực tìm kiếm Thuận lợi Khơng giống kỹ thuật tìm kiếm khác - Hashing hiệu - Thời gian thực tìm kiếm khơng phụ thuộc vào tổng số phần tử - Nó hồn thành việc tìm kiếm với độ phức tạp thời gian không đổi O (1) 1.2.1, Cơ chế băm - Một cấu trúc liệu mảng gọi là bảng Hash được sử dụng để lưu trữ mục liệu - Dựa giá trị khóa băm, mục liệu chèn vào bảng băm 1.2.2, Giá trị khóa băm - Giá trị khóa băm giá trị đặc biệt dùng làm mục cho mục liệu - Nó nơi mục liệu nên lưu trữ bảng băm - Giá trị khóa băm tạo hàm băm Nhóm 03 3|Page Tiểu luận Chương I: Tổng quan bảng băm Hình 1.2: chế băm 1.3, Hàm băm: 1.3.1, Khái niệm Hàm băm hàm ánh xạ số lớn chuỗi thành giá trị số nguyên nhỏ Hàm băm lấy mục liệu làm đầu vào trả giá trị số nguyên nhỏ làm đầu Giá trị số nguyên nhỏ gọi giá trị băm Giá trị băm mục liệu sau sử dụng làm mục để lưu trữ vào bảng băm - Trong hashing, key có giá trị lớn đưa giá trị nhỏ cách sử dụng hàm băm (hash functions) Vậy hàm băm gì? Hàm băm hoạt động nào? Và để đánh giá hàm băm cần có tiêu chí nào? - Hàm băm hàm sử dụng để ánh xạ tập liệu có kích thước tùy ý thành tập liệu có kích thước cố định đưa vào bảng băm. Các giá trị trả hàm băm gọi giá trị băm - Thuật tốn băm sử dụng khóa băm để tính tốn khóa định danh phần tử thêm vào bảng băm thông qua bước sau: + Một phần tử chuyển đổi thành số nguyên việc sử dụng hàm băm Phần tử sử dụng mục để lưu trữ phần tử gốc đưa vào bảng băm + Phần tử lưu giữ bảng băm, truy xuất nhanh khóa băm: o hash = hashfunc(key) o index = hash mod array_size - Vì việc băm(hashing) phụ thuộc vào kích thước mảng array_size đồng thời số index sau đưa [0; array_size-1] việc sử dụng tốn tử chia lấy dư mod Nhóm 03 4|Page Tiểu luận Chương I: Tổng quan bảng băm Hình1.3: Cách hàm băm hoạt động 1.3.2 Các thuộc tính hàm băm - Một hàm băm đánh giá tốt đạt yêu cầu sau: + Dễ tính tốn: Nó phải dễ tính tốn thân khơng phải thuật tốn + Phân bố đồng đều: Nó cần phải phân phối đồng bảng băm, không xảy việc tập trung thành cụm + Ít va chạm: Va chạm xảy cặp phần tử ánh xạ tới giá trị băm - Tuy nhiên va chạm băm tránh khỏi băm tập hợp ngẫu nhiên số lượng lớn khóa Ví dụ, băm 2500 khóa vào triệu ô nhớ, với phân bố hoàn toàn ngẫu nhiên, theo vấn đề sinh nhật có 95% hội hai số khóa băm ô nhớ Vậy nên cần kỹ thuật để xử lý xảy va chạm băm Nhóm 03 5|Page Tiểu luận Chương II: Các kỹ thuật xử lý va chạm CHƯƠNG II: CÁC KỸ THUẬT XỬ LÝ VA CHẠM 2.1 Separate chaining (open hashing) Separate chaining kỹ thuật xử lý chạm phổ biến Nó thường cài đặt với danh sách liên kết Để lưu giữ phần tử bảng băm, phải thêm vào danh sách liên kết ứng với mục Nếu có va chạm xảy ra, phần tử nằm danh sách liên kết Hình 2.1: Separate chaining xảy va chạm Để xử lý vụ va chạm, - Kỹ thuật tạo danh sách liên kết đến vị trí mà xung đột xảy - Sau đó, khóa chèn vào danh sách liên kết - Những danh sách liên kết với vị trí xuất giống chuỗi - Đó lý sao, kỹ thuật gọi là chuỗi riêng biệt (Separate chaining.) 2.1.1, Độ phức tạp thời gian Để tìm kiếm Nhóm 03 6|Page Tiểu luận Chương II: Các kỹ thuật xử lý va chạm - Trong trường hợp xấu nhất, tất khóa ánh xạ đến nhóm bảng băm - Trong trường hợp vậy, tất khóa có danh sách liên kết - Tìm kiếm phải thực danh sách liên kết để thực tìm kiếm - Vì vậy, thời gian cần thiết để tìm kiếm trường hợp xấu O (n) Để xóa - Trong trường hợp xấu nhất, khóa phải tìm kiếm trước xóa - Trong trường hợp xấu nhất, thời gian tìm kiếm O (n) - Vì vậy, thời gian cần thiết để xóa trường hợp xấu O (n) Hệ số tải (α) Hệ số tải (α) định nghĩa là: hệ số tải (α)= số phần tử có bảng băm tổng kíchthước bảng băm Nếu Hệ số tải (α) = khơng đổi, độ phức tạp thời gian Chèn, Tìm kiếm, Xóa = Θ (1) 2.1.2 Cài đặt bảng băm sử dụng Separate chaining Giả định: Hàm băm trả số int [0, 19] - Thêm vào bảng băm Nhóm 03 7|Page Tiểu luận Chương II: Các kỹ thuật xử lý va chạm - Vì vậy, khóa 50 chèn vào thùng-1 bảng băm sau Bước 03: - Khóa chèn vào bảng băm = 700 - Nhóm bảng băm mà khóa 700 đồ = 700 mod = - Vì vậy, khóa 700 chèn vào thùng-0 bảng băm sau Bước 04: Khóa chèn vào bảng băm = 76 Nhóm bảng băm mà khóa 76 ánh xạ = 76 mod = Vì vậy, khóa 76 chèn vào thùng-6 bảng băm sau Nhóm 03 18 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Bước 05: - Khóa chèn vào bảng băm = 85 - Nhóm bảng băm mà 85 đồ = 85 mod = - Vì bucket-1 bị chiếm dụng nên xảy va chạm - Để xử lý vụ va chạm, kỹ thuật thăm dị tuyến tính tiếp tục thăm dị tuyến tính tìm thấy thùng rỗng - Thùng rỗng thùng-2 - Vì vậy, khóa 85 chèn vào thùng-2 bảng băm sau Bước 06: - Khóa chèn vào bảng băm = 92 Nhóm 03 19 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm - Nhóm bảng băm mà khóa 92 ánh xạ = 92 mod = - Vì bucket-1 bị chiếm dụng nên xảy va chạm - Để xử lý vụ va chạm, kỹ thuật thăm dị tuyến tính tiếp tục thăm dị tuyến tính tìm thấy thùng rỗng - Thùng rỗng thùng-3 - Vì vậy, khóa 92 chèn vào thùng-3 bảng băm sau: Bước-07: - Khóa chèn vào bảng băm = 73 - Nhóm bảng băm mà khóa 73 ánh xạ = 73 mod = - Vì xơ-3 bị chiếm dụng nên xảy va chạm - Để xử lý vụ va chạm, kỹ thuật thăm dị tuyến tính tiếp tục thăm dị tuyến tính tìm thấy thùng rỗng - Thùng rỗng thùng-4 - Vì vậy, khóa 73 chèn vào thùng-4 bảng băm sau Nhóm 03 20 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Bước 08: - Khóa chèn vào bảng băm = 101 - Nhóm bảng băm mà khóa 101 ánh xạ = 101 mod = - Vì xơ-3 bị chiếm dụng nên xảy va chạm - Để xử lý vụ va chạm, kỹ thuật thăm dị tuyến tính tiếp tục thăm dị tuyến tính tìm thấy thùng rỗng - Thùng rỗng thùng-5 - Vì vậy, khóa 101 chèn vào thùng-5 bảng băm sau Nhóm 03 21 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm 2.2.5, So sánh Separate Chaining Vs Open Addressing Chuỗi riêng biệt Các khóa lưu trữ bên bảng băm bên bảng băm Mở địa - Tất khóa lưu trữ bên bảng băm - Khơng có khóa diện bên ngồi bảng băm Số lượng khóa lưu trữ bảng băm chí vượt q kích thước bảng băm Số lượng khóa lưu trữ bảng băm không vượt q kích thước bảng băm Xóa dễ dàng Việc xóa khó Cần có thêm khơng gian để trỏ lưu trữ khóa bên ngồi bảng băm Không cần thêm không gian - Hiệu suất nhớ cache - Hiệu suất nhớ cache tốt Điều danh sách liên kết Điều khơng có danh lưu trữ khóa bên ngồi bảng băm sách liên kết sử dụng Một số thùng bảng băm không sử dụng, dẫn đến lãng phí dung lượng Nhóm 03 Các nhóm sử dụng khơng có đồ đến nhóm cụ thể 22 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm 2.3, Phương pháp dò bậc hai (Quadratic Probing) - Bảng băm dùng phương pháp dị tuyến tính bị hạn chế rải phần tử không đều, bảng băm với phương pháp dò bậc hai rải phần tử - Bảng băm trường hợp cài đặt danh sách kề có M phần tử, phần tử bảng băm mẫu tin có trường key để chứa khóa phần tử Bảng băm với phương pháp bậc hai nên chọn số địa M số nguyên tố - Khi khởi động bảng băm tất trường key bị gán NULL -Thêm phần tử có khóa key vào bảng băm, hàm băm f(key) xác định địa i khoảng từ đến M-1 +) Nếu chưa bị xung đột thêm phần tử vào địa i +) Nếu bị xung đột hàm băm lại lần f1 xác định địa cách 12, lại bị xung đột hàm băm lại lần f2 xét địa cách i 2 , …, tiếp tục trình tìm trống thêm phần tử vào địa -Tìm kiếm phần tử có khóa key bảng băm xét phần tử địa i=f(key), chưa tìm thấy xét phần tử cách i 2, 22, …, trình tìm khóa (trường hợp tìm thấy) rơi vào địa trống (trường hợp khơng tìm thấy) -Hàm băm lại phương pháp dị bậc hai truy xuất địa cách bậc Hàm băm lại hàm i biểu diễn công thức sau: fi(key)=( f(key) + i2 ) % M với f(key) hàm băm bảng băm -Nếu dị đến cuối bảng trở dị lại từ đầu bảng -Bảng băm minh họa có cấu trúc sau: Tập khóa K: tập số tự nhiên Tập địa M: gồm 10 địa (M={0, 1, …, 9} Hàm băm f(key) = key % 10 Nhận xét: - Nên chọn số địa M số nguyên tố Khi khởi động bảng băm tất M trường key gán NULL, biến toàn cục N gán -Bảng băm đầy N = M-1, nên dành phần tử trống bảng băm Nhóm 03 23 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm -Bảng băm tối ưu bảng băm dùng phương pháp dị tuyến tính rải rác phần tử hơn, bảng băm chưa đầy tốc độ truy xuất có bậc 0(1) Trường hợp xấu bảng băm đầy lúc tốc độ truy xuất chậm phải thực nhiều lần so sánh Nhóm 03 24 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm 2.4 Double Hashing 2.4.1, Tổng quát Băm kép (double hashing) là một kỹ thuật lập trình máy tính được sử dụng kết hợp với địa mở ( open addressing) trong bảng băm để giải quyết xung đột băm , cách sử dụng băm phụ khóa làm điểm bù xảy xung đột. Hàm băm kép với địa mở cấu trúc liệu cổ điển bảng T Kỹ thuật băm kép sử dụng giá trị băm làm mục bảng sau lặp lại bước chuyển tiếp khoảng giá trị mong muốn định vị, đến vị trí trống tồn bảng tìm kiếm; nhưng khoảng thời gian thiết lập một hàm băm thứ hai, độc lập Không giống phương pháp giải va chạm thay của thăm dị tuyến tính và thăm dị bậc hai , khoảng thời gian phụ thuộc vào liệu , giá trị ánh xạ đến vị trí có trình tự nhóm khác nhau; điều giảm thiểu va chạm lặp lặp lại ảnh hưởng việc phân cụm - Băm kép hữu ích ứng dụng u cầu bảng băm nhỏ tìm thấy vùng trống cách hiệu - Mặc dù chi phí tính tốn cao, băm kép tìm thấy vị trí trống nhanh so với phương pháp thăm dò tuyến tính Băm kép thực cách sử dụng công thức : (hash1 (key) + i * hash2 (key))% TABLE_SIZE Ở hash1 () hash2 () hàm băm TABLE_SIZE kích thước bảng băm (Chúng lặp lại cách tăng i xảy va chạm) Hàm băm thường hash1 (key) = key% TABLE_SIZE Một hàm băm thứ hai phổ biến là: hash2 (key) = PRIME - (key% PRIME) PRIME số nguyên tố nhỏ TABLE_SIZE Một chức Hash2 là: Nó khơng đánh giá Phải đảm bảo tất thăm dị 2.4.2, Ví dụ double hashing : Nhóm 03 25 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Nhóm 03 26 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Nhóm 03 27 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Nhóm 03 28 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm Code : // CPP program to implement double hashing #include using namespace std; // Hash table size #define TABLE_SIZE 13 // Used in second hash function #define PRIME class DoubleHash { // Pointer to an array containing buckets int* hashTable; int curr_size; public: // function to check if hash table is full bool isFull() { // if hash size reaches maximum size return (curr_size == TABLE_SIZE); } // function to calculate first hash int hash1(int key) { return (key % TABLE_SIZE); } // function to calculate second hash int hash2(int key) { return (PRIME - (key % PRIME)); } DoubleHash() { Nhóm 03 29 | P a g e Tiểu luận Chương II: Các kỹ thuật xử lý va chạm hashTable = new int[TABLE_SIZE]; curr_size = 0; for (int i = 0; i < TABLE_SIZE; i++) hashTable[i] = -1; } // function to insert key into hash table void insertHash(int key) { // if hash table is full if (isFull()) return; // get index from first hash int index = hash1(key); // if collision occurs if (hashTable[index] != -1) { // get index2 from second hash int index2 = hash2(key); int i = 1; while (1) { // get newIndex int newIndex = (index + i * index2) % TABLE_SIZE; // if no collision occurs, store // the key if (hashTable[newIndex] == -1) { hashTable[newIndex] = key; break; } i++; } } // if no collision occurs else hashTable[index] = key; curr_size++; } // function to search key in hash table void search(int key) { int index1 = hash1(key); int index2 = hash2(key); int i = 0; while (hashTable[(index1 + i * index2) % TABLE_SIZE] != key) { if (hashTable[(index1 + i * index2) % TABLE_SIZE] == -1) { cout