1
TÌM KIẾM & SẮP XẾP
Bài giảng Cấu trúc dữ liệu và Giải thuật
Nội dung Nội d
Tì
(cid:137) Tìm kiếm kiế (cid:131) Tuần tự (cid:131) Nhị phân Nhị phân
(cid:137) Sắp xếp
(cid:131) (cid:131)
(cid:131) Bubble sort Bubble sort (cid:131) Selection sort Insert sort Insert sort (cid:131) Quick sort
Tìm kiếm
3
(cid:133) Tìm kiếm: duyệt một danh sách và lấy ra phần tử (cid:133) Tìm kiếm: duyệt một danh sách và lấy ra phần tử
thoả tiêu chuẩn cho trước.
(cid:133) Là thao tác phổ biến trên máy tính: (cid:134) Tìm mẫu tin trong cơ sở dữ liệu (cid:134) Tìm mẫu tin trong cơ sở dữ liệu (cid:134) Tìm kiếm thông tin trên Internet…
(cid:133) Khảo sát việc tìm kiếm trên mảng/danh sách.
Tìm kiếm Giải thuật Giải thuật
4
(cid:133) Input:put:
(cid:134) Mảng A gồm n phần tử (cid:134) Giá trị x cần tìm
(cid:133) Trả về:
(cid:134) Vị trí phần tử x trong A hoặc –1 nếu x không xuất hiện
(cid:133) Thao tác cơ bản:
(cid:134) So sánh
Tìm kiếm tuần tự Giải thuật Giải thuật
5
(cid:133) Giải thuật: (cid:133) Giải thuật:
(cid:134) Lần lượt so sánh x với các phần tử của mảng A cho đến khi
gặp được phần tử cần tìm, hoặc hết mảng. (cid:133) Ví dụ: A = {1, 25, 6, 5, 2, 37, 40}, x = 6
x = 6
1
25
6
5
2
37
40
x = 6
1
25
6
5
2
37
40
x = 6
1
25
6
5
2
37
40
Dừng
Tìm kiếm tuần tự Đánh giá Đánh giá
6
(cid:133) Đánh giá (thao tác so sánh): (cid:133) Đánh giá (thao tác so sánh):
Hiếm khi xảy ra. Tại sao?
(cid:134) Tốt nhất: O(1) (cid:134) Xấu nhất: O(n) (cid:134) Xấu nhất: O(n) (cid:134) Trung bình:
(cid:132) Giả sử dữ liệu phân bố đều, xác suất bắt gặp x tại mỗi vị trí
đều như nhau.
+ n)
(cid:132) Mỗi vòng lặp thực hiện 2 thao tác so sánh. Tại sao? (cid:132) Số thao tác = 2*(1 + 2 + … + n) = n + 1 (cid:132) Số thao tác n + 1 2*(1 + 2 + (cid:132) Độ phức tạp: O(n)
Tìm kiếm tuần tự Phần tử lính canh Phần tử lính canh
7
(cid:133) Mỗi vòng lặp cần 2 thao tác so sánh: (cid:133) Mỗi vòng lặp cần 2 thao tác so sánh:
(cid:134) Kiểm tra hết mảng (cid:134) Kiểm tra phần tử hiện tại có bằng x (cid:134) Kiểm tra phần tử hiện tại có bằng x
(cid:133) Phần tử lính canh: đặt giá trị x vào cuối mảng ⇒
không cần kiểm tra điều kiện hết mảng. không cần kiểm tra điều kiện hết mảng.
(cid:133) Ví dụ: A = {1, 25, 5, 2, 37}, x = 6
1
25 5
2
37 6
(cid:133) Trả về: n nếu không tìm thấy Trả ề: nế không tìm thấ
Tìm kiếm nhị phân
ị p
8
(cid:133) Khi mảng gồm các phần tử được sắp, tận dụng điều (cid:133) Khi mảng gồm các phần tử được sắp tận dụng điều
kiện này để giảm số thao tác.
(cid:133) Ý tưởng:
(cid:134) Xét phần tử giữa A[m] (cid:134) Xét phần tử giữa A[m] (cid:134) Nếu A[m] = x, trả về m (cid:134) Nếu A[m] > x, tìm trong các phần tử bên trái của m (cid:134) Nếu A[m] > x tìm trong các phần tử bên trái của m (cid:134) Nếu A[m] < x, tìm trong các phần tử bên trái của m
Tìm kiếm nhị phân Ví dụ minh hoạ Ví dụ minh hoạ
9
16 (cid:133) A = {2 3 6 7 10 16 18} x = 16 {2, 3, 6, 7, 10, 16, 18}, x (cid:133) A
2 2 3 3 6 6 7 10 16 18 7 10 16 18
[0] [1] [2] [3] [4] [5] [6]
[4] [5] [6]
2 2 3 3 6 6 7 10 16 18 7 10 16 18
Tìm kiếm nhị phân Chương trình Chương trình
10
int BinarySearch(int a[], int n, int x) {
int l = 0, r = n-1; while (l <= r) { ) {
(
// tìm thấy
int m = (l + r)/2; if (a[m]==x) return m; else if (x < a[m]) r = m else if (x < a[m])
1; r = m – 1;
else l = m + 1;
} return –1;
1
// không tìm thấy // khô
hấ
ì
}
Tìm kiếm nhị phân Bài tập Bài tập
11
(cid:133) Thực hiện việc tìm kiếm đối với các bài tập sau: (cid:133) Thực hiện việc tìm kiếm đối với các bài tập sau:
(cid:134) A = {1, 2, 6, 26, 28, 37, 40}, x = 40
(cid:134) A = {1, 2, 6, 26, 28, 37, 40}, x = -7
Tìm kiếm nhị phân Đánh giá Đánh giá
12
(cid:133) Mỗi lần lặp, chiều dài mảng con phải xét được (cid:133) Mỗi lần lặp chiều dài mảng con phải xét được
giảm ½ so với mảng trước đó.
(cid:133) Mảng ban đầu được chia tối đa k lần với k (cid:133) Mảng ban đầu được chia tối đa k lần với k =
⎣log2n⎦.
(cid:133) Tối đa k vòng lặp được thực hiện trong đó mỗi (cid:133) Tối đa k vòng lặp được thực hiện trong đó mỗi
vòng lặp thực hiện 1-2 phép so sánh.
(cid:133) Độ phức tạp: O(log2n) (cid:133) Độ phức tạp: O(log2n)
(cid:133) Mảng cần được sắp xếp trước!!! (cid:133) Mảng cần được sắp xếp trước!!!
p Sắp xếp p
13
(cid:133) Sắp xếp: tổ chức các phần tử trong một danh sách (cid:133) Sắp xếp: tổ chức các phần tử trong một danh sách
theo thứ tự.
(cid:133) Là bài toán phổ biến trên máy tính. (cid:133) Nhiều giải thuật sắp xếp đã ra đời. (cid:133) Nhiều giải thuật sắp xếp đã ra đời
(cid:133) Khảo sát và đánh giá hiệu quả một số giải thuật sắp
ột ố iải th ật ắ
ả át à đá h iá hiệ Khả xếp thông dụng dựa trên mảng.
Sắp xếp Giải thuật Giải thuật
14
(cid:133) Input: (cid:133) Input:
(cid:134) Mảng A gồm n phần tử.
(cid:133) Output: (cid:133) Output:
(cid:134) Một hoán vị của A sao cho: A0 ≤ A1 ≤ … ≤ An-1 (sắp
xếp tăng dần). ) g
p
(cid:133) Thao tác cơ bản:
(cid:134) So sánh (cid:134) Hoán vị (đổi vị trí hai phần tử)
Sắp xếp Các giải thuật Các giải thuật
15
(cid:133) Các phương pháp sắp xếp thông dụng: (cid:133) Các phương pháp sắp xếp thông dụng:
Q
(cid:134) Bubble Sort (cid:134) Selection Sort (cid:134) Selection Sort (cid:134) Insertion Sort (cid:134) Quick Sort (cid:134) Merge Sort (cid:134) Shell Sort (cid:134) Heap Sort (cid:134) Radix Sort
Bubble sort
16
(cid:133) Giải thuật: (cid:133) Giải thuật:
(cid:134) Xuất phát từ cuối (đầu) dãy, đổi chỗ các cặp phần tử kế
p
g
cận để đưa phần tử nhỏ hơn về vị trí đúng đầu dãy y hiện hành.
(cid:134) Sau đó không xét đến nó ở bước kế tiếp. (cid:134) Lần xử lý thứ i sẽ có vị trí đầu dãy là i. (cid:134) Lặp lại cho đến khi không còn cặp phần tử nào để xét.
(cid:133) Ví dụ: sắp xếp dãy A: 15 2 8 7 3 6 9 17
Bubble sort Ví dụVí dụ
17
i = 0 i 0 j = 4 j 4 15 15 2 2 8 8 7 7 3 3 6 6 9 9 17 17
i = 0 j = 3 15 2 8 3 7 6 9 17
i = 0 j = 1 15 2 3 8 7 6 9 17
1 i = 1 i 5 j = 5 j 15 15 3 3 8 8 7 7 6 6 9 9 17 17 2 2
15 3 8 6 7 9 17 2 i = 1 j = 4
15 3 6 8 7 9 17 2 i = 1 j = 2
15 6 8 7 9 17 2 3 i = 2 j j = 5
15 6 7 8 9 17 2 3 i = 2 j = 3
Bubble sort Ví dụ (tt) Ví dụ (tt)
18
j = 4 j 4 i = 3 i 3 15 7 8 9 17 2 3 6
j = 5 i = 4 15 8 9 17 2 3 6 7
j = 6 i = 5 15 9 17 2 3 6 7 8
7 j = 7 j 6 i = 6 i 15 15 17 17 2 2 3 3 6 6 7 7 8 8 9 9
2 3 6 7 8 9 15 17
Bubble sort Chương trình Chương trình
19
void BubbleSort(int a[], int n){
for(int i=0; i for(int j = n-1; j>i; j--){ if(a[j]
HoanVi(a[j],a[j-1]); } } } (cid:133) Mô tả tình trạng dãy A sau mỗi bước chạy với thuật
(cid:133) Mô tả tình trạng dãy A sau mỗi bước chạy với thuật toán Bubble sort.
{2, 9, 5, 12, 20, 15, 8, 10}
A = {2 9 5 12 20 15 -8 10}
A (cid:133) Các giải thuật sắp xếp thường có độ phức tạp tương
(cid:133) Các giải thuật sắp xếp thường có độ phức tạp tương tự nhau. (cid:133) Cần một đánh giá chi tiết:
(cid:133) Cần một đánh giá chi tiết: (cid:134) Các trường hợp: xấu nhất, tốt nhất, trung bình
(cid:134) Các thao tác:
(cid:134) Các thao tác:
(cid:132) So sánh
(cid:132) Gán (quan trọng hơn vì tốn nhiều chi phí hơn). Lưu ý: mỗi thao tác gán vị tốn 3 phép gán ố void BubbleSort(int a[], int n){Bubble sort
Bài tập
Bài tập
20
Bubble sort
Đánh giá
Đánh giá
21
Bubble sort
Chương trình
Chương trình
22