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

17 361 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 205,6 KB

Nội dung

www.kenbon.net 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 toá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 toán tìm kiếm bảng băm Thông thường bảng băm sử dụng cần xử lý toán có liệu lớn lưu trữ nhớ www.kenbon.net PHÉP BĂM (Hash Function) Định nghĩa: Trong hầu hết ứng dụng, khoá dùng phương thức để truy xuất liệu Hàm băm dùng để ánh xạ giá trị khóa khoá vào dãy địa bảng băm (hình 1) Hình Khóa dạng số hay số dạng chuỗi Giả sử có khóa phân biệt ki kj h(ki)=h(kj) hàm băm bị đụng độ M t hàm băm t t ph i th a mãn u ki n sau: Tính toán nhanh Các khoá phân bố bảng Ít xảy đụng độ Xử lý loại khóa có kiểu liệu khác Hàm Băm s d ng Phng pháp chia Dùng số dư: h(k) = k mod m k khoá, m kích thước bảng Như h(k) nhận: 0,1,2,…,m-1 Việc chọn m ảnh hưởng đến h(k) Nếu chọn m=2p giá trị h(k) p bit cuối k biểu diễn nhị phân Nếu chọn m=10p giá trị h(k) p chữ số cuối biểu diễn thập phân k Trong ví dụ giá trị h(k) không phụ thuộc đầy đủ vào khóa k mà phụ thuộc vào p bít (p chữ số) cuối khóa k Tốt ta nên chọn m cho h(k) phụ thuộc đầy đủ khóa k Thông thường chọn m số nguyên tố VD: Bảng băm có 4000 mục, chọn m = 4093 www.kenbon.net Hàm Băm s d ng Phng 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 danh sach thu I (bucket[i] www.kenbon.net + 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 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 toá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 toán emmpty: Kiểm tra bảng băm có rỗng không? - Phép toá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 toán remove: Xóa phần tử có khóa k bảng băm - Phép toá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 toá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 www.kenbon.net 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 phng 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 toá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ớ 2.4.2 B ng băm v i phng pháp k t n i h p nh t 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 www.kenbon.net - 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: 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 10 www.kenbon.net int next; //con tro chi nut ke tiep co xung dot } NODE; NODE hashtable[M]; //Khai bao bang bam Cài đ t b ng băm dùng phng pháp k t n i h p nh t: 2.4.3 B ng băm v i phng pháp dò tu n t 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ó khoá 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ó khoá 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 www.kenbon.net 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 phng pháp dò n tính: 12 www.kenbon.net 2.4.4 B ng băm v i phng 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 13 www.kenbon.net #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 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 phng 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[...]... Cài đ t b ng băm dùng phng pháp k t n i h p nh t: 2.4.3 B ng băm v i phng pháp dò tu n t Mô tả: - Cấu trúc dữ liệu: Bảng băm trong trường hợp này được cài đặt bằng danh sách kề có M phần tử, mỗi phần tử của bảng băm là một mẫu tin có một trường key để chứa khoá của phần tử Khi khởi động bảng băm thì tất cả trường key được gán NullKey; - Khi thêm phần tử có khoá key vào bảng băm, hàm băm h(key) sẽ... được khoá (trường hợp tìm thấy) hoặc bị rơi vào địa chỉ trống (trường hợp không tìm thấy) Bảng băm dùng hai hàm băm khác nhau, hàm băm lại của phương pháp băm kép được tính theo hai giá trị: i (kết quả hàm băm thứ nhất) và j (kết qủa hàm băm thứ hai) theo một công thức bất kì Nếu đã dò đến cuối bảng thì trở về dò lại từ đầu bảng Bảng băm minh họa có cấu trúc như sau: - Tập khóa K: tập số tự nhiên -... rơi vào địa chỉ trống (trường hợp không tìm thấy) - Hàm băm lại lần thứ i được biểu diễn bằng công thức sau: fi(key)=( f(key) + i2 ) % M với f(key) là hàm băm chính của bảng băm Nếu đã dò đến cuối bảng thì trở về dò lại từ đầu bảng Bảng băm minh họa có cấu trúc như sau: - Tập khóa K: tập số tự nhiên - Tập địa chỉ M: gồm 10 địa chỉ (M={0, 1, …, 9} - Hàm băm f(key) = key % 10 Khai báo c u trúc b ng băm: ... M-1, tìm phần tử khoá key trong bảng băm xuất phát từ địa chỉ i Hàm băm lại lần i được biểu diễn bằng công thức sau: f(key)=(f(key)+i) %M với f(key) là hàm băm chính của bảng băm Lưu ý địa chỉ dò tìm kế tiếp là địa chỉ 0 nếu đã dò đến cuối bảng Giả sử, khảo sát bảng băm có cấu trúc như sau: - Tập khóa K: tập số tự nhiên - Tập địa chỉ M: gồm 10 địa chỉ (M={0, 1, …, 9} - Hàm băm h(key) = key % 10 11 www.kenbon.net... hai hàm băm như sau: h1(key)= key %M h2(key) =(M-2)-key %(M-2) 15 www.kenbon.net Bảng băm trong trường hợp này được cài đặt bằng danh sách kề có M phần tử, mỗi phần tử của bảng băm là một mẫu tin có một trường key để lưu khoá các phần tử - Khi khởi động bảng băm, tất cả trường key được gán NULLKEY - Khi thêm phần tử có khoá key vào bảng băm, thì i=h1(key) và j=h2(key) sẽ xác định địa chỉ i và j trong... nut Cài đ t b ng băm dùng phng pháp dò tuy n tính: 12 www.kenbon.net 2.4.4 B ng băm v i phng pháp dò b c hai Mô tả: - Bảng băm trong trường hợp này được cài đặt bằng danh sách kề có M phần tử, mỗi phần tử của bảng băm là một mẫu tin có một trường key để chứa khóa các phần tử - Khi khởi động bảng băm thì tất cả 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) sẽ xác... chưa bị xung đột thì thêm phần tử mới vào địa chỉ này · Nếu bị xung đột thì hàm băm lại lần 1, hàm h1 sẽ xét địa chỉ kế tiếp, nếu lại bị xung đột thì hàm băm thì hàm băm lại lần 2, hàm h2 sẽ xét địa chỉ kế tiếp nữa, …, và quá trình cứ thế cho đến khi nào tìm được địa chỉ trống và thêm phần tử mới vào địa chỉ này - Khi tìm một phần tử có khoá key trong bảng băm, hàm băm h(key) sẽ xác định địa chỉ i trong... mới tại địa chỉ i này · Nếu bị xung đột thì hàm băm lại lần 1 h1 sẽ xét địa chỉ mới i+j, nếu lại bị xung đột thì hàm băm lại lần 2 h2 sẽ xét địa chỉ i+2j, …, quá trình cứ thế cho đến khi nào tìm được địa chỉ trống và thêm phần tử vào địa chi này - Khi tìm kiếm một phần tử có khoá key trong bảng băm, hàm băm i=h1(key) và j=h2(key) sẽ xác định địa chỉ i và j trong khoảng từ 0 đến M-1 Xét phần tử tại địa... 0 đến M-1 · Nếu chưa bị xung đột thì thêm phần tử mới vào địa chỉ i này · Nếu bị xung đột thì hàm băm lại lần 1 h1 sẽ xét địa chỉ cách i là 12, nếu lại bị xung đột thì hàm băm lại lần 2 h2 sẽ xét địa chỉ cách i 22 ,… , quá trình cứ thế cho đến khi nào tìm được trống và thêm phần tử vào địa chỉ này - Khi tìm kiếm một phần tử có khóa key trong bảng băm thì xét phần tử tại địa chỉ i=f(key), nếu chưa tìm... trên bảng băm, nếu không tìm thấy hàm này trả về trị M, nếu tìm thấy hàm này trả về địa chỉ tìm thấy int search(int k) { int i, d; i = hashfuns(k); d = 1; while(hashtable[i].key!=k&&hashtable[i].key !=NULLKEY) { //Bam lai (theo phuong phap bac hai) i = (i+d) % M; d = d+2; } hashtable[i].key =k; N = N+1; return(i); } 2.4.5 B ng băm v i phng pháp băm kép Mô tả: Phương pháp băm kép dùng hai hàm băm bất ... bảng băm, số phần tử giảm · Sao chép (Copy): Tạo bảng băm tử bảng băm cũ có · Xử lý khóa bảng băm (Traverse): xử lý toàn khóa bảng băm theo thứ tự địa từ nhỏ đến lớn www.kenbon.net Các B ng băm. .. vào bảng băm này, băm lần đầu bị xung đột dò đến địa chi mới, lần dò thứ i xét phần tử cách i2 gặp địa trống thêm phần tử vào địa *) Bảng băm với phương pháp băm kép: bảng băm dùng hai hàm băm. .. nhau, băm lần đầu với hàm băm thứ bị xung đột xét địa khác hàm băm thứ hai u m c a B ng băm: Bảng băm cấu trúc dung hòa thời gian truy xuất dung lượng nhớ: - Nếu giới hạn nhớ xây dựng bảng băm

Ngày đăng: 08/01/2016, 11:45

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN