Tải bản đầy đủ (.doc) (20 trang)

xây dựng bảng băm dùng phương pháp kết nối trực tiếp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (267.49 KB, 20 trang )

Phần 1
Cấu trúc của bản băm
1. Cấu trúc dữ liệu bảng băm.
- Tương tự như trong trường hợp cài đặt bằng phương phỏp nối
kết hợp nhất và các phương pháp khác.
- Phép băm ở đây cũng dựa trên ý tưởng chung: biến đổi giỏ trị
khúa thành một số (xử lý băm) và sử dụng số này để đỏnh chỉ cho bảng
dữ liệu.
- Cách xây dựng bảng băm và các phộp toỏn trờn bảng băm khác
với các cấu trúc trước đây, như: mảng, danh sách, cây nhị phân, … phần
lớn được thực hiện bằng cỏch so sỏnh giá trị của các phần tử của cấu
trúc, vì vậy thời gian truy xuất khụng nhanh và phụ thuộc vào kớch thước
của cấu trỳc. Đặc biệt khi cần phải xử lý cỏc bài toỏn cú dữ liệu lớn và
được lưu trữ ở bộ nhớ ngoài.
- Để khắc phục nhược điểm đó, cấu trúc của bảng băm tổng quát
sẽ giải quyết thông qua: tập khoá, tập địa chỉ, hàm băm.
Tập khoá K Hàm băm Tập địa chỉ M
K: Tập cỏc khoỏ (set of keys)
M: Tập cỏc dịa chỉ (set of addresses).
h(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 M.
1
*
*
*
*






2. Ph ép băm.
Phần lớn trong hầu hết cỏc ứng dụng, khoỏ được dựng như một cách
thức để truy xuất dữ liệu. Hàm băm được dựng để ỏnh xạ giỏ trị khúa vào
một dóy cỏc địa chỉ của bảng băm. Khúa cú thể là dạng số hay số dạng
chuỗi. Nếu như cú 2 khúa k
i
và k
j
nếu h(ki)=h(kj) thỡ hàm băm bị đụng
độ. Do đó ta phải có cách nào đó để khắc phục sự đung độ đó.
3. M ột số hàm băm phổ biến.
* Hàm Băm sử dụng Phương phỏp nhõn.
h(k) = [m*(k*A mod 1)]
k là khúa, m là kớch thước bảng, A là hằng số: 0 < A < 1
* Hàm Băm sử dụng Phương phỏp chia.
Dựng số dư: h(k) = k mod m
k là khoỏ, m là kớch thước của bảng.
Do đó h(k) sẽ nhận: 0,1,2,…,m-1.
Việc ta chọn m sẽ ảnh hưởng đến h(k).
* Bảng băm với phương phỏp dũ tuần tự.
Bảng băm đượ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 tạo tất cả trường key được gỏn NullKey.
- Khi thờm phần tử cú khoỏ k vào bảng băm, hàm băm h(k) sẽ xỏc định
địa chỉ i trong khoảng từ 0 đến M-1:
ã Nếu chưa bị xung đột thỡ thờm phần tử mới vào địa chỉ này.
2
h
k

h(k)
ã 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.
* Bảng băm với phương phỏp kết nối hợp nhất.
Bảng băm này được cài đặt bằng danh sỏch kề, mỗi phần tử cú hai
trường: trường key chứa khúa của phần tử và trường next chỉ phần tử kế
bị xung đột. Cỏc phần tử bị xung đột được kết nối nhau qua trường kết
nối next
* Bảng băm với phương phỏp dũ bậc hai.
Khi thờm phần tử vào bảng băm này, nếu băm lần đầu bị xung đột thỡ sẽ
dũ đến địa chi mới, ở lần dũ thứ i sẽ xột phần tử cỏch i
2
cho đến khi gặp
địa chỉ trống đầu tiờn thỡ thờm phần tử vào địa chỉ này.
* Bảng băm với phương phỏp băm kộp.
Bảng băm này dựng hai hàm băm khỏc nhau, băm lần đầu với hàm băm
thứ nhất nếu bị xung đột thỡ xột địa chỉ khỏc bằng hàm băm thứ hai.
* Bảng băm với phương pháp kết nối trực tiếp
4. Bảng băm với phương pháp kết nối trực tiếp
(Direct c haining Method)
a. ý tưởng:
1. Biến đổi giỏ trị khúa thành một số (xử lý băm) và sử
dụng số này để đỏnh chỉ cho
bảng dữ liệu.
2. 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).
3. Các giá trị khoá được phân vào từng cụm (bucket) là

ứng với một địa chỉ băm, hay mỗi địa chỉ của bảng
3
băm tương ứng một danh sỏch liờn kết, cỏc phần tử bị
xung đột tại địa chỉ i được kết nối trực tiếp với nhau
qua danh sỏch liờn kết i.
b. Mô tả:
+ Giả sử ta chọn M=10, các địa chỉ băm được đánh số từ 0 đến
9. Do đó các phần tử có hàng đơn vị tương ứng i (với i = 0 đến 9) sẽ được
băm vào danh sách liên kết i.
+ Mỗi phần tử của bảng băm gồm hai trường;
- Trường key: chứa khoá của mỗi phần tử
- Trường next: con trỏ chỉ đến phần tử kế tiếp, nếu có xung
đột.
+ Tập địa chỉ cụm i (0 đến M-1) có kích thước nhỏ thì có thể lưu
trữ ở bộ nhớ trong, ngược lại phải lưu ở thiết bị nhớ ngoài và khối
của bảng chỉ dẫn cụm (ở đầu mỗi danh sách liên kết i; i = 0 đến M-
1) chứa con trỏ, trỏ đến giá trị đầu tiên của danh sách liên kết và sẽ
được gọi vào bộ nhớ trong khi một giá trị băm i được tính.
Ví dụ: Cỏc phần tử cú hàng đơn vị là 5 sẽ được băm vào danh sỏch
liờn kết i = 5, cỏc phần tử cú hàng đơn vị là 8 sẽ được băm vào danh sỏch
liờn kết i = 8.
+ 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ào.
- Nếu chưa bị xung đột thỡ thờm phần tử mới vào địa chỉ này và
con trỏ next nhận giá trị Nil.
- Nếu bị xung đột thỡ phần tử mới được cấp phỏt là phần tử đứng
trước p^.key nếu: k < p^.key ngược lại đứng sau p^.key
nếu: k > p^.key. (Điều này không nhất thiết phải như vậy vì việc
4

ta làm như trên rất thuận lợi cho tìm kiếm sau này nếu cần.
Danh sách liên kết được sắp xếp theo giá trị các khoá tăng
dần.). Con trỏ liên kết next cũng được cập nhật lại sao cho cỏc
phần tử bị xung đột hỡnh thành một danh sỏch liờn kết.
+ Khi tỡm một phần tử cú khúa k trong 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ày. 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.
+ Khi xoá 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ày. Như vậy, việc xoá phần tử trờn bảng băm sẽ được qui về bài toỏn
xoá một phần tử trờn danh sỏch liờn kết.
+ éể minh họa ta 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 h(key) = key % 10.


Chi tiết:
Ta có tập các khoá k: 10,21,70,52,22,63,33,44,91,15,26,25,47,48,39, …
5
0
M-1
Tập địa chỉ M=10 được đánh số từ 0 đến M-1 (Từ 0 đến 9), ta được 10
danh sách liên kết khác nhau.
Bảng băm đó "băm" các 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 bucket.
Hàm băm h(k)=k mod M. Ta chèn được các giá trị khoá k tương ứng với

từng danh sách liên kết.

ã Bucket 0 gồm những phần tử cú khúa tận cựng bằng 0.
. Bucket 1 gồm những phần tử cú khúa tận cựng bằng 1.
. Bucket 2 gồm những phần tử cú khúa tận cựng bằng 2.
6
0
1
2
3
4
5
6
7
8
9
2
5
3
4
6
1
3
4
1
4
6
2
5
6

1
2
4
2
4
7
1
3
4
2
3
5
2
3
5
6
8
6
8
6
9
6
9
7
9
7
8
1
M = 0
M = 9

nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
nil
ã Bucket i(i=0 | … | 9) gồm những phần tử cú khúa tận cựng bằng i.
+ Khi khởi động bảng băm, con trỏ đầu của cỏc bucket là NULL.
+ Theo cấu trỳc này, với tỏc vụ insert, hàm băm h(k) sẽ được dựng
để tớnh địa chỉ của khoỏ k, tức là xỏc định bucket chứa phần tử và đặt
phần tử cần chốn vào bucket này.
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 bucket tương ứng
+ i=h(k) => thuoc danh sach thu i (bucket[i])
+ Tìm kiếm khoá K trên danh sách bucket[i]
+ Khi kết thúc mỗi một danh sách (key cuối cùng của danh sách) con
trỏ chỉ đến giá trị Nil.
c. Cỏc phộp toỏn:
+ Tớnh giỏ trị hàm băm: Giả sử chỳng ta chọn hàm băm dạng %:
h(key)=key % M.
+ Phộp toỏn initbuckets: khởi tạo cỏc 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)
+ kiểm tra bucket [i]: nếu rỗng => cung cấp nhớ cho bucket, gán
khoá k
thêm phần tử có khoá k vào ds theo thứ tự tăng
dần.
+ Phộp toỏn remove: Xúa phần tử cú khúa k trong bảng băm.
+ Phộp toỏn clear: Xúa tất cả cỏc phần tử trong bảng băm.
+ Phộp toỏn traversebucket: Xử lý tất cả cỏc phần tử trong bucket b.
+ Phộp toỏn traverse: Xử lý tất cả cỏc phần tử trong bảng băm.
7
+ Phộp toỏn search: Tỡm kiếm một phần tử trong bảng băm, nếu khụng
tỡm thấy hàm này trả về hàm NULL, nếu tỡm thấy hàm này trả về địa chỉ
của phần tử cú khúa k.
B1: Tỡm danh sỏch liờn kết cú thể chứa khúa k
b = h(k);
p = bucket[b];
B2: Tỡm khúa k trong danh sỏch liờn kết p.
5. Cài đặt bảng băm với phương pháp kết nối
trực tiếp
a. Khai báo cấu trúc bảng băm.

//kich thuoc cua bang bam
#define M 10
// M so nut co tren bang bam, du de chua cac nut nhap
vao bang bam
//dinh nghia cau truc cua mot nut bang bam
struct nodes
{
int key; //thanh phan 1 de luu khoa
struct nodes *next; //thanh phan thu hai con tro luu dia

chi cua phan
//tu ke tiep (xung dot hay la co cung gia tri du)
};
//khai bao kieu con tro chi nut
typedef struct nodes *NODEPTR;
//khai bao mang bucket chua M con tro dau cua Mbucket
NODEPTR bucket[M];

b. Các tác vụ.
* Hàm băm.
8
Giả sử chỳng ta chọn hàm băm dạng modulo: f(key)=key % M
//dua vao khoa va ket qua ra so du
int hashfunc(int key)
{
return (key % M);
}
Chỳng ta cú thể dựng một hàm băm bất kỡ thay cho hàm
băm dạng % trờn.

* Phộp toỏn khởi tạo (initbuckets):
Phộp toỏn này cho khởi động buckets: Khi khởi động
bảng băm, con trỏ đầu của cỏc bucket là
NULL.
//phep toan khoi tao buckets
//gan cho cac pt cua mang gia tri con tro la
NULL
void initbuckets()
{
int i;

for(i=0;i<M;i++)
bucket[i]=NULL;
}
* Phộp toỏn kiểm tra rỗng (empty):
Kiểm tra bucket cú rỗng khụng.
//kiem tra bucket b co bi rong hay khong
int emptybucket(int b)
{
if (bucket[b]==NULL)
return TRUE;
else
return FALSE;
}
Kiểm tra bảng băm cú rỗng khụng.
//kiem tra bang bam co rong hay khong?
int empty()
9
{
int b;
for(b=0;b<M;b++)
if (bucket[b]!=NULL)
return FALSE;
}
* Phộp toỏn chốn phần tử mới vào bảng băm
(insert):
Thờm phần tử cú khúa k vào bảng băm.
//phep toan insert
//them vao mot key moi
void insert(int k)
{

int b;
b=hashfunc(k);// ham hashfunc de tim so du
place(b,k);//de tim vi tri chen
}
void place(int b,int k)
{
NODEPTR p,q;//q la nut truoc,p la nut sau
q=NULL;
for(p=bucket[b]
p!=NULL&&k>p->key;p=p->next)
q=p;
if(q==NULL)
push(b,k);
else
insafter(q,k);
}
//tac vu getnode
NODEPTR getnode()
{
NODEPTR p;
10
p=(NODEPTR)malloc(sizeof(struct nodes));
return p;
}
void push(int b,int x)
{
NODEPTR p;
p=getnode();
p->key=x;
p->next=bucket[b];

bucket[b]=p;
}
//Ham insafter them nut moi vao bucket sau nut p
void insafter(NODEPTR p,int k)
{
NODEPTR q;
if (p==NULL)
printf("Khong them nut moi duoc");
else
{
q=getnode();
q->key=k;
q->next=p->next;
p->next=q;
}
}
* Phộp toỏn tỡm kiếm (search):
Để tỡm một phần tử cú khúa k trong 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 cú thể chứa phần tử này. 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.
Nếu khụng tỡm thấy hàm này trả về hàm NULL, nếu tỡm
thấy hàm này trả về địa chỉ của phần tử cú khúa k.
int search(int k)
{
NODEPTR p;
11
int b;
b=hashfunc(k);

p=bucket[b];
while (k>p->key && p!=NULL)
p=p->next;
if (p==NULL| | k!=p->key)
return 0;
else
return 1;
}
• Phộp toỏn xoá một phần tử.
Để xoá một phần tử có giá trị khoá k, trước tiên hàm b
= h(k) và p = bucket[b] sẽ tìm danh sách liên
kết mà có thể chứa khoá k.
Nếu tìm thấy i = h(k) thuộc danh sách thứ i (bucket[i])
thì thực hiện việc tỡm khúa k trong danh sỏch liờn
kết i. Nếu tìm thấy khoá k thì thực hiện việc xoá
khoá k và cập nhật lại con trỏ. Nếu giá trị khoá k đó
là duy nhất trong danh sách, khi đó sẽ đồng thời với
việc giải phóng danh sách và tại bucket i đó sẽ nhận
giá trị Null.
//Ham xoa mot nut trong bang bam
void remove(int k)
{
int b;
NODEPTR p,q;
b=hashfunc(k);
p=bucket[b];
q=p;
while(p!=NULL && p->key!=k)
{
q=p;

p=p->next;
}
if (p==NULL)
printf("\nKhong co nut co khoa %d",k);
12
else
if(p==bucket[b])
pop(b);
else
delafter(q);
}
Phần 2
Đánh giá độ phức tạp của thuật toán
Ta có bảng băm T với m vị trí (m bucket) để lưu trữ n giá trị.
Ta có hệ số phép tính trung bình về sự phân bố các giá trị là: α = n/m.
* Thủ tục chính:
Chained-Hash-Insert (T, x)
Insert x đầu mỗi danh sách T[h(key[x])].
Thời gian xấu nhất để hoàn thành là – O(1).
Chained-Hash-Delete (T, x)
Xoá x khỏi danh sách T[h(key[x])].
Thời gian xấu nhất để hoàn thành, phụ thuộc vào độ dài của
mỗi danh sách.
Nếu là danh sách móc nối kép (đồng nghĩa với việc ta chọn m=n)
thì sẽ là _ O(1)
Chained-Hash-Search (T, k)
Tìm khoá k trong danh sách T[h(k)].
Khoảng thời gian xấu nhất để hoàn thành, phụ thuộc vào độ dài của mỗi
danh sách.
13

Nếu là danh sách móc nối kép (đồng nghĩa với việc ta chọn m=n)
thì sẽ là _ O(1)
* Cụ thể.
Nếu ta coi như trung bình các khoá được phân bố trải đều như nhau trên
danh sách thì ta có:
α = n/m.
m: số bucket (Số các danh sách từ 0 đến m-1)
n: Số giá trị của các khoá k được lưu trong danh
sach liên kết.
Trường hợp xấu nhất có thể sảy ra là:
O(n) + thời gian băm h(k).
Thời gian tìm kiếm còn phụ thuộc vào chiều dài của danh sách liên kết và
vị trí tương đối của các khoá trong danh sách. Do đó thời gian tìm kiếm
trung bình, để tìm thấy hoặc không thấy một khoá k nào đó sẽ mất
khoảng thời gian.
O(1 + α)
+ Ta đặt x
i
là phần tử thứ i, (
i
th
) được chèn vào bảng băm và
đặt:
k
i
= key[x
i
].
+ Định nghĩa chỉ ra rằng: Nếu các giá trị khoá k có h(k) bằng
nhau (có cùng một địa chỉ băm thứ i) tùi cùng

được lưu vào một danh sách liên kết.
X
ij
= i{h(k
i
) = h(k
j
)}, với mọi i, j.
X
ij:
Chỉ ra vị trí của các khoá k tại địa chỉ thứ i
trong cùng một danh sách liên kết thứ j,
(trong cùng bucket j, với j = 0, 1, 2, m-1)
+ Để đơn giản không giảm tính tổng quát với trường hợp này
ta có:
14
Pr{h(k
i
) = h(k
j
)} = 1/m

E[X
ij
] = 1/m
Vậy tổng thời gian tìm kiếm mất:


15
n

m
n
nn
n
nm
in
nm
in
nm
mn
XE
n
X
n
E
n
i
n
i
n
i
n
i
n
ij
n
i
n
ij
ij

n
i
n
ij
ij
22
1
2
1
1
2
)1(1
1
1
1
)(
1
1
1
1
1
][1
1
1
1
2
1 1
1
1 1
1 1

1 1
αα
−+=

+=






+
−+=






−+=
−+=








+=









+=














+
∑ ∑

∑ ∑
∑ ∑
∑ ∑
= =

=
= +=
= +=
= +=
§é dµi tèi ®a cã thÓ.
C¸c gi¸ trÞ ®îc chÌn vµo sau xi
trong cïng m«t danh s¸ch cña xi.
Tổng thời gian tìm kiếm = Thời gian thực hiện phép băm +
Thời gian tìm kiếm.
= O(2+α/2 –α/2n) = O(1+α).
Nếu: n = O(m), thì α=n/m = O(m)/m = O(1).
(Thời gian tìm kiếm trung bình khi n = m)
Insertion: O(1) trường hợp tồi nhất.
Deletion: O(1) trường hợp tồi nhất khi n = m.
Phần 3
Nhận xét và so sánh
1. Nhận xét.
+ Bảng băm dựng phương phỏp kết nối trực tiếp đượ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).
+ Bảng băm dựng phương phỏp kết nối trực tiếp sẽ "băm”
n phần tử vào danh sỏch liờn kết (M bucket). Cỏc phần tử bị xung đột tại
địa chỉ i được kết nối trực tiếp với nhau qua danh sỏch liờn kết i.
+ Muốn đạt tốc độ thực hiện cỏc phộp toỏn trờn bảng hiệu
quả tốt thỡ cần chọn hàm băm sao cho băm đều n phần tử của bảng băm
cho M bucket, lỳc này trung bỡnh mỗi bucket sẽ cú n/M phần tử. Chẳng
hạn, phộp toỏn search sẽ thực hiện việc tỡm kiếm tuần tự trờn bucket nờn
thời gian tỡm kiếm lỳc này cú bậc 0(n/M) do đó, nhanh gấp M lần so với
việc tỡm kiếm trờn một danh sỏch liờn kết thông thường có n phần tử.
16















+
∑ ∑
= +=
n
i
n
ij
ij
X
n
E
1 1
1
1
+ Ta chọn M sao cho tương đối nhỏ vì không phải sử dụng
một vùng nhớ liên tục, nhưng giá trị của M cũng phải đủ lớn để tránh sự

đụng độ và tránh được việc tìm kiếm trên danh sách liên kết. Ta thường
chọn giá trị của M khoảng bằng 1/10 các khoá cần lưu trữ trong bảng
băm. Ta phải nên nhớ rằng M là một số nguyên tố trong trường hợp hàm
băm là hàm Mod (lấy số dư)
+ Khi chọn M càng lớn thỡ tốc độ thực hiện cỏc phộp
toỏn trờn bảng băm càng nhanh, tuy nhiờn lại càng dựng nhiều bộ nhớ.
+ Nếu chọn M=n thỡ năng xuất tương đương với truy xuất
trờn mảng (cú bậc O(1)), tuy nhiờn tốn nhiều bộ nhớ.
+ Bảng băm dựng phương phỏp kết nối trực tiếp thường
được áp dụng để giả các bài toán có cấu trúc dữ liệu lớn. Vì nó có thể
được lưu trữ cả ở bộ nhớ trong và bộ nhớ ngoài.
+ Trường hợp xấu nhất là băm khụng đều vỡ hỡnh thành
một danh sỏch cú n phần tử nờn tốc độ truy xuất lỳc này cú bậc 0(n) và
đối với phép toán tìm kiếm trong trường hợp xấu nhất có bậc O(1 + n).
2 . So sánh.
* Ưu điểm.
+ Bảng băm dựng phương phỏp kết nối trực tiếp
không sảy ra hiện tượng tràn vì các khoá bị đụng
độ được lưu vào cùng một danh sách.
+ Khi chọn M sao cho các khoá được băm đều thì
thời gian truy xuất rất nhanh.
+ Có thể được áp dụng để giả các bài toán có cấu
trúc dữ liệu lớn.
+ Xử lý được cỏc loại khúa cú kiểu dữ liệu khỏc
nhau.
+ Đơn giản, dễ hiểu, dễ xử lý.
* Nhược điểm.
17
+ Không gian bộ nhớ tốn.
+ Khi các khoá không được băm đều thì thời gian

truy xuất rất chậm.
Tài liệu tham khảo
1. Nguyễn Kim Anh. Nguyên lý của các hệ cơ sở dữ liệu, NXB éại
học Quốc gia HN, 2004.
2. Đào Thanh Tĩnh. Cấu trúc dữ liệu và giải thuật_Tài liệu ôn thi
cao học nghành Công nghệ thông tin, Học viện kỹ thuật quân sự,
2005.
3. éỗ Xuõn Lụi, Cấu trúc dữ liệu và giải thuật, NXB éại học Quốc
gia HN, 2005.
4. Nguyễn Trung Trực. Cấu trúc dữ liệu, Trường éại học bỏch khoa
TP. HCM, 1994.
5. Daniel F. Stubbs & Neil W. Webre. Data Structures with
Abstract Data types and Ada. PWS Publishing Company,
1993: 375-382.
A conceptual definition of Perfect Hashing Function
6. Edward M. Reingold & Wilfred J. Hansen. Data structures.
Little, Brown Computer series, 1983.
18
Comparisons of hashing by chaining with other
algorithms
7. Mitchell, L. Model. Data Abstraction, and Data Structures.
Prentice-Hall, Inc, 1994: 383-390.
An overview of chaining and Buckets
8. Adam Drozdek & Donald L. Simon. Data structure in C.
PWS Publishing Co.,1995: 376-399
An example of hashing application written in C
9. J. Pierprzyk Babak Sadeghiyan. Design of Hashing Algorithms.
Lecture Notes in Computer Science, G. Goos & J.
Hartmanis, Springer-Verlag, 1995.
An overview of hash functions.


Mục lục.

Phần 1: Cấu trúc của bản băm ………… ….1
1. Cấu trúc dữ liệu bảng băm ……………… ……1
2. Phép băm ……………………………… … 2
3. Một số hàm băm phổ biến………………… … 2
4. Bảng băm với phương pháp kết nối trực tiếp … 3
a. ý tưởng: …………………………………,,,… 3
b. Mô tả: ………………………………… …… 4
c. Cỏc phộp toỏn: ………………………… … …7
19
5. Cài đặt bảng băm với p_pháp kết nối
trực tiếp …8
a. Khai báo cấu trúc bảng băm………………… 8
b. Các tác vụ…………………………… …… …. 8
Phần 2: Đánh giá độ phức tạp của thuật toán 13
Phần 3: Nhận xét và so sánh…………… … 16
1. Nhận xét………………………………… …… 16
2. so sánh…………………………………….…… 17





20

×