Tải bản đầy đủ (.pdf) (65 trang)

Giáo trình cấu trúc dữ liệu nâng cao phần 2

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 (347.1 KB, 65 trang )

13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
1
Chương 2-Bảng băm
Nội dung
Khái Niệm về bảng băm
Hàm băm.
Các phương pháp giải quyết đụng độ
1. Phương pháp kết nối trực tiếp
2. Phương pháp kết nối hợp nhất
3. Phương pháp dò tuyến tính
4. Phương pháp dò bậc 2
5. Phương pháp băm kép
Phân tích Phép băm
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
2
Khái niệmBảng băm
Phép Băm (Hashing): Là quá trình ánh xạ mộtgiá
trị khóa vào mộtvị trí trong bảng.
Mộthàmbămánhxạ các giá trị khóa đếncácvị trí
ký hiệu: h
Bảng băm (Hash Table) là mảng lưutrữ các record,
ký hiệu: HT
HT có M vị trí được đánh chỉ mụctừ 0 đếnM, M là
kích thướccủabảng băm.
Bảng bămthíchhợpchocácứng dụng đượccài
đặttrênđĩavàbộ nhớ, là mộtcấu trúc dung hòa
giữathờigiantruyxuấtvàkhônggianlưutrữ.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2


3
HÀM BĂM (Hash functions)
h
K
h(K)
Hàm bămbiến đổimộtkhóavàomộtbảng các địachỉ.
Khóa có thể là dạng số hay số dạng chuỗi.
Địachỉ tính ra đượclàsố nguyên trong khoảng 0 đếnM-1
vớiM làsốđịachỉ có trên bảng băm
K1, K2,k3
H(k3)
h(k1)
h(k2)
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
4
Hàm băm(Hash Functions)
Hàm bămtốtthỏamãncácđiềukiệnsau:
Tính toán nhanh.
Các khoá đượcphânbốđềutrongbảng.
Ít xảyrađụng độ.
good hash functions are very rare –
birthday
paradox
Giảiquyếtvấn đề bămvới các khoá không phảilà
số nguyên:
Tìm cách biến đổ khoá thành số nguyên
Trong ví dụ trên, loạibỏ dấu ‘-’ 9635-8904 đưavề số
nguyên 96358904
Đốivớichuỗi, sử dụng giá trị các ký tự trong bảng

mã ASCCI
Sau đósử dụng các hàm bămchuẩntrênsố nguyên.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
5
HF: Phương pháp chia
Dùng số dư:
h
(
k
) =
k
mod
m
k
là khoá,
m
là kích thướccủabảng.
vấn đề chọngiátrị
m
m
= 2
n
(không tốt)
nếuchọn m= 2
n
thông thường không tốt
h(k) = k mod 2
n
sẽ chọn cùng n bits cuốicủak

m
là nguyên tố (tốt)
Gia tăng sự phân bốđều
Thông thường m đượcchọnlàsố nguyên tố gầnvới2
n
Chẳng hạnbảng ~4000 mục, chọn
m
= 4093
0110010111000011010
k mod 2
8
chọncácbits
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
6
HF: Phương pháp nhân
Sử dụng
h
(
k
) = ⎣
m
(
kA
mod 1) ⎦
k là khóa, m là kích thướcbảng,
A
là hằng số: 0
<
A <

1
Chọnm vàA
M thường chọn
m =
2
p
Sự tối ưutrongviệcchọnA phụ thuộcvàođặc
trưng củadữ liệu.
Theo Knuth chọn
A = ½(√5 -1) ≈ 0.618033987
đượcxemlàtốt.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
7
Phép bămphổ quát
Việcchọnhàmbămkhôngtốtcóthể dẫn đếnxác
suất đụng độ lớn.
Giảipháp:
Lựachọnhàmbămh ngẫunhiên.
Chọnhàmbăm độclậpvớikhóa.
KhởitạomộttậpcáchàmbămH phổ quát và từ
đóh đượcchọnngẫunhiên.
MộttậpcáchàmbămH làphổ quát (
universal
) nếu
vớimọi ∀ f, k ∈H và 2 khoá k, l ta có xác suất: Pr{
f(k)
=
f(l)
} ≤ 1/

m
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
8
Sựđụng độ là hiệntượng các khóa khác nhau
nhưng băm cùng địachỉ như nhau.
Khi key1<>key2 mà f(key1)=f(key2) chúng ta nói
nút có khóa key1 đụng độ với nút có khóa key2.
Thựctế ngườitagiảiquyếtsựđụng độ theo hai
phương pháp: phương pháp nốikếtvàphương
pháp bămlại.
Sựđụng độ (collision)
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
9
Phương pháp nốikếttrựctiếp
I. Phương pháp nốikếttrựctiếp:
Các nút bị bămcùngđịachỉ (các nút bị xung đột) được
gom thành mộtdanhsáchliênkết.
các nút trên bảng băm được
băm
thành các danh sách
liên kết. Các nút bị xung độttại địachỉ i đượcnối
kếttrựctiếpvới nhau qua danh sach liên kếti.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
10
#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
*/
typedef PHNODE HASHTABLE[M];
Phương pháp nốikếttrựctiếp
(tt)
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
11
Hàm băm
Giả sử chúng ta chọnhàm bămdạng %: f(key)=key % M.
int HF (int key)
{
return (key % M);
}
Phép toán khởitạobảng băm:
Khởi động các HASHTABLE.
void InitHASHTABLE( )
{
for (int i=0;<M;i++);
HASHTABLE[i]=NULL;
}
Phương pháp nốikếttrựctiếp
13-Dec-05

Trương Hải Bằng-Câu trúc dữ liệu 2
12
Phép toán kiểmtrabảng bămrỗng HASHTABLE[i]:
int emptyHASHTABLE (int i)
{
return(HASHTABLE[i] ==NULL ?1 :0);
}
Phép toán toàn bộ bảng bămrỗng:
int empty( )
for (int i = 0;i<M;i++)
if(HASHTABLE[i] !=NULL)
return 0;
return 1
}
Phương pháp nốikếttrựctiếp
(tt)
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
13
Phương pháp nốikếttrựctiếp
(tt)
Phép toán thêm vào:
Thêm phầntử có khóa k vào bảng băm.
Giả sử các phầntử trên các HASHTABLE là có thứ tựđể
thêm mộtph
ầntử khóa k vào bảng bămtrước tiên chúng ta
xác định HASHTABLE phù hợp, sau đó dùng phép toán place
củadanhsáchliênkết để đặtphầntử vào vi trí phù hợ
p
trên HASHTABLE.

void insert(int k)
{
int i= HF(k)
InsertList(HASHTABLE[i],k); //phép toán thêm khoá k
vào danh sach lien ket HASHTABLE[i]
}
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
14
Phương pháp nốikếttrựctiếp
(tt)
Phép toán loạibỏ:
Xóa phầntử có khóa k trong bảng băm.
void remove ( int k)
{
int b;
PHNODE q, p;
b = HF(k);
p = hashHASHTABLE(b);
q=p;
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
15
Phương pháp nốikếttrựctiếp
(tt)
while(p !=NULL && p->key !=k)
{
q=p;
p=p->next;
}

if (p == NULL) printf(“\n khong co nut co khoa %d” ,k);
else if (p == HASHTABLE [b])
pop(b);
//Tac vu pop cua danh sach lien ket
else
delafter(q);
/*tac vu delafter cua danh sach lien ket*/
}
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
16
Phương pháp nốikếttrựctiếp
(tt)
Phép toán tìm kiếm:
PHNODE p;
int b;
b = HF (k);
p = HASHTABLE[b];
while(k > p->key && p !=NULL)
p=p->next;
if (p == NULL | | k !=p->key) // khong tim thay
return(NULL);
else //tim thay
return(p);
}
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
17
Phương pháp nốikếttrựctiếp
(tt)

Phép toán duyệt HASHTABLE[i]:
Duyệtcácphầntử trong HASHTABLE b.
void traverseHASHTABLE (int b)
{
PHNODE p;
p= HASHTABLE[b];
while (p !=NULL)
{
printf(“%3d”, p->key);
p= p->next;
}
}
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
18
Phương pháp nốikếttrựctiếp
(tt)
Phép toán duyệttoànbộ bảng băm:
Duyệttoànbộ bảng băm.
void traverse( )
{
int b;
for (b = 0;n<M; b++)
{
printf(“\nButket %d:”,b);
traverseHASHTABLE(b);
}
}
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2

19
Phương pháp nốikếttrựctiếp
(tt)
Nhậnxét:
Bảng băm dùng phương pháp nốikếttrựctiếpsẽ ”băm” n
nút vào M danh sách liên kết (M bucket).
Tốc độ Truy xuấtphụ thuộc vào việclựachọnhàmbăm
sao cho băm đều n nút củabảng băm cho M bucket.
NếuchọnM cànglớnthìtốc độ thựchiện các phép toán
trên bảng băm càng nhanh tuy nhiên không hiệuquả về
bộ nhớ. Chúng ta có thểđiềuchỉnh M để dung hòa giữatốc
độ truy xuất và dung lượng bộ nhớ;
NếuchọnM=n thờigiantruyxuấttương đương vớitruyxất
trên mảng(có bậc O(1)), song tốnbộ nhớ.
Nếuchọn M =n /k(k =2,3,4,…) thì ít tốnbộ nhớ hơnk lần,
nhưng tốc độ chậm đik lần.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
20
Phương pháp nốikếthợpnhất (1)
Bảng bămtrongtrường hợpnàyđựợccàiđặt
bằ
ng danh sách liên kếtdùngmảng, có M nút.
Các nút bị xung đột địachỉđượcnốikếtnhau
qua một danh sách liên kết.
Mỗinútcủabảng bămlàmộtmẫutin có2
trường:
Trường key: chứacáckhóanode
Trường next: con trỏ chỉ node kế tiếpnếu
có xung đột.

Khi khởi động bảng bămthìtấtcả trường key
được gán NULIKEY, tấtcả trường next được
gán –1.
Key next
NULL -1
……
NULL -1
II. Bảng bămvớiphương pháp nốikếthợpnhất
(
coalesced Chaining Method
):
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
21
phương pháp nốikếthợpnhất(2)
Khi thêm một nút có khóa key vào bảng băm,hàm
băm f(key) sẽ xác định địachỉ i trong khoảng từ 0
đếnM-1.
Nếuchưabị xung đột thì thêm nút mớivàođịachỉ
này .
Nếubị xung đột thì nút mớibị cấpphátlànúttrống
phía cuốimảng. Cậpnhậtliênkếtnext saochocác
nút bị xung độthìnhthành một danh sách liên kết.
Khi tìm một nút có khóa key trong bảng băm,hàm
băm f(key) sẽ xác định địachỉ i trong khoảng từ 0
đến M-1, tìm nút khóa key trong danh sách liên kết
xuấtpháttừđịachỉ i.
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
22

Phương pháp nốikếthợpnhất(3)
0 10 1
1 20 -1
2 42 8

.
null -1
8 62 -1
9 109 -1
Minh họachobảng bămcótập
khóa là tậpsố tự nhiên, tập địa
chỉ có 10 địachỉ (M=10) (từđịa
chỉ 0 đến9), chọnhàmbăm
f(key)=key % 10.
Key=10, 42, 20, 109, 62
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
23
Phương pháp nốikếthợpnhất()
a. Khai báo cấutrúcbảng băm:
//Khai bao cau truc mot nut cua bang bam
typedef struct
{
int key; //khoa cua nut tren bang bam
int next;
//con tro chi nut ke tiep khi co xung dot
}NODE;
//Khai bao bang bam
typedef NODE HASHTABLE[M];
int avail;

13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
24
Phương pháp nốikếthợpnhất(5)
Hàm băm:
int HF(int key)
{
return(key % 10);
}
Phép toán khởitạo (Initialize):
void initialize()
{
int i;
for(i = 0;i<M;i++)
{
HASHTABLE[i].key = NULLKEY;
HASHTABLE[i].key = -1;
}
il M
1/* tM
1l t
i
b
h
bi
13-Dec-05
Trương Hải Bằng-Câu trúc dữ liệu 2
25
Phương pháp nốikếthợpnhất(6)
Phép toán tìm kiếm (search):

intsearch(intk)
{
int i;
i=HF(k);
while(k !=HASHTABLE[i].key && i !=-1)
i=HASHTABLE[i].next;
if(k== HASHTABLE[i]key)
return(i); //tim thay
return(M); //khong tim thay
}

×