Giải Thuật Tìm Kiếm Tuyến Tính Ý Tưởng: Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của mảng A cho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x..
Trang 12.1 Các giải thuật tìm kiếm
2.1.1 Bài toán tìm kiếm 2.1.2 Giải thuật tìm kiếm tuyến tính 2.1.3 Giải thuật Tìm kiếm nhị phân
2.2 Các giải thuật sắp xếp
2.2.1 Bài toán sắp xếp 3.2.1 Giải thuật đổi chổ trực tiếp –Interchange Sort
Chương 2 TÌM KIẾM & SẮP XẾP
Trang 22.1 Các Giải Thuật Tìm Kiếm
2.1.1 Bài toán tìm kiếm
2.1.2 Giải thuật tìm kiếm tuyến tính
2.1.3 Giải thuật Tìm kiếm nhị phân
Trang 32.1.1 Bài Toán Tìm Kiếm
Trong thực tế, khi thao tác, khai thác dữ liệu hầu như lúc nào cũng phải thực hiện thao tác tìm kiếm
Kết quả của việc tìm kiếm có thể là không tìm thấy hoặc tìm thấy
Nếu kết quả là tìm thấy thì nhiều khi còn phải xác định xem vị trí của phần tử tìm thấy là ở đâu?
Việc tìm kiếm nhanh hay chậm tùy thuộc vào trạng thái và trật tự của dữ liệu trên đó
Có 2 thuật toán chính: Tìm kiếm tuyến tính & Tìm kiếm nhị phân
Trang 52.1.2 Giải Thuật Tìm Kiếm Tuyến Tính
Ý Tưởng:
Tiến hành so sánh x với phần tử thứ nhất, thứ hai…của mảng A cho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x
Ưu điểm: Thuật toán này có thể cho ta thực hiện tìm kiếm khi các phần tử trong mảng chưa được sắp xếp
Nhược điểm: Sẽ mất rất nhiều thời gian nếu như không có phần tử chúng ta cần tìm
Trang 6VD:Tìm x = 14
12 3 5 1 14 9 14 0 10 2 7
14
Chưa hết mảng
Tìm thấy tại vị trí thứ
5
Tìm thấy tại vị trí thứ
Hết mảng không tìm thấy
Minh Họa
Trang 7 Giải thuật:
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 ; // Thực hiện bước 3.
Bước 3 :
• i = i+1; // xét phần tử kế tiếp trong mảng.
• Nếu i > N // Hết mảng.Không tìm thấy.Dừng
Trang 92.1.3 Giải Thuật Tìm Kiếm Nhị Phân
- Nếu X = M[Mid]: Tìm thấy
- Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm
về nửa đầu của dãy M (Last = Mid–1)
- Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm
về nửa sau của dãy M (First = Mid+1)
Trang 10Ưu điểm: Thuật toán tìm nhị phân sẽ rút ngắn đáng
kể thời gian tìm kiếm
Nhược điểm: Chỉ thực hiện được trên dãy đã có thứ tự
Trang 12X > M[mid]
Trang 137 12 23 34 46 59 69 77
Minh Họa
90 85
Tìm giá trị X = 85 (Tìm thấy)
Đã tìm
M
Mid = 9 M[mid] = 85
L F
Trang 14Giả sử dãy M gồm 10 phần tử có khóa như sau (N = 10)
2 3 4 5 8 15 17 22 25 30
Trang 15Giả sử dãy M gồm 10 phần tử có khóa như sau (N=10)
1 3 4 5 8 15 17 22 25 30
Trang 16B7: IF (X > M[Mid])
B7.1: First = Mid + 1
Trang 17 Cài Đặt
int Timnhiphan(int M[ ], int N, int X){
int First = 1; int Last = N;
while (First <= Last){
int Mid = (First + Last)/2;
}
Trang 182.2 Các giải thuật sắp xếp
2.2.1 Bài toán sắp xếp
2.2.2 Giải thuật đổi chổ trực tiếp –Interchange Sort
2.2.3 Giải thuật chọn trực tiếp-Selection Sort
2.2.4 Giải thuật chèn trực tiếp-Insert Sort
2.2.5 Giải thuật nổi bọt – Bubble Sort
2.2.6 Giải thuật nhanh – Quick Sort
Trang 192.2.1 Bài Toán Sắp Xếp
Để thuận tiện và giảm thiểu thời gian thao tác mà đặc biệt là để tìm kiếm Do vậy sắp xếp dữ liệu là một trong những thao tác cần thiết và thường gặp trong quá trình lưu trữ, quản lý dữ liệu
Trang 212.2.2 Giải Thuật Đổi Chổ Trực
Trang 25a[j]=tam;
Trang 26 Đánh giá giải thuật:
Ðối với giải thuật đổi chỗ trực tiếp, số lượng các phép so sánh xảy ra không phụ thuộc vào tình trạng của dãy số ban đầu
Nhưng số lượng phép hoán vị thực hiện tùy thuộc vào kết qủa so sánh
Trang 272.2.3 Giải Thuật Chọn Trực Tiếp –
Trang 29Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 45 28 73 61 16 23 7
Min
16
Minh Họa
Trang 30Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 31Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 32Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 33Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11
Min
45 61
16
Minh Họa
Trang 34Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 35Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11
Kết thúc vì mảng chỉ còn 1 phần tử
16
Minh Họa
Trang 36Ban đầu Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Lần 6
11 45 28 73 61 7 23 16
11 45 28 73 61 16 23 7
11 45 28 73 61 16 23 7
11 16 28 73 61 45 23 7
11 16 23 73 61 45 28 7
11 16 23 28 61 45 73 7
11 16 23 28 45 61 73 7
11 16 23 28 45 61 73 7
Lần 7
Trang 39 Đánh giá giải thuật:
Ðối với giải thuật chọn trực tiếp, có thể thấy rằng ở lượt thứ i, bao giờ cũng cần (n-i) lần so sánh để xác định phần tử nhỏ nhất hiện hành Số lượng phép so sánh này không phụ thuộc vào tình trạng của dãy
số ban đầu, do vây kết luận:
Trang 402.2.4 Giải Thuật Chèn Trực Tiếp –Insert Sort
Tiếp tục cho đến thêm khi xong a n vào đoạn a 1 a 2 …
a n-1 sẽ có dãy a 1 a 2 a n được sắp xếp
Trang 41Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
13 7 9 4 11 3 17 15
13 7 9 4 11 3 17 15
Minh Họa
Trang 43Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 3 17 15
7 9 13 4
13 7 9 4 11 3 17 15
Minh Họa
Trang 44Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 45Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
17 15
4 7 9 11 13 3
13 7 9 4 11 3 17 15
Minh Họa
Trang 46Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Trang 47Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
3 4 7 9 11 13 17 15
Kết thúc
13 7 9 4 11 3 17 15
Minh Họa
Trang 4813 7 9 4 11 3 17 15
Ban đầu Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Lần 6
Trang 50Cài Đặt void InsertSort(int a[],int n)
a[pos+1]=a[pos];
pos ;
}a[pos+1]=x; //chèn x vào dãy}
Trang 51 Đánh giá giải thuật:
Các phép so sánh xảy ra trong vòng lặp while tìm
vị trí thích hợp pos, và mỗi lần xác định vị trí đang xét không thích hợp, sẽ dời chỗ phần tử a[pos] tương ứng
Giải thuật thực hiện tất cả n – 1 vòng lặp while, do
số lượng phép so sánh và dời chỗ này phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ có ước lượng trong từng trường hợp sau:
Trang 522.2.5 Giải Thuật Nổi Bọt –Bubble Sort
Ý Tưởng:
Xuất phát từ cuối dãy ,đổi chổ các cặp phần tử kế cận để đưa phần tử đó về vị trí đứng đầu dãy hiện hành
Sau đó sẽ không xét đến nó ở bước tiếp theo
Do vậy ở lần xử lý thứ i sẽ có vị trí dầu dãy là i phần
tử được sắp xếp
Lặp lại xử lý trên cho đến khi không còn phần tử nào
để xét
Trang 53 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
11 5 7 3 9 2
2 1
3 4 5 6
i
11 5 7 3 9 2
2 1
3 4 5 6
Ban đầu
Trang 54 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 11 5 7 3 9 2
2 1
3 4 5 6 7 8
i
j
Trang 55 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 11 5 7 3
2 1
3 4 5 6
i
Trang 56 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 11 5 7 9
2 1
3 4 5 6 7 8
i
j
Trang 57 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 11 7
2 1
3 4 5 6
i
Trang 58 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 11 9
2 1
3 4 5 6 7 8
i
j
Trang 59 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9
2 1
3 4 5 6
i
Kết
Trang 60Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
Minh Họa
1
11 5 7 3 9 2 15
2 1
3 4 5 6 7
1 11 5 7 3 9 2
2 1
3 4 5 6 7
1 2 11 5 7 3 9
2 1
3 4 5 6 7
1 2 3 11 5 7 9
2 1
3 4 5 6 7
1 2 3 5 11 7 9
2 1
3 4 5 6 7
1 2 3 5 7 11 9
2 1
3 4 5 6 7
1 2 3 5 7 9 11
2 1
3 4 5 6 7
1 2 3 5 7 9 11
2 1
3 4 5 6 7 8
Trang 61Trong khi (j>i) thực hiện:
Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]j—;
Bước 3:
i=i+1;
Nếu i>N-1: Hết dãy, dừng
Trang 62int tam=M[j];
M[j]=M[j-1];
M[j-1]=tam;
}}
Trang 63 Đánh giá giải thuật:
Ðối với giải thuật nổi bọt, số lượng các phép so sánh xảy ra không phụ thuộc vào tình trạng của dãy
số ban đầu
Nhưng số lượng phép hoán vị thực hiện tùy thuộc vào kết qủa so sánh
Trang 64 Ý Tưởng:
Phân hoạch dãy M thành 2 dãy con thỏa mãn điều kiện: “1/2 Dãy bên trái chứa các phần tử nhỏ hơn các phần tử của 1/2 Dãy bên phải”
Nếu dãy con có nhiều hơn 1 phần tử thì thực hiện sắp xếp dãy con (Đệ qui)
2.2.6.Giải Thuật Sắp Xếp Nhanh – Quick Sort
Trang 72 Minh Họa
Cho dãy có 8 phần tử Sắp xếp theo vi trí tăng dần
1 2 3 5 7 9 10 15
Không còn đoạn nào cần sắp xếp
Trang 74Trong khi (j>i) thực hiện:
Nếu a[j]<a[j-1]: Hoán vị a[j] và a[j-1]j—;
Bước 3:
i=i+1;
Nếu i>N-1: Hết dãy, dừngNgược lại: Lặp lại Bước 2
Trang 75Cài Đặt void QuickSort(int M[], int First, int Last){
int i, j, tam, x;
x = M[(First+Last)/2]; i = First; j = Last;
do { while (M[i] <x) i++;
while (M[j] > X) j ;
if (i <= j) {
Trang 76 Đánh giá giải thuật:
+ Trường hợp tốt nhất, khi mảng M có thứ tự tăng:
Số phép gán: Gmin = N-1
Số phép so sánh: Smin = N×Log2(N)/2
Số phép hoán vị: Hmin = 0+ Trường hợp xấu nhất, khi phần tử X được chọn
ở giữa dãy con là giá trị lớn nhất:
Số phép gán: Gmax = N×(N-1)/2
Số phép so sánh: Smax = (N-1)×(N-1)
Số phép hoán vị: Hmax = N×(N-1)/2+ Trung bình:
Số phép gán: Gavg = (N-1)×(N+2)/4
Số phép so sánh: Savg = N×[Log2(N)+2N–2]/4
Trang 77Chi phí trung bình O(n*log2n)
Chi phí cho trường hợp xấu nhất O(n2)
Chi phí này phụ thuộc vào cách chọn phần tử trục:
- Nếu chọn được phần tử có giá trị trung bình ta
sẽ chia thành 2 dãy bằng nhau
- Nếu chọn nhằm phần tử nhỏ nhất (hay lớn nhất) O(n2)
Trang 781 Trình bày tư tưởng và minh họa giải thuật tìm kiếm tuyến tính, tìm kiếm nhị phân
2 Cài đặt thuật toán tìm tuyến tính bằng cách:
Trang 791 Trình bày tư tưởng và minh họa 5 giải thuật sắp xếp
2 Cài đặt 5 giải thuật sắp xếp theo các trường hợp và điền kết quả số lần thực hiện các phép toán vào bảng sau: