giải quyết xung đột

11 16 0
giải quyết xung đột

Đ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ảng băm với phương pháp kết nối trực tiếp (Direct chaining Method) Bảng băm cài đặt danh sách liên kết, phần tử bảng băm “băm” thành M danh sách liên kết (từ danh sách đến danh sách M–1) Các phần tử bị xung đột địa i kết nối trực tiếp với qua danh sách liên kết i Chẳng hạn, với M=10, phần tử có hàng đơn vị băm vào danh sách liên kết i = Khi thêm phần tử có khóa k vào bảng băm, hàm băm f(k) xác định địa i khoảng từ đến M-1 ứng với danh sách liên kết i mà phần tử thêm vào Khi tìm phần tử có khóa k vào bảng băm, hàm băm f(k) xác định địa i khoảng từ đến M-1 ứng với danh sách liên kết i chứa phần tử Như vậy, việc tìm kiếm phần tử bảng băm qui tốn tìm kiếm phần tử danh sách liên kết Để minh họa ta xét bảng băm 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 h(key) = key % 10 30, 50,60,11,21,31,… Hình minh họa bảng băm vừa mơ tả Theo hình vẽ, bảng băm "băm" phần tử tập khoá K theo 10 danh sách liên kết khác nhau, danh sách liên kết gọi bucket: · Bucket gồm phần tử có khóa tận · Bucket i(i=0 | … | 9) gồm phần tử có khóa tận i · Khi khởi động bảng băm, trỏ đầu bucket NULL Theo cấu trúc này, với tác vụ insert, hàm băm h(k) dùng để tính địa khố k, tức xác định bucket chứa phần tử đặt phần tử cần chèn vào bucket Với tác vụ search, hàm băm dùng để tính địa tìm phần tử bucket tương ứng + i=h(k) => thuoc danh sach thu I (bucket[i] + tim kiem khoa K tren danh sach bucket[i] Cài đặt bảng băm dùng phương pháp kết nối trực tiếp : a Khai báo cấu trúc bảng băm: #define M 100struct nodes { int key; struct nodes * next };typedef struct nodes * NODEPTR; //khai bao kieu tro chi nut/*khai bao mang bucket chua M tro dau cua Mbucket */ NODEPTR bucket[M]; BT: xay dung bang bam theo PP ket noi truc tiep b.Các phép tốn: - Tính giá trị hàm băm: Giả sử chọn hàm băm dạng %: h(key)=key % M - Phép toán initbuckets: khởi tạo bucket băng Null - Phép tốn emmptybucket(b): kiểm tra bucket b có bị rỗng khơng? - Phép tốn emmpty: Kiểm tra bảng băm có rỗng khơng? - Phép tốn insert: Thêm phần tử có khóa k vào bảng băm + i=h(k) + ktra bucket [i]: neu rong =>cc o nho cho bucket, gan khoa k them phan tu co khoa k vao ds theo thu tu tang dan - Phép tốn remove: Xóa phần tử có khóa k bảng băm - Phép tốn clear: Xóa tất phần tử bảng băm - Phép toán traversebucket: Xử lý tất phần tử bucket b - Phép toán traverse: Xử lý tất phần tử bảng băm - Phép tốn search: Tìm kiếm phần tử bảng băm, khơng tìm thấy hàm trả hàm NULL, tìm thấy hàm trả địa phần tử có khóa k B1: Tìm danh sách liên kết chứa khóa k b = h(k); p = bucket[b]; B2: Tìm khóa k danh sách liên kết p Nhận xét bảng băm dùng phương pháp kết nối trực tiếp: Bảng băm dùng phương pháp kết nối trực tiếp "băm” n phần tử vào danh sách liên kết (M bucket) Để tốc độ thực phép tốn bảng hiệu cần chọn hàm băm cho băm n phần tử bảng băm cho M bucket, lúc trung bình bucket có n/M phần tử Chẳng hạn, phép tốn search thực việc tìm kiếm bucket nên thời gian tìm kiếm lúc có bậc 0(n/M) – nghĩa là, nhanh gấp M lần so với việc tìm kiếm danh sách liên kết có n phần tử Nếu chọn M lớn tốc độ thực phép toán bảng băm nhanh, nhiên lại dùng nhiều nhớ Do vậy, cần điều chỉnh M để dung hòa tốc độ truy xuất dung lượng nhớ · Nếu chọn M=n xuất tương đương với truy xuất mảng (có bậc O(1)), nhiên tốn nhiều nhớ Bảng băm với phương pháp kết nối hợp Mô tả: - Cấu trúc liệu: Tương tự trường hợp cài đặt phương pháp kết nối trực tiếp, bảng băm trường hợp cài đặt danh sách liên kết dùng mảng, có M phần tử Các phần tử bị xung đột địa kết nối qua danh sách liên kết Mỗi phần tử bảng băm gồm hai trường: · Trường key: chứa khóa phần tử · Trường next: trỏ đến phần tử có xung đột - Khởi động: Khi khởi động, tất trường key phần tử bảng băm gán giá trị NullKey, tất trường next gán –1 - Thêm phần tử: Khi thêm phần tử có khóa key vào bảng băm, hàm băm hkey) 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 · Nếu bị xung đột phần tử cấp phát phần tử trống phía cuối mảng Cập nhật liên kết next cho phần tử bị xung đột hình thành danh sách liên kết - Tìm kiếm: Khi tìm kiếm phần tử có khóa key bảng băm, hàm băm h(key) giúp giới hạn phạm vi tìm kiếm cách xác định địa i khoảng từ đến M-1, việc tìm kiếm phần tử khóa có khoá key danh sách liên kết xuất phát từ địa i Để minh họa cho bảng băm với phương pháp kết nối hợp nhất, xét ví dụ sau: Giả sử, khảo sát bảng băm 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 VD: Key : 11 12 21 13 Hash: 1 Add Key Next Add Key Next NullKey -1 NullKey -1 NullKey -1 11 … NullKey -1 12 -1 M-1 NullKey -1 13 -1 … NullKey -1 -1 21 Khai báo cấu trúc bảng băm: #define NULLKEY –1#define M 100 typedef struct node {int key; //khoa cua nut tren bang bamint next; //con tro chi nut ke tiep co xung dot } NODE; NODE hashtable[M]; //Khai bao bang bam Bảng băm với phương pháp dị Mơ tả: - Cấu trúc liệu: 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 khoá phần tử Khi khởi động bảng băm tất trường key gán NullKey; - Khi thêm phần tử có khố key vào bảng băm, hàm băm h(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 · Nếu bị xung đột hàm băm lại lần 1, hàm h1 xét địa kế tiếp, lại bị xung đột hàm băm hàm băm lại lần 2, hàm h2 xét địa nữa, …, trình tìm địa trống thêm phần tử vào địa - Khi tìm phần tử có khố key bảng băm, hàm băm h(key) xác định địa i khoảng từ đến M-1, tìm phần tử khố key bảng băm xuất phát từ địa i Hàm băm lại lần i biểu diễn công thức sau: f(key)=(f(key)+i) %M với f(key) hàm băm bảng băm Lưu ý địa dị tìm địa dò đến cuối bảng Giả sử, khảo sát bảng băm 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 h(key) = key % 10 Hình thể thêm nut 32, 53, 22, 92, 17, 34, 24, 37, 56 vào bảng băm NULL NULL NULL NULL 56 NULL NULL NULL NULL NULL 32 32 32 32 32 53 53 53 53 53 NULL 22 22 22 22 NULL 92 92 92 92 NULL NULL 34 34 34 NULL NULL 17 17 17 NULL NULL NULL 24 24 NULL NULL NULL 37 37 Khai báo cấu trúc bảng băm: #define NULLKEY –1#define M 100struct node { int key; //khoa cua nut tren bang bam };struct node hashtable[M]; //Khai bao bang bam co M nut Bảng băm với phương pháp dị bậc hai Mơ 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ử - Khi khởi động bảng băm tất trường key bị gán NULLKEY Khi thêm phần tử có khóa key vào bảng băm, hàm băm h(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 h1 xét địa cách i 12, lại bị xung đột hàm băm lại lần h2 xét địa cách i 22 ,… , trình tìm trống thêm phần tử vào địa - Khi 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 12, 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 lần thứ 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 Khai báo cấu trúc bảng băm: #define NULLKEY –1#define M 101/* M la so nut co tren bang bam,du de chua cac nut nhap vao bang bam,chon M la so nguyen to *///Khai bao nut cua bang bamstruct node { int key; //Khoa cua nut tren bang bam };//Khai bao bang bam co M nutstruct node hashtable[M];int N; Cài đặt bảng băm dùng phương pháp dò bậc hai: Hàm băm: Giả sử chọn hàm băm dạng%: f(key)=key %10 int hashfunc(int key){ return(key% 10); } Phép toán initialize void initialize(){ int i; for(i=0; iBUCKET = N; sc = new list[BUCKET]; } int Hashing::hashFunction(int okey) { return (okey % BUCKET); } void Hashing::insertKey(int key) { int nkey = hashFunction(key); sc[nkey].push_back(key); } void Hashing::deleteKey(int key){ int nkey = hashFunction(key); list::iterator i; for (i = sc[nkey].begin(); i != sc[nkey].end(); i++){ if(*i == key) { sc[nkey].erase(i); } } } void Hashing::printHashTable(){ for(int i = 0; i < BUCKET; i++){ Các ưu, nhược điểm phương pháp phân tách chuỗi Ưu điểm: Cài đặt đơn giản Khơng phải lo tới kích thước bảng băm, ta ln thêm liệu vào bảng cách thêm vào danh sách liên kết Phương thức thường sử dụng ta tần suất liệu thêm vào xóa khỏi bảng Nhược điểm: Hiệu phương pháp không tốt phương pháp đánh địa mở với phương pháp đánh địa mở liệu chứa bảng băm mà không cần trỏ tới vùng nhớ ngồi bảng Đơi lãng phí nhớ (như ta nhìn thấy ví dụ trên, vị trí 2, để trống, không sử dụng tới) Khi mà chuỗi (danh sách liên kết) trở nên dài, lúc thời gian cho thao tác tìm kiếm, xóa phần tử tốn thời gian Cần thêm nhớ cho phần tử danh sách liên kết Hiệu phương pháp phân tách chuỗi Sau thông số hiệu phương pháp phân tách chuỗi với giả định khóa (key) chèn đồng vào khe chứa liệu bảng băm M = Số lượng khe liệu bảng băm N = Số lượng key chèn vào bảng Hê số tải a = N/M Thời gian kỳ vọng cho thao tác tìm kiếm = O(1+a) Thời gian kỳ vọng cho thao tác chèn xóa liệu = O(1+a) Nếu a = lúc ta coi thời gian cho thao tác tìm kiếm, chèn xóa liêu O(1) Kết luận Việc xung đột chèn liệu vào bảng băm điều khó để tránh khỏi Việc chọn cách xử lý xung đột theo cách vơ quan trọng, ảnh hưởng đến hiệu tốc độ thực thi chương trình Hãy đọc thêm phương pháp giải xung đột khác để có so sánh lựa chọn phương pháp tránh xung đột tốt (Đánh địa mở - Open Addresing) ... khoảng từ đến M-1 · Nếu chưa bị xung đột thêm phần tử vào địa · Nếu bị xung đột phần tử cấp phát phần tử trống phía cuối mảng Cập nhật liên kết next cho phần tử bị xung đột hình thành danh sách liên... định địa i khoảng từ đến M-1: · Nếu chưa bị xung đột thêm phần tử vào địa · Nếu bị xung đột hàm băm lại lần 1, hàm h1 xét địa kế tiếp, lại bị xung đột hàm băm hàm băm lại lần 2, hàm h2 xét địa... 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 h1 xét địa cách i 12, lại bị xung đột hàm băm lại lần h2 xét địa cách i 22 ,… ,

Ngày đăng: 20/10/2022, 19:17

Hình ảnh liên quan

Bảng băm với phương pháp kết nối trực tiếp (Direct chaining Method) - giải quyết xung đột

Bảng b.

ăm với phương pháp kết nối trực tiếp (Direct chaining Method) Xem tại trang 1 của tài liệu.

Tài liệu cùng người dùng

Tài liệu liên quan