Bài giảng môn cấu trúc dữ liệu 2: Chương 2

40 181 0
Bài giảng môn cấu trúc dữ liệu 2: Chương 2

Đ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

Trương Hải Bằng – Cấu trúc liệu CHƯƠNG - 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: chuyển đổi khóa thành số (xử lý băm) sử dụng số để đánh số 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 Chương 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 Chương giới thiệu chủ đề phép toán thường dùng 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 xố 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 giải tốn có cấu trúc liệu lớn lưu trữ nhớ 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 cách gián tiếp Hàm dùng để ánh xạ khoá vào dãy số nguyên dùng giá trị nguyên để truy xuất liệu gọi hàm băm (hình 1) Hình Như vậy, hàm băm hàm biến đổi khóa phần tử thành địa bảng băm Khóa dạng số hay số dạng chuỗi Hàm băm tốt thỏa mãn điều kiện sau: o Tính tốn nhanh o Các khố phân bố bảng o Ít xảy đụng độ Giải vấn đề băm với khố khơng phải số ngun: o Tìm cách biến đổi khoá thành số nguyên Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu � Ví dụ loại bỏ dấu ‘-’ mã số 9635-8904 đưa số nguyên 96358904 �Đối với chuỗi, sử dụng giá trị kí tự bảng mã ASCCI o Sau sử dụng hàm băm chuẩn số nguyên Hàm Băm sử dụng Phương pháp chia �Dùng số dư: o h(k) = k mod m o k khố, m kích thước bảng �vấn đề chọn giá trị m �m = 2n (không tốt) �nếu chọn m= 2n thông thường không tốt h(k) = k mod 2n chọn n bits cuối k �m nguyên tố (tốt) �Gia tăng phân bố �Thông thường m chọn số nguyên tố gần với 2n o Chẳng hạn bảng ~4000 mục, chọn m = 4093 Hàm Băm sử dụng Phương pháp nhân �Sử dụng o h(k) = m (k A mod 1) o k khóa, m kích thước bảng, A số: < A < �Chọn m A o M thường chọn m = 2p o Sự tối ưu việc chọn A phụ thuộc vào đặc trưng liệu o Theo Knuth chọn A = 1/2( -1)  0.618033987 xem tốt Phép băm phổ quát �Việc chọn hàm băm không tốt dẫn đến xác suất đụng độ lớn �Giải pháp: o Lựa chọn hàm băm h ngẫu nhiên o Chọn hàm băm độc lập với khóa o Khởi tạo tập hàm băm H phổ quát từ h chọn ngẫu nhiên Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu �Một tập hàm băm H phổ quát (universal ) với  f, k  H khố k, l ta có xác suất: Pr{f(k) = f(l)} 1 | | | | V i j n x m Hình 1.2 Bảng băm chữ nhật n-1 n n+1 n+2 mxn Danh sách kề mơ tả bảng băm hình chữ nhật bảng băm: phần tử x thuộc hàng cột - f(1,2) = n + Tổng quát, phần tử thuộc hàng i, cột j cho công thức: f(i,j) =ni + j (n số cột bảng chữ nhật) Bảng băm tam giác (m hàng) bảng băm tam giác (n cột): Hình sau bảng tam giác m hàng Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu Hình 1.3.a Bảng băm tam giác m hàng Và bảng băm tam giác n cột Hình 1.3.b Bảng băm tam giác n cột Mỗi phần tử bảng tam giác tương ứng với hai khóa hàng i, cột j(i>=j), địa phần tử danh sách kề xác định qua hàm băm: f(i,j)=i(i+1)/2 + j Bảng băm đường chéo (n cột): Hình sau dạng bảng đường chéo n cột, xác định hàm băm cho bảng đường chéo i=j Chương 2: Bảng băm i = j hay i = j-1 Trang Trương Hải Bằng – Cấu trúc liệu i = j hay i = j+1 i = j hay i = j1 Hình 1.4 Các bảng băm đường chéo Như giới thiệu phần trên, với bảng băm đơn giản cần xây dựng hàm băm để truy xuất liệu lưu trữ phần tử bảng băm Hàm băm thường có dạng cơng thức tổng qt HF(key) hay f(khoá) tổ chức dạng bảng tra gọi bảng truy xuất (access table) BẢNG BĂM ADT (HASH TABLE - ADT) Phần trình bày vấn đề chính: - Mơ tả cấu trúc bảng băm tổng qt (thơng qua hàm băm, tập khóa, tập địa chỉ…) - Các phép toán bảng băm thêm phần tử (insert), loại bỏ (remove), tìm kiếm (search), … Bảng băm ADT: a Mô tả liệu Giả sử �K: tập khoá (set of keys) �M: tập dịa (set of addresses) �HF(k): hàm băm dùng để ánh xạ khoá k từ tập khoá K thành địa tương ứng tập M Tập khóa K Hàm băm Tập địa M b Các phép toán bảng băm �Khởi tạo (Initialize): Khỏi tạo bảng băm, cấp phát vùng nhớ hay qui định số phần tử (kích thước) bảng băm �Kiểm tra rỗng (Empty): kiểm tra bảng băm có rỗng hay khơng? Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu �Lấy kích thước bảng băm (Size): Cho biết số phần tử có bảng băm �Tìm kiếm (Search): Tìm kiếm phần tử bảng băm theo khoá k định trước �Thêm phần tử (Insert): Thêm phần tử vào bảng băm Sau thêm số phần tử có bảng băm tăng thêm đơn vị �Loại bỏ (Remove): Loại bỏ phần tử khỏi 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ó �Duyệt (Traverse): duyệt bảng băm theo thứ tự địa từ nhỏ đến lớn Các Bảng băm thông dụng: Với loại bảng băm cần thiết phải xác định tập khóa K, xác định tập địa M xây dựng hàm băm HF cho phù hợp Mặt khác, xây dựng hàm băm cần thiết phải tìm kiếm giải pháp để giải xung đột, nghĩa giảm thiểu ánh xạ nhiều khoá khác vào địa (ánh xạ nhiều-một) Bảng băm với phương pháp nối kết trực tiếp: địa bảng băm(gọi bucket) tương ứng danh sách liên kết Các phần tử bị xung đột nối kết với danh sách liên kết Bảng băm với phương pháp nối kết hợp nhất: bảng băm loại cài đặt danh sách kề, phần tử có hai trường: trường key chứa khóa phần tử trường next phần tử kế bị xung đột Các phần tử bị xung đột nối kết qua trường nối kết next Bảng băm với phương pháp dò tuyến tính: ví dụ thêm phần tử vào bảng băm loại băm lần đầu bị xung đột dò địa kế gặp địa trống thêm phần tử vào địa Bảng băm với phương pháp dò bậc hai: ví dụ thêm phần tử vào bảng băm loại này, băm lần đầu bị xung đột dò đến địa chi mới, lần dò i phần tử cách khoảng i 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 loại dùng hai hàm băm khác 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 điểm 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 khơng có giới hạn nhớ xây dựng bảng băm với kháa ứng với địa với mong muốn thời gian truy xuất tức thời - Nếu dung lượng nhớ có giới hạn tổ chức số khóa có địa chỉ, lúc thời gian truy xuất có bi suy giảm đơi chút Bảng băm ứng dụng nhiều thực tế, thích hợp tổ chức liệu có kích thước lớn lưu trữ nhớ Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệuDỤ VỀ CÁC HÀM BĂM Hàm băm dạng bảng tra: Hàm băm tổ chức dạng bảng tra (còn gọi bảng truy xuất), thông dụng dạng công thức Ví dụ sau bảng tra với khóa chữ cái, bảng băm có 26 địa từ đến 25 Khóa a ứng với địa 0, khóa b ứng với địa 1,… , z ứng với địa 25 Khố Địa Khóa Địa Khóa Địa Khóa Địa a h o 14 v 21 b I p 15 w 22 c j q 16 x 23 d k 10 r 17 y 24 e l 11 s 18 z 25 f m 12 t 19 / / g n 13 u 20 / / Hình 3.1 Hàm băm dạng bảng tra tổ chức dạng danh sách kề Hàm băm dạng công thức: Thông thường hàm băm dạng công thức xây dựng theo dạng tổng quát f(key) Người ta thường dùng hàm băm chia (% modulo) ví dụ sau: Ví dụ 1: f(key) = key % 10: Theo ví dụ này, hàm băm f(key) băm số nguyên thành 10 địa khác (ánh xạ vào địa từ 0, 1,…, 9) Các khóa có hàng đơn vị băm vào địa 0, khóa có hàng đơn vị i (i=0 | | … | 9) băm vào địa thứ i Ví dụ 2: f(key)=key % M: Hàm băm loại cho phép băm số nguyên thành M địa khác (ánh xạ vào địa từ 0, 1,… M-1) Ví dụ 3: Giả sử cần xây dựng hàm băm với tập khóa số chuổi 10 kí tự, tập địa có M địa khác Có nhiều cách để xây dựng hàm băm này, ví dụ cộng dồn mã ASCII kí tự, sau chia (% modulo) cho M Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu Thông thường, hàm băm dạng công thức đa dạng không bị ràng buộc tiêu chuẩn Yêu cầu hàm băm tốt: Một hàm băm tốt thường phải thỏa yêu cầu sau: �Phải giảm thiểu xung đột �Phải phân bố phần tử M địa khác bảng băm 2.4 CÁC CÁCH GIẢI QUYẾT XUNG ĐỘT Như đề cập phần trên, xung đột tượng khóa khác băm địa nhau, hay ánh xạ vào địa Một cách tổng quát, key1key2 mà f(key1)=f(key2) nói phần tử có khóa key1 xung đột với phần tử có khóa key2 Thực tế người ta giải xung đột theo hai phương pháp: phương pháp nối kết phương pháp băm lại Giải xung đột phương pháp nối kết: Các phần tử bị băm địa (các phần tử bị xung đột) gom thành danh sách liên kết Lúc phần tử bảng băm cần khai báo thêm trường liên kết next phần tử kế bị xung đột địa Bảng băm giải xung đột phương pháp cho phép tổ chức phần tử bảng băm linh hoạt: thêm phần tử vào bảng băm thêm phần tử vào danh sách liên kết thích hợp phụ thuộc vào băm Tuy nhiên bảng bảng băm loại bị hạn chế tốc độ truy xuất Các loại bảng băm giải xung đột phương pháp nối kết như: bảng băm với phương pháp nối kết trực tiếp, bảng băm với phương pháp nối kết hợp Giải xung đột phương pháp băm lại: Nếu băm lần đầu bị xung đột băm lại lần 1, bị xung đột băm lai lần 2,… Quá trình băm lại diễn khơng xung đột Các pháp băm lại (rehash function) thường chọn địa khác cho phần tử Để tăng tốc độ truy xuất, bảng băm giải xung đột phương pháp băm lại thường cài đặt danh sách kề Tuy nhiên việc tổ chức phần tử bảng băm khơng linh hoạt phần tử lưu trữ danh sách kề có kích thước xác định trước Các loại bảng băm giải xung đột phương pháp băm lại như: bảng băm với phương pháp dò tuyến tính, bảng băm với phương pháp dò bậc hai, bảng băm với phương pháp băm kép 2.4.1 Bảng băm với phương pháp nối kết trực tiếp (Direct chaining Method) Mô tả: Xem hình vẽ Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu Hình 1.6 bảng băm với phương pháp nối kết trực tiếp 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 nối kết 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 cho vấn đề vừa nêu: 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 f(key) = key % 10 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: Chương 2: Bảng băm Trang Trương Hải Bằng – Cấu trúc liệu �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 Để giúp việc truy xuất bảng băm dễ dàng, phần tử bucket cần thiết tổ chức theo thứ tự, chẳng hạn từ nhỏ đến lớn theo khóa �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 dùng để tính địa khố k phần tử cần chèn, 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 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: #define M 100 struct nodes { int key; struct nodes *next }; //khai bao kieu tro chi nut typedef struct nodes *NODEPTR; /* khai bao mang bucket chua M tro dau cua Mbucket */ NODEPTR bucket[M]; b.Các phép toán: Hàm băm Giả sử chọn hàm băm dạng %: f(key)=key % M int hashfunc (int key) { return (key % M); } Chúng ta dùng hàm băm thay cho hàm băm dạng % Phép toán initbuckets: Khởi động bucket void initbuckets( ) { int b; for (b=0;bM) i= i-M; } hashtable[i].key=k; N=N+1; return(i); } Nhận xét bảng băm dùng phương pháp dò tuyến tính: Bảng băm tối ưu băm đều, nghĩa là, bảng băm khối đặc chứa vài phần tử khối phần tử chưa sử dụng xen kẻ nhau, tốc độ truy xuất lúc có bậc 0(1) Trường hợp xấu băm không bảng băm đầy, lúc hình thành khối đặc có n phần tử, nên tốc độ truy xuất lúc có bậc 0(n) Chương trình minh họa: Bảng băm, dùng phương pháp dò tuyến tính (linear proping method)-cài đặt danh sách kề #include #include Chương 2: Bảng băm Trang 27 Trương Hải Bằng – Cấu trúc liệu #include #define TRUE #define FALSE -1 #define NULLKEY �1 #define M 100 //Khai bao cau truc mot nut cua bang bam struct node { int key;//khoa cua nut tren bam }; //Khai bao bang bam co M nut struct node hashtable[M]; int N; //bien toan cuc chi so nut hien co tren bang bam //Ham bam int hashfunc(int key) { return(key % M); } //Khoi dong bang bam void initialize( ) { int i; for (i=0;i =M) i=i-M; } if(hashtable[i].key ==k)//tim thay rerurn(i); else//khong tim thay return(M); } //Tac vu insert:them nut co khoa k vao bang bam int insert(int k) Chương 2: Bảng băm Trang 28 Trương Hải Bằng – Cấu trúc liệu { int i, j; if(full( )) { printf("\n Bang bam bi day khong them nut co khoa %d duoc",k); return; } i=hashfunc(k); while(hashtable[i].key !=NULLKEY) { //Bam lai (theo phuong phap tuyen tinh) i ++; if(i >M) i= i-M; } hashtable[i].key=k; N=N+1; return(i); } //Tac vu remove:xoa nut tai dia chi i tren bang bam Void remove(int i) { int j, r, cont, a; cont = TRUE; { hashtable[i].key = NULLKEY; j = i; { i=i +1; if(i >=M) i=i �M; if(hashtable[i].key == NULLKEY) cont = FALSE; else { r = hashfunc(hashtable[i].key); a = (j Next; } if(done ==0) return temp; else return NULL; } /**hàm tạo từ điển**/ void MakeDictionary() { NodePtr p; char word[10]; char mean[50]; { fflush(stdin); printf("\n Nhập từ cần tra :"); gets(word); if(!strcmp(word,"")) break; fflush(stdin); Chương 2: Bảng băm Trang 38 Trương Hải Bằng – Cấu trúc liệu printf("\n%d Nhập nghiã :",hashfunc(word)); gets(mean); p=GetNode(word,mean); Insert(p); } } while (1); /***hàm tìm từ từ điển****/ void FindWord() { NodePtr p; char word[10]; printf("\n Nhập từ: "); fflush(stdin); gets(word); p=Find(word); if(p==NULL) printf("Khơng có từ điển"); else printf("\n Có từ: %s \nNghiã %s \n ", p->word,p->mean); return; } void PrintList(NodePtr List) { NodePtr temp; temp=List; while (temp!=NULL) { printf("\n Từ: %s",temp->word); printf("\n Nghiã: %s\n\n",temp->mean); temp=temp->Next; } } void DisplayDictionnary() { int i; for (i=0;i

Ngày đăng: 08/06/2018, 12:21

Từ khóa liên quan

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

Tài liệu liên quan