Вы находитесь на странице: 1из 31

Cấu trúc dữ liệu và giải thuật

Chương VII : Tìm kiếm

Tìm kiếm

z Nội dung
– Tìm kiếm tuần tự và tìm kiếm nhị phân
– Tìm kiếm trên cây nhị phân
z Cây nhị phân tìm kiếm
z Cây AVL

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 1


Cấu trúc dữ liệu và giải thuật

Tìm kiếm

– Tìm kiếm là thuật toán tìm 1 phần tử có giá trị cho


trước trong một tập các phần tử
– Khóa tìm kiếm: Một bộ phận của các phần tử
trong tập mà giá trị của nó được sử dụng để so
sánh và tìm kiếm

Tìm kiếm tuần tự


– Tìm kiếm tuần tự
z Các phần tử trong tập đầu vào không được sắp xếp
theo khóa tìm kiếm
z Mô tả
– Duyệt mảng (danh sách, hàng đợi , v…v ) chứa các phần
tử trong tập
– So sánh với khóa cần tìm tới khi tìm thấy khóa hoặc duyệt
qua hết mảng mà chưa tìm thấy

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 2


Cấu trúc dữ liệu và giải thuật

Tìm kiếm tuần tự

Function SEQUENTIAL(A, n, key) ≠

{tìm phần tử có khóa key trong mảng A gồm n phần tử. Kết quả
trả ra: -1 nếu không tìm thấy phần tử có khóa key, chỉ số của
phần tử nếu tìm thấy}

1. i:= 1;
2. while (i <= n ) and (A[i] <> key) do
i:= i + 1;
3. if (i> n) then return -1 { không thấy};
4. else
return i{tìm thấy tại vị trí i}

Tìm kiếm tuần tự


– Độ phức tạp :
z Trường hợp tốt nhất: O(1)
z Trường hợp tồi nhất: O(n)
z Trường hợp trung bình : O(n)

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 3


Cấu trúc dữ liệu và giải thuật

Tìm kiếm nhị phân


z Tìm kiếm nhị phân
– Sử dụng cho việc tìm kiếm trên mảng đã được sắp xếp
– Mô tả
z Chọn phần tử “ở giữa” dãy – A[k] để thực hiện so
sánh với giá trị cần tìm
z Nếu key = A[k] thì tìm thấy , kết thúc

z Nếu key < A[k] thì tìm trên nửa đầu của mảng đã cho

z Nếu key > A[k] thì tìm trên nửa sau của mảng đã cho

Tìm kiếm nhị phân

Algorithm BINARY-SEARCH(A,l, r, key)


1. If (l> r) return -1;
2. m = (l+r) /2 ;
3. If (A[m] = key ) return m ;
4. Else if (A[m] > key) return BINARY-SEARCH(A, l, m-1, key);
5. Else return BINARY-SEARCH(A, m+1, r, key);

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 4


Cấu trúc dữ liệu và giải thuật

Tìm kiếm nhị phân

Algorithm BINARY-SEARCH(A,n,key)
1. l:=1 ; r := n ; { l, r lần lượt là biến chỉ số sử dụng để ghi nhận chỉ số của phần tử
đầu và phần tử cuối của mảng mà chúng ta đang tìm kiếm trên đó}
2. while l <= r do begin
{Tìm chỉ số của phần tử giữa} m:= (l+r) / 2;
if key < A[m] then r:= m-1;
else
if key > A[m] then l:= m+1
else return m;
end;
3. { Không tìm thấy } return -1;

Tìm kiếm nhị phân


– Ví dụ: Cho vector bao gồm 10 phần tử
A = { 11, 18, 30, 33, 40, 44, 54, 60, 72,87}. Sử dụng phương
pháp tìm kiếm nhị phân tìm giá trị 45, 72
1 2 3 4 5 6 7 8 9 10 l r

11 18 30 33 40 44 54 60 72 87 1 10

44 54 60 72 87 6 10

44 54 6 7

54 7 7

7 6

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 5


Cấu trúc dữ liệu và giải thuật

Tìm kiếm nhị phân

– Độ phức tạp của thuật toán


z Trường hợp xấu nhất và trung bình : O(log2n)

Cây nhị phân tìm kiếm

z Cây tìm kiếm nhị phân ứng với 1 dãy gồm n khóa a1, a2, …,
an là một cây nhị phân thỏa mãn tính chất sau
– Mọi giá trị thuộc cây con trái của một nút đều nhỏ hơn giá trị tại
nút đó
– Mọi giá trị thuộc cây con phải của một nút đều lớn hơn giá trị
tại nút đó
– Mỗi cây con của một nút cũng đều là cây nhị phân tìm kiếm
z Với một dãy khóa có thể xác định được nhiều cây nhị phân
tìm kiếm

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 6


Cấu trúc dữ liệu và giải thuật

Cây nhị phân tìm kiếm

33 64

29 64 30 70

19 30 40 70 80
23 33 65

23 65 80 19 29 40

Cây nhị phân tìm kiếm


– Các thao tác trên cây nhị phân tìm kiếm
z Duyệt cây nhị phân tìm kiếm
z Tìm kiếm nút có giá trị x
z Thêm một nút mới có giá trị x
z Xóa một nút có giá trị x

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 7


Cấu trúc dữ liệu và giải thuật

Tìm kiếm trên cây nhị phân tìm kiếm

– Cách thực hiện


z Nếu cây rỗng: không tìm thấy
z Nếu cây không rỗng:
– So sánh giá trị cần tìm kiếm
với các giá trị khóa tìm kiếm ở
nút gốc
z Nếu = Æ Tìm thấy
< 6
z Nếu < Æ Đi xuống tìm
2 9
kiếm trong cây con trái >
z Nếu > Æ Đi xuống tìm 1 4 = 8
kiếm trong cây con phải

Tìm kiếm trên cây nhị phân tìm kiếm

z Giải thuật đệ qui

Algorithm BST-Recursive(T, key)


{T là con trỏ trỏ tới gốc của cây; key là giá trị cần tìm, trả ra con trỏ trỏ tới nút
chứa giá trị cần tìm }
1. If ( T = NULL) then return NULL;
2. If ( key < INFO(T) ) return BST-Recursive(LPTR(T), key);
3. Else if (key > INFO(T)) return BST-Recursive(RPTR(T), key);
4. Else return T;

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 8


Cấu trúc dữ liệu và giải thuật

Tìm kiếm trên cây nhị phân tìm kiếm

Giải thuật không đệ qui

Algorithm BST(T, key)


{T là con trỏ trỏ tới gốc của cây; X là giá trị cần tìm hoặc bổ sung; q là con trỏ
chứa địa chỉ của nút mới bổ sung (nếu có) }
1. q:= T ; {Khởi tạo biến con trỏ để duyệt cây}
2. while q < > NULL do
case
key < INFO(q): q:= LPTR(q);
key > INFO(q): q:= RPTR(q);
key = INFO(q): write(‘Tìm thấy X trên cây’); return q;
end case;
3. Return Null;

Bổ sung trên cây nhị phân tìm kiếm

– Cách thực hiện thêm một nút có giá trị x vào cây
nhị phân tìm kiếm
z Tìm nút có giá trị x
z Nếu tìm thấy, không cần thêm
z Nếu không tìm thấy
– Giả sử gọi w là nút lá mà ta chạm đến trong quá trình tìm
kiếm
– Tạo một nút mới có giá trị x và biến nút này thành nút con
của w (con trái hay con phải phụ thuộc vào việc so sánh x
với giá trị lưu trong w)

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 9


Cấu trúc dữ liệu và giải thuật

Bổ sung trên cây nhị phân tìm kiếm

Bổ sung nút có giá trị 5

< 6 6

2 9 2 9
>
w
1 4 8 1 4 8

Bổ sung trên cây nhị phân tìm kiếm

Algorithm Insert_BST(T, x)
{Bổ sung nút mới có giá trị x vào cây, trả ra con trỏ trỏ tới nút mới, hoặc trả ra con
trỏ trỏ tới một nút trong cây nếu trong cây đã có nút chứa khóa x }
1. If (T = null) then begin
1. Call New (p) ; {Xin bộ nhớ cho nút mới}
2. INFO(p) := x; LPTR(p): = RPTR(p) := NULL;
3. T = p ; return T;
2. If ( key < INFO(T) ) then begin
1. LPRT(T) := Insert_BST(LPTR(T), x) ; return LPTR(T); end;
3. Else if ( key > INFO(T) ) then begin
1. RPTR(T) := Insert_BST(RPTR(T), x) ; return RPTR(T); end;
4. Else return T;

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 10


Cấu trúc dữ liệu và giải thuật

Dựng cây nhị phân tìm kiếm

– Ví dụ: Dựng cây nhị phân tìm kiếm sử dụng phép bổ sung
cho ở trên với dãy số {8,3,14,6, 12, 28, 10,21,5}

3 14

6 12 28

5 10 21

Xóa nút trên cây nhị phân tìm kiếm

z Xóa một nút trên cây nhị phân tìm kiếm cần đảm bảo
cây vẫn là cây nhị phân tìm kiếm
z Xóa nút trên cây tìm kiếm nhị phân:
– Nút loại bỏ là nút lá: Xóa ngay lập tức
– Nút loại bỏ là nút nhánh và chỉ có một cây con (trái hoặc
phải) : Thay nút cần xóa bằng nút con
– Nút loại bỏ là nút nhánh và có 2 cây con: Thay nút cần
xóa bằng nút cực phải của cây con trái hoặc nút cực trái
của cây con phải

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 11


Cấu trúc dữ liệu và giải thuật

Xóa nút trên cây nhị phân tìm kiếm

23 23

18 44 ? 44

12 20 35 52 12 20 35 52

19 22 19 22

Xóa nút trên cây nhị phân tìm kiếm

23 23

18 44 12 44

12 20 35 52 12 20 35 52

19 22 19 22

Sử dụng nút thay thế là nút cực phải của cây con trái

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 12


Cấu trúc dữ liệu và giải thuật

Xóa nút trên cây nhị phân tìm kiếm

23 23

18 44 19 44

12 20 35 52 12 20 35 52

19 22 19 22

Sử dụng nút cực trái của cây con phải

Cây nhị phân tìm kiếm

Algorithm BSTDEL(key, nut_xoa, nut_cha)


{Thực hiện việc xóa nút trỏ bởi con trỏ nut_xoa , biết con trỏ nut_cha trỏ tới nút cha
của nút xóa, biết giá trị key của nút cần xóa}
1. If (LPTR(nut_xoa) = null && RPTR(nut_xoa) = null) then begin
if ( key < INFO(nut_cha)) then LPTR(nut_cha): = null;
else RPTR(nut_cha) := null; call dispose(nut_xoa) ; end;
2. If (LPTR(nut_xoa) = null || RPTR(nut_xoa) = null) then begin
if LPTR(nut_xoa) = NULL then nut_thay := RPTR(P);
else if RPTR(nut_xoa) = NULL then nut_thay := LPTR(P);
if (key < INFO(nut_cha)) then LPTR(nut_cha) := nut_thay;
else RPTR(nut_cha) := nut_thay;
call dispose(nut_xoa); end;

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 13


Cấu trúc dữ liệu và giải thuật

Cây nhị phân tìm kiếm

3. If (LPTR(nut_xoa) != null && RPTR(nut_xoa) != null) then begin


nut_thay := LPTR(nut_xoa); {sang cây con trái}
while RPTR(nut_thay) <> null do begin
T := nut_thay; nut_thay := RPTR(nut_thay);
end;{Kết thúc vòng lặp nut_thay trỏ đến nút cực phải của cây con trái, T:nút cha
của nút thay}
RPTR(nut_thay) := RPTR(nut_xoa); RPTR(T) := LPTR(nut_thay);
LPTR(nut_thay) := LPTR(nut_xoa);
if (key < INFO(nut_cha)) then LPTR(nut_cha) := nut_thay;
else RPTR(nut_cha) := nut_thay;
call dispose(nut_xoa);
End.

Cây nhị phân tìm kiếm

– Đánh giá giải thuật : tìm kiếm và loại bỏ


z Thời gian thực hiện trung bình Ttb(n) = O(log2n)

– Nhược điểm của cây tìm kiếm nhị phân:


z Cây suy biến có thể được hình thành trong quá
trình bổ sung, ảnh hưởng đến hiệu năng của
việc sử dụng cây nhị phân trong tìm kiếm

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 14


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

z Cây nhị phân cân đối AVL (AVL balanced binary search
tree)
– Định nghĩa: Một cây nhị phân tìm kiếm được gọi là cây cân
đối AVL nếu với mọi nút trên cây, chiều cao của 2 cây con
tương ứng chỉ chênh nhau nhiều nhất là 1 đơn vị

33
33

29 64 29 64

19 30 40 70 19 30 70

23 65 80 23 65 80

Cây nhị phân tìm kiếm cân đối AVL Cây nhị phân tìm kiếm không cân đối

Cây nhị phân cân đối AVL

– Bổ sung trên cây AVL


z Sử dụng giải thuật tìm kiếm trên cây nhị phân để tìm
xem nút cần bổ sung đã có trên cây chưa. Nếu chưa
có thì xác định vị trí sẽ bổ sung nút đó
z Các nút trên đường đi tìm kiếm “vị trí” này cần phải
được lưu trữ vì đó là những nút duy nhất có khả năng
bị tác động bởi phép bổ sung
z Nếu sau khi bổ sung, không có nút nào trên đường đi
trở nên vi phạm điều kiện cân bằng của cây, chỉ cần
thay đổi hệ số cân bằng tại một số nút cần thiết
z Nếu ngược lại, xác định nút vi phạm gần nhất, cân
bằng lại cây có gốc là nút đó. Việc cân bằng lại một
cây được thực hiện bằng các phép quay

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 15


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

– Các tình huống có thể xảy ra:


1. Hai cây con có một cây thấp hơn 1 đơn vị , bổ sung nút
mới vào làm 2 cây con có chiều cao cân bằng
2. Hai cây con đang có chiều cao bằng nhau, bổ sung nút
mới vào làm 1 cây cao hơn 1 đơn vị
3. Một trong hai cây con đang cao hơn 1 đơn vị và nút mới
được bổ sung vào đúng cây con đó , ta sẽ phải thực
hiện phép quay
1. Quay đơn: chỉ quay đúng 1 lần để tái cân bằng lại
cây
2. Quay kép: thực hiện 2 lần quay đơn mới tái cân
bằng lại cây

Cây nhị phân cân đối AVL

– Luật xác định các phép quay cần sử dụng


– Bước 1: Xác định nút vi phạm gần nhất
– Bước 2: Quan sát vị trí của nút con và nút cháu của nút vi
phạm trên đường đi xác định vị trí bổ sung
z Trường hợp 1: Quay đơn phải

Nút vi phạm
(nút bất thường)

Nút con

Nút cháu

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 16


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

z Trường hợp 2: Quay đơn trái (single left rotation)

z Trường hợp 3: Quay kép phải (double right rotation) :


quay trái với cây con trái rồi quay phải với cây có nút
vi phạm và con trái của nó

Cây nhị phân cân đối AVL

z Trường hợp 4: Quay kép trái (double left rotation) :


quay phải với cây con phải, rồi quay trái với cây có
nút vi phạm và con phải của nó

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 17


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

– Trường hợp 1: Phép quay đơn phải


Sau khi quay đơn phải
Nút vi B
phạm
Trước khi quay A

A
B C h+1 C
T1
h
T2
h-1 h-1 or h-2 h-1 h-1 or h-2
h
h+1 T3 T4 T3 T4
T1 T2

AVL trở lại


trạng thái
cân bằng

Cây nhị phân cân đối AVL

– Trường hợp 3: Phép quay kép phải

Trước khi quay


Nút vi Sau khi quay kép
phạm
phải
D
A
B C
B A
D
C
h h-1 h-1 or h-2
T1 T3 T4 h
T1 T′2 h T"2
T′2 h T"2 h-1 or h-2
h-1
T3 T4

AVL trở lại


trạng thái
cân bằng

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 18


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

– Bổ sung trên cây AVL – Ví dụ: Bổ sung 30 vào cây s


8
Nút
vi phạm
3 14

Không vi
1 6 10 19 phạm

Không vi
4 17 24 phạm

30 Không vi
phạm

Cây nhị phân cân đối AVL

– Để sửa đổi lại cây, quay cây có gốc tại 14: Quay từ phải
sang trái với cây con phải (nút 14 và 19) – Phép quay này
gọi là phép quay đơn trái

3 19

1 6 14 24

4 10 17 30

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 19


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

3 14

1 6 10 17

4 19

24
18
sau khi quay phải với cây con phải

Cây nhị phân cân đối AVL

– Bổ sung trên cây AVL – Ví dụ


8

Nút vi
3 14 phạm

1 6 10 19
Không vi
phạm
4 17 24

18

Bổ sung 18 vào cây Không vi Không vi


phạm phạm

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 20


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

z Quay trái với cây với nút 14 và 17

3 17

1 6 14 19

4 10 18 24

Cây nhị phân cân đối AVL

– Ví dụ : Bổ sung lần lượt các giá trị sau vào một cây AVL,
bắt đầu từ một cây rỗng: 7, 10, 11, 14, 12, 3, 1.

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 21


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

– Loại bỏ trên cây AVL cũng có thể dẫn đến tình trạng mất
cân đối của cây, tương tự như trong phép bổ sung, ta
cũng sẽ thực hiện phép quay để tái cân bằng lại cây.
z Ví dụ: Loại bỏ một nút lá không làm ảnh hưởng đến
tình trạng cân bằng của cây
20

15 22

14 18 25

17 19

Loại bỏ

Cây nhị phân cân đối AVL

z Ví dụ: Loại bỏ một nút nhánh không làm ảnh hưởng


đến tính cân bằng của cây

20

15 22

14 18 25

17 19

Loại bỏ

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 22


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

z Ví dụ: Loại bỏ một nút dẫn đến phải thực hiện phép
quay để tái cân bằng cây

Nút vi
phạm

18
20
Loại bỏ
22 15 20
15

14 18 14 17 19 25
25

17 19

Cây nhị phân cân đối AVL


z Tái cân bằng lại cây sau khi loại bỏ trên cây AVL
– Gọi z là nút đầu tiên không cân bằng trên đường đi từ vị trí
của nút bị loại lên đến gốc cây.
– Gọi y là nút con của z, y là nút con có chiều cao lớn hơn
– Gọi x là nút con của y, x là nút con có chiều cao lớn hơn
– Ta sẽ thực hiện phép quay tại nút z khi xét thêm cả y, x để
tái cân bằng lại cây
– Phép quay có thể ảnh hưởng đến tính cân bằng của các nút
có chiều cao lớn hơn z trong cây (các nút tổ tiên của z trên
đường đi đến gốc) vì vậy cần phải kiểm tra tính cân bằng
của các nút đó cho đến khi chạm tới gốc.

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 23


Cấu trúc dữ liệu và giải thuật

Cây nhị phân cân đối AVL

62
z 44

44 78
Nút cần xóa 17 62 y

17 50 88
50 78 x

48 54
48 54 88

Các dạng cây khác trong tìm kiếm

z Cây đa phân tìm kiếm (Multi-way Tree)


– Là một cây có bậc bất kỳ nhưng có tính chất thứ
tự tương tự như cây nhị phân
– Mỗi nút trong cây có chứa m-1 khóa và m con trỏ
trỏ đến các cây con
– Các giá trị xuất hiện trong một cây con được trỏ
bởi con trỏ p
z Nhỏ hơn giá trị khóa bên phải của p
z Lớn hơn hoặc bằng gía trị khóa bên trái p

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 24


Cấu trúc dữ liệu và giải thuật

Các dạng cây khác trong tìm kiếm

K1 K2 K3

keys < K1 K1<= keys < K2 K2<= keys < K3 K3<= keys

Một cây dạng cây đa phân tìm kiếm

Các dạng cây khác trong tìm kiếm


– Ví dụ cây đa phân tìm kiếm
50 100 150

35 45 85 95 125 135 175

60 70 90 110 120

75

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 25


Cấu trúc dữ liệu và giải thuật

Các dạng cây khác trong tìm kiếm

z Cây B – Cây đa phân tìm kiếm cân bằng


– Một cây đa phân tìm kiếm cân bằng bậc m có các
đặc trưng sau
z Gốc của cây là một nút lá hoặc có ít nhất 2 con
z Tất cả các nút nhánh của cây (trừ nút gốc) có từ m/2
đến m con
z Các nút lá có từ m/2 -1 đến m-1 giá trị khóa trong đó.
z Đường đi từ nút gốc tới một nút lá bất kỳ đều có độ dài
như nhau

Các dạng cây khác trong tìm kiếm


42

16 20 58 76 81 93

11 14 45 52 63 65 74 78 79 85 87 94 97

17 18 19 21 22 23 24

B- Tree với m = 5

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 26


Cấu trúc dữ liệu và giải thuật

Tìm kiếm dựa trên bảng băm


z Tìm kiếm không dựa trên so sánh giá trị khóa mà dựa
vào bản thân giá trị khóa
z Sử dụng một qui tắc biến đổi tham chiếu một giá trị khóa
sang một địa chỉ (tương đối) lưu trữ phần tử dữ liệu

Tìm kiếm dựa trên bảng băm

001 Harry Lee


Khóa Địa chỉ 002 Sarah Trapp

005 Vu Nguyen
005
Vu Nguyen 102002
100 007 Ray Black
John Adams 107095 Hàm băm
002
Sarah Trapp 111060

100 John Adams

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 27


Cấu trúc dữ liệu và giải thuật

Tìm kiếm dựa trên bảng băm

– Hàm băm
z Hàm ánh xạ tập các giá trị khóa lên tập các giá trị địa chỉ
tương đối (đánh số từ 0 đến M-1)
– Đụng độ
z Hiện tượng xảy ra khi hai hay nhiều khóa khác nhau sau
khi băm cho cùng một giá trị địa chỉ tương đối

Các hàm băm thông dụng

– Băm trực tiếp


z Địa chỉ = key
– Sử dụng phép chia
z Địa chỉ = key mod m
– m là kích thước của bảng băm
– Tùy chọn chữ số
z Địa chỉ = số tạo bởi một số các chữ số tại các vị trí cụ thể
trong khóa
z Ví dụ : 379452 → 394
121267 → 112
378845 → 388
160252 → 102
045128 → 051

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 28


Cấu trúc dữ liệu và giải thuật

Các hàm băm thông dụng

– Sử dụng phép nhân


z Địa chỉ = số tạo bởi một số chữ số ở giữa của bình
phương của khóa
z Ví dụ:
– 9452 * 9452 = 89340304 → 3403
z Nếu khóa lớn, có thể chỉ dùng một phần của khóa khi
tính bình phương
379452: 379 * 379 = 143641 → 364
121267: 121 * 121 = 014641 → 464
045128: 045 * 045 = 002025 → 202

Các hàm băm thông dụng

– Sử dụng phương pháp phân đoạn


z Khóa được chia thành nhiều đoạn, thường có độ dài
bằng độ dài địa chỉ
z Áp dụng một số kỹ thuật trên các đoạn để xác định địa
chỉ
– Ví dụ: Khóa = 123|456|789

kỹ thuật tách kỹ thuật gấp


123 + 456 + 789 = 1368 321 + 456 + 987 = 1764
⇒ 368 ⇒ 764

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 29


Cấu trúc dữ liệu và giải thuật

Giải quyết đụng độ

– Các kỹ thuật giải quyết đụng độ


z Phương pháp móc xích:
z Phương pháp địa chỉ mở :
– Thử tuyến tính
– Thử không tuyến tính
– Băm lại

Giải quyết đụng độ -Phương pháp móc xích

001 Mary Dodd (379452)


002 Sarah Trapp (070918) Harry Eagle (166702)
003 Bryan Devaux (121267)
Chris Walljasper (572556)

Phần
008 John Carver (378845)
overflow

306 Tuan Ngo (160252)


307 Shouli Feldman (045128)

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 30


Cấu trúc dữ liệu và giải thuật

Giải quyết đụng độ - Phương pháp địa chỉ mở

– Thử tuyến tính


z Nếu có một bản ghi mà địa chỉ băm tương ứng với giá
trị khóa đã bị chiếm, tìm một ví trí trống gần nhất để lưu
trữ nó.

Giải quyết đụng độ - Phương pháp địa chỉ mở

001 Mary Dodd (379452)


002 Sarah Trapp (070918)
003 Bryan Devaux (121267)
004 Harry Eagle (166702)

Harry Eagle 166702 Hash 002


Function
008 John Carver (378845)

306 Tuan Ngo (160252)


307 Shouli Feldman (045128)

Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 31

Вам также может понравиться

  • CX CT
    CX CT
    Документ13 страниц
    CX CT
    api-19906585
    Оценок пока нет
  • Bé Gi
    Bé Gi
    Документ1 страница
    Bé Gi
    api-19906585
    Оценок пока нет
  • CTDL2008 6dothi P2
    CTDL2008 6dothi P2
    Документ26 страниц
    CTDL2008 6dothi P2
    api-19906585
    Оценок пока нет
  • CTDL2008 5cay
    CTDL2008 5cay
    Документ29 страниц
    CTDL2008 5cay
    api-19906585
    Оценок пока нет
  • CTDL2008 7sapxep
    CTDL2008 7sapxep
    Документ31 страница
    CTDL2008 7sapxep
    api-19906585
    Оценок пока нет
  • CTDL2008 3Mang&Danhsach
    CTDL2008 3Mang&Danhsach
    Документ21 страница
    CTDL2008 3Mang&Danhsach
    api-19906585
    Оценок пока нет
  • CTDL2008 6dothi P1
    CTDL2008 6dothi P1
    Документ15 страниц
    CTDL2008 6dothi P1
    api-19906585
    Оценок пока нет
  • CTDL2008 4StackvaQueue
    CTDL2008 4StackvaQueue
    Документ24 страницы
    CTDL2008 4StackvaQueue
    api-19906585
    Оценок пока нет
  • CTDL2008 2GTDequi
    CTDL2008 2GTDequi
    Документ19 страниц
    CTDL2008 2GTDequi
    api-19906585
    Оценок пока нет
  • CTDL2008 1TongquanGT
    CTDL2008 1TongquanGT
    Документ25 страниц
    CTDL2008 1TongquanGT
    api-19906585
    Оценок пока нет
  • CTDL2008 0gioithieu
    CTDL2008 0gioithieu
    Документ6 страниц
    CTDL2008 0gioithieu
    api-19906585
    Оценок пока нет