Nội dung
Giới thiệu bài toán tìm kiếm
Tìm kiếm tuần tự
Tìm kiếm nhị phânKhái niệm tìm kiếm
Cho biết:
Một danh sách các bản ghi (record).
Một khóa cần tìm.
Tìm bản ghi có khóa trùng với khóa cần tìm (nếu có).
Đo độ hiệu quả:
Số lần so sánh khóa cần tìm và khóa của các bản ghi
Phân loại:
Tìm kiếm nội (internal searching)
Tìm kiếm ngoại (external searching)
11 trang |
Chia sẻ: Thục Anh | Ngày: 11/05/2022 | Lượt xem: 424 | Lượt tải: 0
Nội dung tài liệu Bài giảng Cấu trúc dữ liệu - Chương 2: Tìm kiếm - Lê Minh Trung, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TS. Lê Minh Trung
ThS Lương Trần Ngọc Khiết
Khoa CNTT, Đại học Sư phạm, TP. HCM
Nội dung
Giới thiệu bài toán tìm kiếm
Tìm kiếm tuần tự
Tìm kiếm nhị phân
Khái niệm tìm kiếm
Cho biết:
Một danh sách các bản ghi (record).
Một khóa cần tìm.
Tìm bản ghi có khóa trùng với khóa cần tìm (nếu có).
Đo độ hiệu quả:
Số lần so sánh khóa cần tìm và khóa của các bản ghi
Phân loại:
Tìm kiếm nội (internal searching)
Tìm kiếm ngoại (external searching)
Tìm kiếm tuần tự
Input: mảng đầu vào int a[n], khóa cần tìm key
Output: vị trí tìm thấy đầu tiên của key trong mảng
hoặc -1 nếu không tìm thấy
int SequentialSearch(int a[n], int key)
{
for(int i=0; i<n; i++)if(a[i]==key)break;
if(i<n)return i;
return -1;
}
Tìm tuần tự (sequential search)
5
Target key
7 13 5 21 6 2 8 15
0 1 2 3 4 5 6 7
position = 2
return success
Số lần so sánh: 3
Tìm tuần tự - không tìm thấy
9
Target key
7 13 5 21 6 2 8 15
0 1 2 3 4 5 6 7
return not_present
Số lần so sánh: 8
Phân tích tìm kiếm tuần tự
Không tìm thấy:
Số phép so sánh: SS=n
Tìm thấy:
Tốt nhất (a[0]=key): SS=1
Xấu nhất (a[n-1]=key): SS=n
Trung bình
𝑆𝑆 = 𝑖=0
𝑛−1 𝑖 + 1 𝑃 𝑘𝑒𝑦 = 𝑎 𝑖 =
1
𝑛
𝑖=1
𝑛 𝑖 =
𝑛(𝑛+1)
2𝑛
=
𝑛+1
2
= 𝑂(𝑛)
Tìm kiếm nhị phân
Dùng trong trường hợp mảng đầu vào đã được sắp thứ
tự
Ý tưởng:
So sánh khóa cần tìm với phần tử giữa.
Nếu nó nhỏ hơn thì tìm bên trái mảng.
Ngược lại tìm bên phải mảng.
Lặp lại động tác này.
Cần 2 chỉ mục left và right để giới hạn đoạn tìm kiếm
trên mảng.
Khóa cần tìm nếu có chỉ nằm trong đoạn này.
Tìm kiếm nhị phân
Input: mảng tăng int a[n], khóa cần tìm key
Output: vị trí tìm thấy đầu tiên của key trong mảng
hoặc -1 nếu không tìm thấy
int BinarySearch(int a[], int n, int key){
int left=0, right=n-1,middle;
while(left<=right){
middle = (left+right)/2;
if(a[middle]==key)return middle;
if(key<a[middle])right=middle-1;
else left=middle+1;
}
return -1;
}
Tìm nhị phân
10
Target key
2 5 8 10 12 13 15 18 21 24
0 1 2 3 4 5 6 7 8 9
left rightmiddle
position = 3
return success
Số lần so sánh: 7
Khóa cần tìm không bằngn ỏ hơnlớn bằ g
Phân tích tìm kiếm nhị phân
Số lần lặp không vượt quá 𝑙𝑜𝑔2𝑛
Trong mỗi vòng lặp sử dụng tối đa hai phép so sánh
Số phép so sánh tối đa 2 𝑙𝑜𝑔2𝑛
Độ phức tạp của thuật toán: 𝑂 𝑙𝑜𝑔2(𝑛)
Các file đính kèm theo tài liệu này:
- bai_giang_cau_truc_du_lieu_chuong_2_tim_kiem_le_minh_trung.pdf