Download as pdf or txt
Download as pdf or txt
You are on page 1of 14

1.

Thuật toán
2. Các phương pháp biểu diễn
3. Độ phức tạp
4. Phân loại bài toán
5. Thuật toán đệ quy
6. Thuật giải
7. Một số thuật toán kinh điển
8. Seminar: thuật toán đổi số La Mã
Xem bài giảng chi tiết >

1. Thuật toán:
- Khái niệm: Là 1 tập các hướng dẫn để thực hiện công việc nào đó
- Tính chất: tính hữu hạn (số bước hữu hạn + dừng), tính xác định (không mập mờ + có thể thực thi), tính đúng.
- Đặc trưng: đầu vào/ra, tính hiệu quả, tính tổng quát.
2. Biểu diễn:
- Ngôn ngữ tự nhiên
- Sơ đồ khối
- Mã giả
3. Độ phức tạp:
- Giới hạn bởi thời gian (thực hiện) & không gian (bộ nhớ)
- Mối liên quan: đầu vào & chi phí thực hiện thuật toán
- Độ phức tạp tăng dần: O(C) < O(logan) < O(n) < O(n.logan) < O(nk) < O(an) < O(n!)
4. Phân loại bài toán:
Xem bài giảng chi tiết >
Xem minh họa >

5. Đệ quy:
- Khái niệm: bước thứ n không được thực hiện ngay trong ngữ cảnh của nó mà phải xác định thông qua
một bước ở cấp độ thấp hơn.
- Bao gồm: phần đệ quy & phần cơ sở (phần dừng)

Trò chơi Tháp Hà Nội

Bài toán 8 (hoặc n) con hậu


Xem bài giảng chi tiết >

6. Thuật giải:
- Khái niệm: Các cách giải chấp nhận được nhưng không hoàn toàn đáp ứng đầy đủ các tiêu chuẩn của
thuật toán.
- Thuật giải Heuristic (có nghĩa là “find” or “discover”): Nguyên lý vét cạn thông minh; Nguyên lý
tham lam (Greedy); Nguyên lý thứ tự; Hàm Heuristic
Xem minh họa >

7. Một số thuật toán kinh điển:


Thuật toán sắp xếp:
 Sắp xếp nổi bọt (bubble sort): so sánh hai phần tử kề
nhau, nếu chúng chưa đứng đúng thứ tự thì đổi chổ.
- Sau khi thực hiện xong vòng đầu (n-1 phép so sánh): giá
trị lớn nhất sẽ đi về 1 bên. Thực hiện tiếp cho vòng kế tiếp
(n-2 phép so sánh)... Cứ thực hiện như vậy cho đến khi chỉ
còn vòng cuối (chỉ còn 1 phép so sánh)
- Độ phức tạp:
+ Tình huống xấu nhất: O(n2) ↔ Vd: 5 4 3 2 1

+ Tình huống tốt nhất: O(n) ↔ n-1 Vd: 1 2 3 4 5


+ Tình huống trung bình: O(n2)
Xem minh họa >

Thuật toán sắp xếp:


 Sắp xếp chèn (insertion sort): so sánh bắt đầu từ
giá trị thứ 2 so với các giá trị trước để chèn vào
vị trí thích hợp. Lần lượt thực hiện cho đến giá
trị thứ n
-Độ phức tạp:
+ Tình huống xấu nhất O(n2) ↔ Vd: 5 1 2 3 4

+ Tình huống tốt nhất: O(n) ↔ n-1 Vd: 5 4 3 2 1

+ Tình huống trung bình: O(n2)


Xem minh họa >

Thuật toán sắp xếp:


 Sắp xếp chọn (selection sort): chọn phần tử nhỏ
nhất, hoán vị lên đầu dãy. Chọn phần tử nhỏ nhất
trong dãy mới (còn n-1 phần tử), hoán vị lên đầu
dãy mới... Cứ như vậy cho đến hết.
- Độ phức tạp:

(không đổi trong mọi tình huống)


Xem minh họa >

Thuật toán sắp xếp:


 Sắp xếp trộn (merge sort): ứng dụng giải thuật
đệ quy. Chia danh sách ra thành nhiều nhóm nhỏ Đệ quy
hơn (nhóm nhỏ nhất gồm 2 phần tử). Thực hiện
trộn* 2 nhóm từ cấp thấp đến cao.
*Trộn: Gỉa sử có 2 nhóm a[1…m] và b[1..n] đã
được sắp xếp: so sánh 2 phần từ đầu của nhóm: lấy
phần tử nhỏ hơn vào nhóm phụ c; tiếp tục cho đến
khi một trong 2 nhóm là rỗng; lấy phần còn lại của
nhóm không rỗng cho vào cuối nhóm phụ c Trộn
- Độ phức tạp:
+ Tình huống xấu nhất: O(n.log2n) ↔ Vd: 2 1 4 6 3
n. log2n – 2^ log2n +1; : ceil()
+ Tình huống tốt nhất: O(n.log2n) Vd: 4 5 3 2 1
+ Tình huống trung bình: O(n.log2n)
Xem minh họa >

Thuật toán sắp xếp: a bc


 Sắp xếp nhanh (quick sort): chọn 1 phần tử chốt
(c) ở cuối dãy; so sánh từ trái qua phải: nếu phần tử (a)
nào lớn hơn phần tử chốt thì đem (a) ra cuối, đem (c)
ra vị trí liền trước (b), phần tử tại vị trí liền trước (b)
đem đặt tại vị trí trước đó của (a)
Thực hiện cho đến khi không còn phần tử nào ở bên
trái lớn hơn (c). Lúc này sẽ hình thành nên 2 dãy: 1
dãy bên trái nhỏ hơn (c), 1 dãy bên phải lớn hơn (c).
Tiếp tục chọn ra các phần tử chốt mới cho các dãy này
và thực hiện lại tương tự như trên…
- Độ phức tạp:
+ Tình huống xấu nhất: O(n2) ↔ Vd: 9 8 7 6 5

+ Tình huống tốt nhất: O(n.log2n) Vd: 1 2 5 4 3


+ Tình huống trung bình: O(n.log2n)
Xem minh họa >

Thuật toán tìm kiếm:


 Tìm kiếm tuyến tính (linear search): so sánh giá trị cần tìm (x) lần
lượt với phần tử thứ nhất, thứ hai,... trong dãy cho đến khi gặp được
phần tử cần tìm.
- Độ phức tạp: Vd: Tìm số 9 trong dãy 9 1 5 7 2

+ Tình huống tốt nhất (x nằm ngay đầu dãy): O(c) ↔ 1


+ Tình huống xấu nhất (x nằm cuối dãy hoặc không xuất hiện):
O(n) ↔ n Vd: Tìm số 2 trong dãy 9 1 5 7 2
+ Tình huống trung bình (x xuất hiện k lần & nằm rải rác đều trong
dãy): O(n) ↔ Vd: Tìm số 6 trong dãy 9 6 5 6 2
Tìm số 5 trong dãy 9 6 5 6 2
Xem minh họa >

Thuật toán tìm kiếm:


 Tìm kiếm nhị phân (binary search): dùng cho dãy đã được sắp xếp.
Ví dụ: tra từ điển, bài toán đoán số…
So sánh giá trị cần tìm (x) với phần tử nằm giữa dãy (m0). Nếu:
x=m0: m0 là giá trị cần tìm
x>m0: x nằm trong nữa dãy trên; so sánh x với giá trị giữa dãy trên m+1
x<m0: x nằm trong nữa dãy dưới; so sánh x với giá trị giữa dãy dưới m-1
Tiếp tục thực hiện như trên với các dãy nhỏ hơn đến khi tìm thấy x.
- Độ phức tạp: Vd: Tìm số 5 trong dãy 1 2 3 5 6 7 9
+ Tình huống tốt nhất (x nằm giữa dãy): O(c) ↔ 1
+ Tình huống xấu nhất: O(log2n) ↔ log2n -1
+ Tình huống trung bình: O(log2n) Vd: Tìm số 6 trong dãy 1 2 3 5 6 7 9
Thuật toán tìm kiếm:
 Tìm kiếm nội suy (interpolation search): dùng cho dãy đã được sắp xếp.
Ví dụ: tra từ điển…
Nguyên tắc: tìm ra phần tử bằng cách nội suy các giá trị trong dãy:

(r  l ) số khoảng/giá trị
m  l  ( x  a(l )).
a (r )  a(l )
trong đó: m: vị trí phần tử khảo sát; x: giá trị cần tìm; a(l):giá trị phần tử phía
bên trái dãy; a(r): giá trị phần tử bên phải dãy; r: vị trí bên phải; l: vị trí bên trái
Vd: Tìm số 68 trong dãy: 9 21 32 38 51 59 68 80 91 97 113 119 131 142 149
l=1; a(1) = 9 r=15; a(r)=149

- Độ phức tạp: O(log2log2n); tìm càng nhanh khi các giá trị phân bố càng đều
Seminar: Thuật toán chuyển số La Mã sang số thập phân và ngược
lại. Nhóm thuyết trình gồm 3 người. Thời lượng trình bày: 20-30’
Nội dung:
- Giới thiệu sơ lược về hệ thống số La Mã.
- Lược đồ thuật toán chuyển đổi
- Viết mã giả cho thuật toán
1. Giáo trình “Tin học trong Vật lý kỹ thuật” – Huỳnh
Quang Linh

You might also like