BẢNG BĂM
Số trang: 10
Loại file: doc
Dung lượng: 111.50 KB
Lượt xem: 16
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Các thuật toán tìm kiếm đều dựa vào việc so sánh giá trị khoá (Key) của phần tử cầntìm với các giá trị khoá trong tập các phần tử, thao tác này• Phụ thuộc kích thước của tập các phần tử• Thời gian tìm kiếm không nhanh do phải thực hiện nhiều phép so sánh có thể khôngcần thiết ( O(n), O(logn), …)= Có phương pháp lưu trữ nào cho phép thực hiện tìm kiếm với hiệu suất cao hơnkhông ( độ phức tạp hằng số)?...
Nội dung trích xuất từ tài liệu:
BẢNG BĂM Bảng bămNội dung1.1) Bảng băm1.2) Định nghĩa hàm băm1.3) Một số phương pháp xây dựng hàm băm1.4) Các phương pháp giải quyết đụng độCác thuật toán tìm kiếm đều dựa vào việc so sánh giá trị khoá (Key) của phần tử cầntìm với các giá trị khoá trong tập các phần tử, thao tác này• Phụ thuộc kích thước của tập các phần tử• Thời gian tìm kiếm không nhanh do phải thực hiện nhiều phép so sánh có thể khôngcần thiết ( O(n), O(logn), …)=> Có phương pháp lưu trữ nào cho phép thực hiện tìm kiếm với hiệu suất cao hơnkhông ( độ phức tạp hằng số)?1.1) Bảng băm (Hash Table)Ví dụ: Giả sử ta có một tập phần tử gồm các giá trị khoá bất kỳ được tổ chức lưu trữdưới dạng bảng chỉ mục m phần tử như sau gọi là bảng truy xuất trực tiếp (Directaccess table)• Phần tử có giá trị khoá k được lưu trữ tương ứng tại vị trí thứ k trong bảng chỉ mục• Để tìm kiếm một phần tử nào đó ta sẽ dựa vào khoá của nó và tra trong bảng chỉmục, nếu tại vị trí đó có phần tử thì chính là phần tử cần tìm, nếu không có phần tửnào có nghĩa là phần tử cần tìm không có trong bảng chỉ mục• Thời gian tìm kiếm là hằng số O(1) Đây là dạng bảng băm cơ bảna. Mô tả dữ liệuGiả sử• K: tập các khoá (set of keys)• A: tập các địa chỉ (set of addresses• HF(k): hàm băm dùng để ánh xạ một khoá k từ tập các khoá K thành một địa chỉtương ứng trong tập A.b. Các phép toán trên bảng băm• Khởi tạo (Initialize)• Kiểm tra rỗng (Empty)• Lấy kích thước của bảng băm (Size)• Tìm kiếm (Search)• Thêm mới phần tử (Insert)• Loại bỏ (Remove)• Sao chép (Copy)• Duyệt (Traverse)c. Phân loại bảng băm• Bảng băm đóng : mỗi khóa ứng với một địa chỉ, thời gian truy xuất là hằng số• Bảng băm mở : một số khóa có cùng địa chỉ, lúc này mỗi mục địa chỉ sẽ là một danhsách liên kết các phần tử có cùng địa chỉ, thời gian truy xuất có thể bị suy giảm đôichút1.2) Định nghĩa hàm bămLà hàm biến đổi giá trị khoá (số, chuỗi…) thành địa chỉ, chỉ mục trong bảng bămVí dụ : hàm băm biến đổi khoá dạng chuỗi gồm n kí tự thành 1 địa chỉ (số nguyên)int hashfunc( char *s, int n ){int sum = 0;while( n-- ) sum = sum + *s++;return sum % 256;} 131◊Tính địa chỉ của khoá “AB” : hashfunc(“AB”,2) 131◊Tính địa chỉ của khoá “BA” : hashfunc(“BA”,2) Khi hàm băm 2 khoá vào cùng 1 địa chỉ thì gọi là đụng độ (Collision) Hàm băm tốt thỏa mãn các điều kiện sau:≅• Tính toán nhanh.• Các khoá được phân bố đều trong bảng.• Ít xảy ra đụng độ1.4) Một số phương pháp giải quyết sự đụng độNgười ta giải quyết sự đụng độ theo hai phương pháp: phương pháp nối kết vàphương pháp băm lại.Giải quyết sự đụng độ bằng phương pháp nối kết (Chaining Method):Các phần tử bị băm vào cùng địa chỉ (các phần tử bị đụng độ) được gom thành mộtdanh sách liên kết (gọi là một bucket).Cài đặt bảng băm dùng phương pháp nối kết trực tiếp :a. Khai báo cấu trúc bảng băm:#Code: define M 100 struct nodes { int key; struct nodes *next };//khai bao kieu con tro chi nutCode: typedef struct nodes *NODEPTR;/*khai bao mang bucket chua M con tro dau cua M bucket*/Code: NODEPTR bucket[M];b.Các phép toán:Hàm bămGiả sử chúng ta chọn hàm băm dạng %: f(key)=key % M.Code: int hashfunc (int key) { return (key % M); }Phép toán initbuckets:Code: void initbuckets( ) { int b; for (b=0;b int b; b= hashfunc(k) place(b,k); //tac vu place cua danh sach lien ket }Phép toán remove:Code: void remove ( int k) { int b; NODEPTR q, p; b = hashfunc(k); p = hashbucket(k); q=p; while(p !=NULL && p->key !=k) { q=p; p=p->next; } if (p == NULL) printf( khong co nut co khoa %d ,k); else if (p == bucket [b]) pop(b); //Tac vu pop cua danh sach lien ket else delafter(q); /*tac vu delafter cua danh sach lien ket*/ }Phép toán clearbucket:Xóa tất cả các phần tử trong bucket b.Code: void clearbucket (int b) { NODEPTR p,q; //q la nut truoc,p la nut sau q = NULL; p = bucket[b]; while(p !=NULL) { q = p; p=p->next; freenode(q); } bucket[b] = NULL; //khoi dong lai butket b }Phép toán clear:Xóa tất cả các phần tử trong bảng băm.Code: void clear( ) { int b; for (b = 0; bkey); p= p->next; } }Phép toán traverse:Duyệt toàn bộ bảng băm.Code: void traverse( ) { int b; for (b = 0;n p->key && p !=NULL) p=p->next; if (p == NULL | | k !=p->key)// khong tim thay return(NULL); else//tim thay // else //tim thay return(p); }hailoc12Xem Hồ sơ công khaiGửi một tin nhắn tới hailoc12Tìm toàn bộ bài viết bởi hailoc12 #4 27-09-2007, 09:16 PM Ngày gia nhập: 08 2006 hailoc12 Nơi ở: Hải Phòng XCoworker Member Bài viết: 285Giải quyết sự đụng độ bằng phương pháp băm lại:• Phương pháp dò tuyến tính (Linear Probe)Nếu băm ...
Nội dung trích xuất từ tài liệu:
BẢNG BĂM Bảng bămNội dung1.1) Bảng băm1.2) Định nghĩa hàm băm1.3) Một số phương pháp xây dựng hàm băm1.4) Các phương pháp giải quyết đụng độCác thuật toán tìm kiếm đều dựa vào việc so sánh giá trị khoá (Key) của phần tử cầntìm với các giá trị khoá trong tập các phần tử, thao tác này• Phụ thuộc kích thước của tập các phần tử• Thời gian tìm kiếm không nhanh do phải thực hiện nhiều phép so sánh có thể khôngcần thiết ( O(n), O(logn), …)=> Có phương pháp lưu trữ nào cho phép thực hiện tìm kiếm với hiệu suất cao hơnkhông ( độ phức tạp hằng số)?1.1) Bảng băm (Hash Table)Ví dụ: Giả sử ta có một tập phần tử gồm các giá trị khoá bất kỳ được tổ chức lưu trữdưới dạng bảng chỉ mục m phần tử như sau gọi là bảng truy xuất trực tiếp (Directaccess table)• Phần tử có giá trị khoá k được lưu trữ tương ứng tại vị trí thứ k trong bảng chỉ mục• Để tìm kiếm một phần tử nào đó ta sẽ dựa vào khoá của nó và tra trong bảng chỉmục, nếu tại vị trí đó có phần tử thì chính là phần tử cần tìm, nếu không có phần tửnào có nghĩa là phần tử cần tìm không có trong bảng chỉ mục• Thời gian tìm kiếm là hằng số O(1) Đây là dạng bảng băm cơ bảna. Mô tả dữ liệuGiả sử• K: tập các khoá (set of keys)• A: tập các địa chỉ (set of addresses• HF(k): hàm băm dùng để ánh xạ một khoá k từ tập các khoá K thành một địa chỉtương ứng trong tập A.b. Các phép toán trên bảng băm• Khởi tạo (Initialize)• Kiểm tra rỗng (Empty)• Lấy kích thước của bảng băm (Size)• Tìm kiếm (Search)• Thêm mới phần tử (Insert)• Loại bỏ (Remove)• Sao chép (Copy)• Duyệt (Traverse)c. Phân loại bảng băm• Bảng băm đóng : mỗi khóa ứng với một địa chỉ, thời gian truy xuất là hằng số• Bảng băm mở : một số khóa có cùng địa chỉ, lúc này mỗi mục địa chỉ sẽ là một danhsách liên kết các phần tử có cùng địa chỉ, thời gian truy xuất có thể bị suy giảm đôichút1.2) Định nghĩa hàm bămLà hàm biến đổi giá trị khoá (số, chuỗi…) thành địa chỉ, chỉ mục trong bảng bămVí dụ : hàm băm biến đổi khoá dạng chuỗi gồm n kí tự thành 1 địa chỉ (số nguyên)int hashfunc( char *s, int n ){int sum = 0;while( n-- ) sum = sum + *s++;return sum % 256;} 131◊Tính địa chỉ của khoá “AB” : hashfunc(“AB”,2) 131◊Tính địa chỉ của khoá “BA” : hashfunc(“BA”,2) Khi hàm băm 2 khoá vào cùng 1 địa chỉ thì gọi là đụng độ (Collision) Hàm băm tốt thỏa mãn các điều kiện sau:≅• Tính toán nhanh.• Các khoá được phân bố đều trong bảng.• Ít xảy ra đụng độ1.4) Một số phương pháp giải quyết sự đụng độNgười ta giải quyết sự đụng độ theo hai phương pháp: phương pháp nối kết vàphương pháp băm lại.Giải quyết sự đụng độ bằng phương pháp nối kết (Chaining Method):Các phần tử bị băm vào cùng địa chỉ (các phần tử bị đụng độ) được gom thành mộtdanh sách liên kết (gọi là một bucket).Cài đặt bảng băm dùng phương pháp nối kết trực tiếp :a. Khai báo cấu trúc bảng băm:#Code: define M 100 struct nodes { int key; struct nodes *next };//khai bao kieu con tro chi nutCode: typedef struct nodes *NODEPTR;/*khai bao mang bucket chua M con tro dau cua M bucket*/Code: NODEPTR bucket[M];b.Các phép toán:Hàm bămGiả sử chúng ta chọn hàm băm dạng %: f(key)=key % M.Code: int hashfunc (int key) { return (key % M); }Phép toán initbuckets:Code: void initbuckets( ) { int b; for (b=0;b int b; b= hashfunc(k) place(b,k); //tac vu place cua danh sach lien ket }Phép toán remove:Code: void remove ( int k) { int b; NODEPTR q, p; b = hashfunc(k); p = hashbucket(k); q=p; while(p !=NULL && p->key !=k) { q=p; p=p->next; } if (p == NULL) printf( khong co nut co khoa %d ,k); else if (p == bucket [b]) pop(b); //Tac vu pop cua danh sach lien ket else delafter(q); /*tac vu delafter cua danh sach lien ket*/ }Phép toán clearbucket:Xóa tất cả các phần tử trong bucket b.Code: void clearbucket (int b) { NODEPTR p,q; //q la nut truoc,p la nut sau q = NULL; p = bucket[b]; while(p !=NULL) { q = p; p=p->next; freenode(q); } bucket[b] = NULL; //khoi dong lai butket b }Phép toán clear:Xóa tất cả các phần tử trong bảng băm.Code: void clear( ) { int b; for (b = 0; bkey); p= p->next; } }Phép toán traverse:Duyệt toàn bộ bảng băm.Code: void traverse( ) { int b; for (b = 0;n p->key && p !=NULL) p=p->next; if (p == NULL | | k !=p->key)// khong tim thay return(NULL); else//tim thay // else //tim thay return(p); }hailoc12Xem Hồ sơ công khaiGửi một tin nhắn tới hailoc12Tìm toàn bộ bài viết bởi hailoc12 #4 27-09-2007, 09:16 PM Ngày gia nhập: 08 2006 hailoc12 Nơi ở: Hải Phòng XCoworker Member Bài viết: 285Giải quyết sự đụng độ bằng phương pháp băm lại:• Phương pháp dò tuyến tính (Linear Probe)Nếu băm ...
Tìm kiếm theo từ khóa liên quan:
thủ thuật lập trình lập trình căn bản bảng băm thuật toán tìm kiếm phương pháp xây dựng hàm bămGợi ý tài liệu liên quan:
-
114 trang 242 2 0
-
Giáo trình Toán rời rạc: Phần 1 - Nguyễn Gia Định
67 trang 232 0 0 -
80 trang 222 0 0
-
Thủ thuật giúp giải phóng dung lượng ổ cứng
4 trang 217 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 208 0 0 -
Hướng dẫn lập trình với Android part 4
5 trang 156 0 0 -
Giáo trình Lập trình C căn bản - HanoiAptech Computer Education Center
136 trang 134 0 0 -
142 trang 130 0 0
-
124 trang 113 3 0
-
150 trang 104 0 0
-
78 trang 103 0 0
-
7 trang 85 0 0
-
87 trang 80 0 0
-
8 trang 79 0 0
-
81 trang 68 0 0
-
10 trang 68 0 0
-
72 trang 50 1 0
-
Ngân hàng câu hỏi trắc nghiệm về lập trình web ASP.Net (C#)
11 trang 44 0 0 -
Ngân hàng đề thi học phần Nhập môn tin học - Nhập môn lập trình
18 trang 44 0 0 -
The CISA Prep Guide Mastering the Certified Information Systems Auditor Exam phần 1
60 trang 43 0 0