Professional Documents
Culture Documents
Chương 6.1. Tìm kiếm
Chương 6.1. Tìm kiếm
Nội dung
1
12/2/2021
2
12/2/2021
3
12/2/2021
Bài tập: Viết lại hàm tìm kiếm tuần tự để có thể đếm được số lượng phép so sánh cần
thiết trong quá trình tìm kiếm (đối với danh sách móc nối).
4
12/2/2021
Phần tử giữa
if(key<A[mid]) end=mid-1;
else begin=mid+1;
}
return -1;
}
5
12/2/2021
Cây quyết định cho thuật toán tìm kiếm nhị phân 1 trên dãy
số 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
6
12/2/2021
1 5 7 9 21 35
15 23 37 48 54 79
• Bài 1. Cho 1 dãy n số nguyên không trùng lặp và 1 giá trị k, tìm xem có tồn tại
trong dãy 2 số a và b sao cho a+b=k
• Bài 2. Cho 1 ma trận trong đó các phần tử thuộc hàng và cột đều có thứ tự. Hãy
xây dựng thuật toán tìm kiếm xem 1 giá trị k có xuất hiện trong ma trận đó không
• Bài 3. Cho 1 dãy các số dương đã có thứ tự nhưng bị xen lẫn bởi các số 0, hãy xây
dựng thuật toán hiệu quả để tìm kiếm giá trị k>0 trong dãy
{1,2,15,0,0,0,0,0,37,0,0,0,45,0,54,107,0,0,0}
• Bài 4. Cho dãy gồm n số nguyên có trùng lặp, hãy xây dựng thuật toán hiệu quả
để loại bỏ các phần tử bị trùng lặp
7
12/2/2021
• Áp dụng tìm kiếm nhị phân trên cấu trúc liên kết (danh
sách liên kết) ?
• Bài toán tìm kiếm: Phải lưu trữ danh sách tìm kiếm
(thao tác thêm, xóa phần tử)?
• Cấu trúc dữ liệu mảng sẽ tồi nếu phải thêm/xóa
• Danh sách liên kết không tìm kiếm phị phân được
• Cần cấu trúc hỗ trợ tốt cho cả thêm/xóa và tìm kiếm
8
12/2/2021
3 34 A S
1 7 23 D L
5 9 F
B
Các nút trên cây nhị phân phải có khóa phân biệt !
9
12/2/2021
Tìm kiếm:
• Nếu cây rỗng không tìm thấy
• So sánh khóa cần tìm với khóa của nút gốc
• Nếu bằng Tìm thấy
• Ngược lại lặp lại quá trình tìm kiếm ở cây con trái (hoặc cây con phải)
nếu khóa cần tìm nhỏ hơn (lớn hơn) khóa của nút gốc
10
12/2/2021
• Một số thao tác cơ bản của ADT cây tìm kiếm nhị phân
• Search(): tìm kiếm xem một giá trị khóa có xuất hiện trên cây không
• Find(): tìm xem khóa key có xuất hiện trên cây hay không (trả về true/false)
• Insert(): Chèn một nút mới vào cây
• Remove(): Gỡ bỏ một nút trên cây
• TreeTraversal(): tương tự cây nhị phân tổng quát
11
12/2/2021
12
12/2/2021
A S B L A S
D L A D G S F L
B F D
S S
B
(4) (5)
G A
G G G G
A A S A S
Thêm G Thêm A Thêm S
D
G G
Thêm D
G
A S A S
A S
D L D L
D L
13
12/2/2021
• Nhận xét:
• Thứ tự thêm các nút khác nhau có thể tạo ra các cây nhị phân tìm kiếm khác nhau
• Khóa đầu tiên thêm vào cây rỗng sẽ trở thành nút gốc của cây
• Để thêm các khóa tiếp theo ta phải thực hiện tìm kiếm để tìm ra vị trí chèn thích hợp
• Các khóa được thêm tại nút lá của cây
• Cây sẽ bị suy biến thành danh sách liên kết đơn nếu các nút chèn vào đã có thứ tự
(tạo ra các cây lệch trái hoặc lệch phải)
14
12/2/2021
• Thuật toán sắp xếp (treeSort): thêm lần lượt các phần tử vào cây nhị phân tìm kiếm,
sau đó duyệt theo thứ tự giữa.
Số phép so sánh: 1.39 𝑛 log 𝑛 + 𝑂(𝑛)
15
12/2/2021
G G
A S A S
D L D
B F B F
F F
B L B S
A D S A D N T
C N T C
16
12/2/2021
F F
D L B L
B S C S
C N T A N T
B L
G G
A S A S F
G
D L ? L
A S
B F B F
F L
17
12/2/2021
B L
A D G S
C N T
B L
A D G S
C N T
18
12/2/2021
19