Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

16 571 4
Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

Đ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 3: BẢNG BĂM (HASH TABLE) Phép băm đề xuất thực máy tính từ năm 50 kỷ 20 Nó dựa ý tưởng: biến đổi giá trị khóa thành số (xử lý băm) sử dụng số để đánh cho bảng liệu Các phép toán cấu trúc liệu danh sách, nhị phân,… phần lớn thực cách so sánh phần tử cấu trúc, thời gian truy xuất không nhanh phụ thuộc vào kích thước cấu trúc Trong khảo sát cấu trúc liệu gọi bảng băm (hash table) Các phép toán bảng băm giúp hạn chế số lần so sánh, cố gắng giảm thiểu thời gian truy xuất Độ phức tạp phép tốn bảng băm thường có bậc 0(1) khơng phụ thuộc vào kích thước bảng băm Các khái niệm cấu trúc bảng băm: · Phép băm hay hàm băm (hash function) · Tập khoá phần tử bảng băm · Tập địa bảng băm · Phép toán thêm phần tử vào bảng băm · Phép toán xoá phần tử bảng băm · Phép tốn tìm kiếm bảng băm Thông thường bảng băm sử dụng cần xử lý tốn có liệu lớn lưu trữ nhớ 1 PHÉ BĂM (H ÉP Hash Fun nction) Định ng ghĩa: Trong hầu h ứng dụng, kh d T hết g hoá dùng m phương thức để t g truy xuất liệu Hàm băm dùng để xạ giá trị khóa kh vào m dãy địa m c ánh hoá bảng băm (hình 1) Hình Khóa dạng số hay số d K ể s dạng chuỗi Giả sử có khóa p i ó phân biệt ki kj h h(ki)=h(kj) hàm bă bị đụng độ ăm g Một hà băm tố phải th mãn điều kiện sau àm ốt hỏa u: Tính tốn n T nhanh ng Các khố đ C phân bố tron bảng Ít xảy đụ độ Í ụng Xử lý loại k X c khóa có kiể liệu k ểu khác Hàm B Băm sử dụ ụng Phươ ơng pháp chia p Dùng số dư: h(k) = k mod m ố k khố, m kích thướ bảng ớc y n ,…,m-1 Như h(k) nhận: 0,1,2, Việc chọn m ản hưởng đ h(k) nh đến Nếu N chọn m=2p giá trị h(k) p bit cuối k b m i a biểu diễn nhị phân ị Nếu N chọn m=10p g trị h p chữ số cu tr m giá h(k) uối rong biểu d diễn thập phâ k ân Trong ví dụ giá trị h(k) k T không phụ thuộc đầy đủ vào k ụ y khóa k mà phụ thuộ vào p b (p chữ s cuối cù k ộc bít số) ùng khóa k Tốt ta nê chọn m t ên cho h(k) phụ thuộc đầy đủ khóa k T ) v Thơng thườ chọn m số ng ờng guyên tố VD: Bản băm có 4000 mụ chọn m = 4093 ng ó ục, Hàm Băm sử dụng Phương pháp nhân h(k) = ⎣m*(k*A mod 1) ⎦ k khóa, m kích thước bảng, A số: < A < Chọn m A Theo Knuth chọn A giá trị sau: A=( -1)/2=0.6180339887… m thường chọn m = 2p VD: k=123456; m=10000 H(k)= ⎣10000 (123456* 0.6180339887 mod 1) ⎦ H(k)= ⎣10000 (76300.0041089472 mod 1) ⎦ H(k)= ⎣10000 (0.0041089472) ⎦ H(k)=41 Phép băm phổ quát (unisersal hashing) Việc chọn hàm băm khơng tốt dẫn đến xác suất đụng độ cao Giải pháp: - Lựa chọn hàm băm h ngẫu nhiên - Khởi tạo tập hàm băm H phổ quát từ h chọn ngẫu nhiên Cho H tập hợp hữu hạn hàm băm: ánh xạ khóa k từ tập khóa U vào miền giá trị {0,1,2,…, m-1} Tập H phổ quát với ∀ f ∈ H khoá phân biệt k1,k2 ta có xác suất: Pr{f(k1) = f(k2)} thuoc dan sach thu I (bucket > nh u t[i] + tim kiem khoa K tre danh sac bucket[i] en ch Cài đặt bảng băm dùng phươ pháp k nối trực tiếp : ơng kết c a Khai báo cấu trúc bảng băm: #define M 100 struct 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 toá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 toá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 tố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ớ 2.4.2 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ó khố 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: Add 1 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 bam int next; //con tro chi nut ke tiep co xung dot } NODE; 10 NODE hashtable[M]; //Khai bao bang bam Cài đặt bảng băm dùng phương pháp kết nối hợp nhất: 2.4.3 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 khố 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ử khoá 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 11 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 100 struct node { int key; //khoa cua nut tren bang bam }; struct node hashtable[M]; //Khai bao bang bam co M nut Cài đặt bảng băm dùng phương pháp dị tuyến tính: 12 2.4.4 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 13 /* 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 bam struct node { int key; //Khoa cua nut tren bang bam }; //Khai bao bang bam co M nut struct 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; i

Ngày đăng: 12/12/2013, 09:16

Hình ảnh liên quan

Hình 1.6. bả Hình trên m - Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

Hình 1.6..

bả Hình trên m Xem tại trang 7 của tài liệu.
- Phép toán insert: Thêm phần tử có khóa k vào bảng băm. - Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

h.

ép toán insert: Thêm phần tử có khóa k vào bảng băm Xem tại trang 8 của tài liệu.
Để 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 như sau:  - Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

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 như sau: Xem tại trang 10 của tài liệu.
Khai báo cấu trúc bảng băm: - Tài liệu Cấu trúc dữ liệu nâng cao P3 docx

hai.

báo cấu trúc bảng băm: Xem tại trang 12 của tài liệu.

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan