3. CÁC PHƯƠNG PHÁP GIẢI QUYẾT ĐỤNG ĐỘ
3.1. Bảng băm với phương phỏp nối kết trực tiếp (Direct chaining Method)
(Direct chaining Method)
Mụ tả: Xem hỡnh vẽ
Bảng băm được càiđặt bằng cỏc danh sỏch liờn kết, cỏc phần tử trờn bảng băm được “băm” thành M danh sỏch liờn kết (từ danh sỏch 0 đến danh sỏch M–1). Cỏc phần tử bị xung đột tại địa chỉ i được nối
kết trực tiếp với nhau qua danh sỏch liờn kết ị Chẳng hạn, với M =
10, cỏc phần tử cú hàngđơn vị là 9 sẽ được băm vào danh sỏch liờn kết i = 9. 11 31 51 30 50 60 2 12 42 23 33 53 4 14 45 55 65 16 26 46 37 67 87 28 78 49 59 89 71 81 73 93 86 96 72 95 0 1 2 3 4 5 6 7 8 9
Khi thờm một phần tửcú khúa k vào bảng băm, hàm băm f(k) sẽ xỏc định địa chỉ i trong khoảng từ 0 đến M-1ứng với danh sỏch liờn kết
i mà phần tử này sẽ được thờm vàọ
Khi tỡm một phần tửcú khúa k vào bảng băm, hàm băm f(k) cũng sẽ
xỏcđịnh địa chỉ i trong khoảng từ 0 đến M-1ứng với danh sỏch liờn kết i cú thể chứa phần tử nàỵ Nhưvậy, việc tỡm kiếm phần tử trờn bảng băm sẽ được qui về bài toỏn tỡm kiếm một phần tử trờn 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 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.
Hỡnh 2.3minh họa bảng băm vừa mụ tả. Theo hỡnh vẽ, bảng băm đó “băm” phần tử trong tập khoỏ K theo 10 danh sỏch liờn kết khỏc
nhau, mỗi danh sỏch liờn kết gọi là một HASHTABLE:
HASHTABLE 0 gồm những phần tử cú khúa tận cựng bằng
0.
HASHTABLE i(i=0 | … | 9) gồm những phần tử cú khúa tận
cựng bằng ị Để giỳp việc truy xuất bảng băm dễ dàng, cỏc phần tử trờn cỏc HASHTABLE cần thiết được tổ chức theo
một thứ tự, chẳng hạn từ nhỏ đến lớn theo khúạ
Khi khởi động bảng băm, con trỏ đầu của cỏc HASHTABLE
là NULL.
Theo cấu trỳc này, với tỏc vụ insert, hàm băm sẽ được dựngđể tớnh địa chỉ của khoỏ k của phần tử cần chốn, tức là xỏc định được
HASHTABLE chứa phần tử và đặt phần tử cần chốn vào HASHTABLE nàỵ
Với tỏc vụ search, hàm băm sẽ được dựng để tớnh địa chỉ và tỡm phần tử trờn HASHTABLE tươngứng.
Càiđặt bảng băm dựng phương phỏp nối kết trực tiếp
ạ Khai bỏo cấu trỳc bảng băm #define M 100
typedef struct nodes {
int key;
struct nodes *next }NODE;
//khai bao kieu con tro chi nut typedef NODE *pHNODE;
/*---khai bao mang HASHTABLE chua M con tro dau cua MHASHTABLE