Академический Документы
Профессиональный Документы
Культура Документы
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
Tìm kiếm
{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}
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
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;
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
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
33 64
29 64 30 70
19 30 40 70 80
23 33 65
23 65 80 19 29 40
– 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)
< 6 6
2 9 2 9
>
w
1 4 8 1 4 8
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;
– 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
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
23 23
18 44 ? 44
12 20 35 52 12 20 35 52
19 22 19 22
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
23 23
18 44 19 44
12 20 35 52 12 20 35 52
19 22 19 22
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
Nút vi phạm
(nút bất thường)
Nút con
Nút cháu
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
Không vi
1 6 10 19 phạm
Không vi
4 17 24 phạm
30 Không vi
phạm
– Để 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
3 14
1 6 10 17
4 19
24
18
sau khi quay phải với cây con phải
Nút vi
3 14 phạm
1 6 10 19
Không vi
phạm
4 17 24
18
3 17
1 6 14 19
4 10 18 24
– 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.
– 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ỏ
20
15 22
14 18 25
17 19
Loại bỏ
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
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
K1 K2 K3
keys < K1 K1<= keys < K2 K2<= keys < K3 K3<= keys
60 70 90 110 120
75
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
005 Vu Nguyen
005
Vu Nguyen 102002
100 007 Ray Black
John Adams 107095 Hàm băm
002
Sarah Trapp 111060
– 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
Phần
008 John Carver (378845)
overflow