You are on page 1of 21

CẤU TRÚC DỮ LIỆU &

GIẢI THUẬT
(Data structure and Algorithms)
NỘI DUNG MÔN HỌC (60T)
Chương 1 – GIỚI THIỆU MÔN HỌC
Chương 2 – KIỂU DỮ LIỆU
Chương 3 – DANH SÁCH (LIST)
Chương 4 – NGĂN XẾP (Stack)
Chương 5 – HÀNG ĐỢI (QUEUE)
Chương 6 – THUẬT TOÁN (giải thuật)
Chương 7 – ĐỆ QUY
Chương 8 – CÂY VÀ TÌM KIẾM
Chương 9 – SẮP XẾP
Chương 10 – CÂY NHỊ PHÂN
Tài liệu tham khảo
1. Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật,
NXB Khoa học kỹ thuật, 1996.
2. Cấu trúc dữ liệu và giải thuật- Đinh Mạnh
Tường.
3. Trần Hạnh Nhi, Dương Anh Đức- Giáo trình
cấu trúc dữ liệu và giải thuật ĐH Quốc gia Tp Hồ
Chí Minh
CHƯƠNG 4: TÌM KIẾM
8.1. Giới thiệu
8.2. Tìm kiếm tuần tự
8.3. Tìm kiếm nhị phân
8.1. GIỚI THIỆU
a. Khái niệm
Tìm kiếm là một thao tác rất quan trọng đối với nhiều ứng
dụng tin học. Tìm kiếm có định nghĩa là việc thu thập một
số thông tin nào đó từ một khối thông tin lớn đã được lưu
trước đó.
Thông tin lưu trữ thường được chia thành các bản ghi,
mỗi bản ghi có một giá trị khóa để phục vụ cho mục đích
tìm kiếm.
Mục tiêu của việc tìm kiếm là tìm tất cả các bản ghi có giá
trị khóa trùng với một giá trị cho trước. Khi tìm được bản
ghi này, các thông tin đi kèm trong bản ghi sẽ được thu
thập và xử lý.
8.1. GIỚI THIỆU
b. Bài toán tìm kiếm
Cho dãy n phần tử, giả sử chúng được lưu trữ dưới dạng

mảng a[1], a[2], …., a[n]. Hãy tìm vị trí của phần tử có giá
trị là X (cho trước) trong mảng.
Bài toán trên sẽ có một trong hai kết quả:

Thành công: Tìm được phần tử có giá trị X, đưa ra vị trí

phần tử trong mảng


Thất bại: Không tìm được phần tử có giá trị X
8.1. GIỚI THIỆU
c. Các phương pháp tìm kiếm
Hai phương pháp tìm kiếm phổ biến nhất: Tìm kiếm tuần tự

và tìm kiếm nhị phân.


Tìm kiếm tuần tự (Tìm kiếm tuyến tính): Là thực hiện tìm

kiếm lần lượt các giá trị trong mảng tự vị trí đầu tiên cho
đến cuối cùng.
Tìm kiếm nhị phân: Dựa trên mô hình “chia để trị” như

sau: chia tập cần tìm thành hai nửa, xác định nửa chứa giá
trị cần tìm và tập trung tìm kiếm trên nửa đó. Phương pháp
này chỉ áp dụng với tập các phần tử đã được sắp xếp. 7
8.2. TÌM KIẾM TUẦN TỰ
a. Tư tưởng giải thuật
Tiến hành so sánh X lần lượt với từng phần tử của mảng
cho đến khi gặp được phần tử có khoá cần tìm, hoặc tìm hết
mảng mà không thấy X.
Các bước tiến hành như sau:
Bước 1: i:=1; // bắt đầu từ phần tử đầu tiên của dãy

Bước 2: So sánh a[i] với X, có 2 khả năng


 a[i]=x: Tìm thấy. Dừng
 a[i] <>x: Sang Bước 3
Bước 3: i:=i+1; // xét tiếp phần tử kế trong mảng
 Nếu i>n: Hết mảng không tìm thấy. Dừng
 Ngược lại: Lặp lại Bước 2.
8
8.2. TÌM KIẾM TUẦN TỰ
b. Ví dụ: Cho dãy số

12 2 8 5 1 6 4 15
Tìm phần tử X=8

Các bước tiến hành như sau:

Xét i=1  a[1] <> 8  tăng giá trị i=2;

i=2  a[2] <> 8  tăng giá trị i=3

i=3  a[3] = 8  tìm thấy  Dừng

Hãy tìm phần tử X=6 và X=7


9
8.2. TÌM KIẾM TUẦN TỰ
c. Thuật toán
Begin
1) { Khởi đầu}
i:=1;
2) {Tìm khoá x trong dãy}
While (a[i] <>x) and (i<n) do i:=i+1;
3) {Kết luận}
If i=n+1 then
return(0) // không tìm thấy
Else
return(i) // tìm thấy
End;
8.2. TÌM KIẾM TUẦN TỰ
d. Đánh giá giải thuật

Trường Số lần so Giải thích


hợp sánh

Tốt nhất 1 Phần tử đầu tiên có giá trị X

Xấu nhất N+1 Phần tử cuối cùng có giá trị x hoặc


không tìm thấy x

Trung (N+1)/2 Giả sử xác suất các phần tử trong


bình mảng nhận giá trị x là như nhau

Độ phức tạp thuật toán T(n)=O(n)


11
Ưu điểm và nhược điểm khi sử dụng
tìm kiếm tuyến tính
Ưu điểm
Không cần phải tuân theo thứ tự lớn bé của các phần
tử, khi thêm bớt các phần tử vẫn có thể sử dụng được
thuật toán này.
Nhược điểm
Quy mô sử dụng thuật toán chỉ áp dụng với số lượng
dữ liệu ít vì phải kiểm tra tất cả các phần tử, đây cũng
chính là nhược điểm của thuật toán tìm kiếm tuần tự.
8.3. TÌM KIẾM NHỊ PHÂN
a. Tư tưởng giải thuật
- Áp dụng với những dạy đã được sắp xếp theo thứ tự
- Dãy a1, a2, …, an đã được sắp xếp tăng dần.
- Giải thuật tìm kiếm nhị phân sẽ tìm cách giới hạn phạm vi
tìm kiếm X sau mỗi lần so sánh với 1 phần tử nằm ở vị trí
giữa của dãy hiện hành, giả sử là ai:
 Nếu ai=X: Thì việc tìm kiếm kết thúc thành công.
 Nếu ai<X: Thì X có thể xuất hiện trong đoạn [ai+1, an]
 Nếu ai >X: Thì X có thể xuất hiện trong đoạn [a1, ai-1]
- Dựa vào kết qủa so sánh này để quyết định giới hạn dãy tìm
kiếm ở bước kế tiếp là nửa trên hay nửa dưới của dãy hiện
13
hành.
8.3. TÌM KIẾM NHỊ PHÂN
Các bước tiến hành:
Bước 1: left:=1; right:=N // gán vị trí đầu và cuối
Bước 2: mid:= (left+right) div 2 // lấy mốc so sánh
So sánh a[mid] với X có 3 khả năng
 a[mid]=x: Tìm thấy. Dừng
 a[i] >X: right:=mid-1; Tìm X trong dãy con trái aleft, …, amid-1
 a[i] <X: left:=mid+1; Tìm X trong dãy con phải amid+1, ..,aright
Bước 3: Kiểm tra dãy
 Nếu left<=right // còn phần tử chưa xét  tìm tiếp
 Lặp lại bước 2
 Ngược lại: Dừng // Đã xét hết tất cả các phần tử

14
8.3. TÌM KIẾM NHỊ PHÂN
b. Ví dụ: Cho dãy số

1 2 4 5 6 8 12 15
1 2 3 4 5 6 7 8

Tìm phần tử X=8


Ví dụ tìm kiếm nhị phân
Các bước tiến hành như sau

left=1; right=8; mid=4

1 2 4 5 6 8 12 15
1 2 3 4 5 6 7 8

X=8

So sánh (x=8) > (a[mid]=5)  Tìm kiếm nửa bên phải


Ví dụ tìm kiếm nhị phân
Các bước tiến hành như sau

left=5; right=8; mid=6

1 2 4 5 6 8 12 15
1 2 3 4 5 6 7 8

X=8

 So sánh x= a[mid]=8  Tìm thấy x=8 ở vị trí 6 !


 Dừng
Ví dụ tìm kiếm nhị phân
Với dãy khóa
11 23 36 42 58 65 74 87 94 99

Tìm x = 23. Nêu cách thực hiện

11 23 36 42 58 65 74 87 94 99

1 2 3 4 5 6 7 8 9 10
8.3. TÌM KIẾM NHỊ PHÂN
c. Thuật toán
Begin
1) { Khởi đầu} l:=1; r:=n;
2) {Tìm} While l<=r do Begin
3) {Tính chỉ sổ giữa} m:=(l+r) div 2;
4) {So sánh} If x<k[m] then
r:=m-1
else if x>k[m] then
l:=m+1
else return(m)
End;
5){Tìm kiếm không thoả mãn} Return(0)
End;
19
8.3. TÌM KIẾM NHỊ PHÂN
d. Đánh giá giải thuật

Trường Số lần so Giải thích


hợp sánh

Tốt nhất 1 Phần tử giữa có giá trị X

Xấu nhất log2n Phần tử cuối cùng có giá trị x hoặc


không tìm thấy x

Trung (log2n)/2 Giả sử xác suất các phần tử trong mảng


bình nhận giá trị x là như nhau

Độ phức tạp thuật toán T(n)=O(log2n)


20
Phân tích đánh giá tìm kiếm nhị phân
 Ta thấy số lượng phép toán so sánh phụ thuộc vào x.
 Độ phức tạp tính toán của giải thuật tìm kiếm nhị phân:
 Trường hợp tốt nhất là: O(1)
 Trường hợp xấu nhất là O(log2 n)
 Trường hợp trung bình cũng là O(log2 n).
Rõ ràng là so với tìm kiếm tuần tự, chi phí tìm kiếm nhị phân
ít hơn khá nhiều.
Tuy nhiên, trước khi sử dụng tìm kiếm nhị phân dãy khóa đã phải
được sắp xếp, nghĩa là thời gian chi phí cho sắp cũng phải kể đến.
Nếu dãy khóa luôn biến động (được bổ sung thêm hoặc loại bớt đi)
thì lúc đó chi phí cho sắp xếp lại nổi lên rất rõ và chính điều ấy đã
bộc lộ nhược điểm của phương pháp tìm kiếm này.

You might also like