1
Môn: CẤU TRÚC DỮ LIỆU
Chương 2: KỸ THUẬT TÌM KIẾM
(SEARCHING)
2
NỘI DUNG CHƯƠNG 2
2.1 Khái quát về tìm kiếm
2.2 Các giải thuật tìm kiếm nội (Tìm kiếm trên mảng)
Tìm tuyến tính (Linear Search)
Tìm nhị phân (Binary Search)
2.3 Các giải thuật tìm kiếm ngoại (Tìm kiếm trên tập
tin)
Tìm tuyến tính (F Linear Search)
Tìm nhị phân (Binary Search)
BÀI TẬP
3
2.1 Khái quát về tìm kiếm
Trong các hệ lưu trữ và quản lý dữ liệu, thao tác tìm kiếm được
thực hiện nhiều nhất để khai thác thông tin một các dễ dàng.
Số lượng thông tin trong một hệ thống thông tin là đáng kể nên
việc xây dựng các giải thuật tìm kiếm nhanh sẽ có ý nghĩa quan
trọng.
Nếu tìm kiếm trong một hệ thống đã tổ chức thì việc tìm kiếm dễ
dàng hơn.
Các giải thuật tìm kiếm được xây dựng nhằm mục tiêu hỗ trợ
ứng dụng có hiệu quả hơn.
Các giải thuật phụ thuộc vào vào cấu trúc dữ liệu mà nó tác
động đến. Dữ liệu được lưu trữ trên bộ nhớ chính và bộ nhớ
phụ.
4
2.1 Khái quát về tìm kiếm (tt)
Giả sử mỗi phần tử được xem xét có một thành phần khóa
(Key) để nhận diện có kiểu dữ liệu T, các thành phần còn lại là
thông tin (Info), như vậy mỗi phần tử có cấu trúc như sau:
typedef struct DataElement
{
T Key;
InfoData Info;
} DataType;
Để đơn giản, quan tâm thành phần dữ liệu chỉ là khóa nhận
diện
5
2.2 Các giải thuật tìm kiếm nội
Bài toán đặt ra: Giả sử có một mảng M gồm N phần tử. Cần xác
định có hay không phần tử có giá trị bằng X trong mảng M??
Nếu có phần tử X thì phần tử bằng phần tử X là phần tử thứ
mấy trong mảng X?
Các giải thuật tìm kiếm nội đưa ra 2 cách tìm kiếm
Tìm kiếm tuần tự hay (Sequential Search) còn gọi tìm kiếm
tuyến tính (Linear Search)
Tìm kiếm nhị phân (Binary Search)
6
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (Linear Seach)
Ý tưởng:
So sánh lần lượt các phần tử của mảng M với giá trị X cần tìm
bắt đầu từ phần tử đầu tiên cho đến khi tìm ra phần tử có giá trị
X hoặc đã duyệt hết tất cả các phần tử của mảng M thì kết thúc.
Thuật toán
B1: k = 1
B2: Nếu M[k] ≠ X và k<=N
Thì k++
Ngược lại: Lặp lại B2
B3: Nếu k <= N Thì Tìm thấy phần tử có giá trịX ở vị trí k
B4: Nếu không (k<=N): Thì không tìm thấy phần tử có giá trị X
B5: Kết thúc
7
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (tt)
Cài đặt thuật toán:
int LinearSearch (T M[], int N, T X)
{
int k = 0;
while (M[k] != X && k <N) // phần tử mảng M tính từ 0
k++;
if (k < N)
return (k);
return (-1);
}
8
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (tt)
Phân tích, đánh giá thuật toán:
Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)
Số phép gán G
min
= 1
Số phép so sánh S
min
= 3
Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị
= X)
Số phép gán G
max
= 1
Số phép so sánh S
max
= 2N + 1
Trung bình
Số phép gán G
avg
= 1
Số phép so sánh S
avg
= N + 2
9
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (tt)
Cải tiến thuật toán:
Mỗi bước lặp với thuật toán trên cần thực hiện 2 phép so sánh
ý tưởng giảm bớt phép so sánh bằng cách thêm vào mảng
một phần tử cầm canh (sentinel/stand by) có giá trị bằng X để
nhận diện ra sự hết mảng khi duyệt.
B1: k = 1
B2: M[N+1] = X
B3: Nếu M[k] ≠ X
Thì k++
Ngược lại: Lặp lại B3
B4: Nếu k < N Thì Tìm thấy phần tử có giá trịX ở vị trí k
B5: Nguợc lại: Thì không tìm thấy phần tử có giá trị X
B6: Kết thúc
10
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (tt)
Cài đặt thuật toán cải tiến:
int LinearSearchCaiTien (T M[], int N, T X)
{
int k = 0;
M[N] = X; // phần tử mảng M tính từ 0
while (M[k] != X)
k++;
if (k < N)
return (k);
return (-1);
}
11
2.2 Các giải thuật tìm kiếm nội (tt)
Tìm tuyến tính (tt)
Phân tích, đánh giá thuật toán cải tiến:
Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X)
Số phép gán G
min
= 2
Số phép so sánh S
min
= 2
Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị
= X)
Số phép gán G
max
= 2
Số phép so sánh S
max
= (N + 1) + 1
Trung bình
Số phép gán G
avg
= 2
Số phép so sánh S
avg
= N/2 + 2