Bài giảng Nguyên lý và phương pháp lập trình giúp người học hiểu về Tối ưu hóa vòng lặp và logic. Nội dung trình bày cụ thể gồm có: Chuyển các phát biểu ra khỏi vòng lặp, giảm các kiểm tra ñiều kiện, các phần tử cầm canh, loại bỏ vòng lặp 2, loại bỏ vòng lặp, kết hợp các vòng lặp,...
Trang 1Tối ưu hóa vòng lặp và logic
Nguyên lý và phương pháp lập trình
Tối ưu hóa vòng lặp và logic
TS Nguyễn Tuấn ðăng
Trang 2Nội dung
• Các biến ñổi vòng lặp
– Chuyển các phát biểu ra khỏi vòng lặp
– Giảm các kiểm tra ñiều kiện
+ Các phần tử cầm canh
– Loại bỏ vòng lặp
– Loại bỏ vòng lặp
– Kết hợp các vòng lặp
Trang 3Nội dung
• Các biến ñổi logic
– Sử dụng các biểu thức tương ñương
– Ngưng kiểm tra ñiều kiện khi ñã biết kết quả
– Thứ tự kiểm tra các ñiều kiện
– Tính toán trước các hàm
Trang 41 Các biến ñổi vòng lặp
– Chuyển các phát biểu ra khỏi vòng lặp
– Giảm các kiểm tra ñiều kiện
+ Các phần tử cầm canh
– Giải phóng vòng lặp
– Giải phóng vòng lặp
– Kết hợp các vòng lặp
Trang 5Chuyển các phát biểu ra khỏi vòng lặp
• Ý tưởng: Nếu có một biểu thức hay một
khối phát biểu cho kết quả không ñổi trong vòng lặp thì chuyển nó ra ngoài vòng lặp
• Loại bỏ việc tính toán lại một biểu thức
nhiều lần (cho ra cùng kết quả)
Trang 6Chuyển các phát biểu ra khỏi vòng lặp
Trang 7Chuyển các phát biểu ra khỏi vòng lặp
Trang 8Chuyển các phát biểu ra khỏi vòng lặp
trở thành
if (a < b) {
for (int i=1; i<k; i++) { p(i); }} else {
for (int i=1; i<k; i++) { q(i); }
for (int i=1; i<k; i++) { q(i); }}
• Hai vòng lặp ñược duy trì song song
Trang 9Giảm các kiểm tra ñiều kiện
• Ý tưởng: Nên có càng ít các kiểm tra ñiều
kiện vòng lặp càng tốt, tốt nhất chỉ nên có một kiểm tra ñiều kiện vòng lặp
Trang 10Các phần tử cầm canh
• Ý tưởng: Nếu vòng lặp là một mảng tìm
kiếm một chiều thì ñặt một phần tử vào cuối dãy cần tìm kiếm và loại bỏ ñiều kiện so sánh kiểm tra trong chỉ số vòng lặp
• Ví dụ: Tìm trong một phần tử trong ñoạn
Trang 11while (item(i) != searchValue) {
while (item(i) != searchValue) {
i = i+1;
}
item(n+1) = save;
if (i <= n) { }
Trang 12Các phần tử cầm canh
• Thông thường ít khi cần ghi nhớ và phục hồi
lại phần tử ở vị trí cầm canh
Trang 13Loại bỏ vòng lặp
• Ý tưởng: Loại bỏ (một phần) chi phí tính
toán các chỉ số vòng lặp bằng cách xây dựng một biểu thức với các thành phần xác ñịnh
Trang 14(2) ðơn giản hóa kết quả bằng cách áp dụng các biến ñổi phụ
Trang 16Kết hợp các vòng lặp
• Ý tưởng: Nếu hai vòng lặp thao tác trên
cùng các ñối tượng thì kết hợp hai thân vòng lặp vào cùng một vòng lặp
Trang 17• Lưu ý rằng các phát biểu của Body A và
Body B ñược ñan xen vào nhau
Trang 18Kết hợp các vòng lặp
• Xem biến ñổi sau:
public void p(a,b,n) {
Trang 202 Các biến ñổi logic
- Sử dụng các biểu thức tương ñương
- Ngưng kiểm tra ñiều kiện khi ñã biết kết
quả
- Thứ tự kiểm tra các ñiều kiện
- Tính toán trước các hàm
Trang 21Sử dụng các biểu thức tương ñương
• Ý tưởng: Nếu việc ñánh giá một biểu thức
logic quá phức tạp, thay thế nó bằng một biểu thức tương ñương nhưng ñơn giản hơn
Trang 22Sử dụng các biểu thức tương ñương
Trang 23Sử dụng các biểu thức tương ñương
• Ví dụ 2: (Giả sử có các số thực dương)
trở thành
Trang 24Ngưng kiểm tra ñiều kiện nếu biết
ñược kết quả
• Ý tưởng: Không cần kiểm tra thêm ñiều
kiện nếu không cần thiết
}
Trang 25Ngưng kiểm tra ñiều kiện nếu biết
Trang 26Ngưng kiểm tra ñiều kiện nếu biết
Trang 27Ngưng kiểm tra ñiều kiện nếu biết
Trang 28Thứ tự kiểm tra các ñiều kiện
• Ý tưởng: Các kiểm tra logic có thể ñược sắp xếp
sao cho các kiểm tra có chi phí thấp và thường xuyên ñúng nằm ở trước các kiểm tra có chi phí cao và ít khi ñúng
• Ví dụ: Giả sử các có các vị từ a và b, chi phí
kiểm tra a 100mSec, và b là 1mSec.
kiểm tra a 100mSec, và b là 1mSec.
Trang 29Thứ tự kiểm tra các ñiều kiện
Trang 30Thứ tự kiểm tra các ñiều kiện
Trang 31Tính toán trước các biểu thức
• Ý tưởng: Thay thế bằng một bảng các giá trị tính
toán trước cho các biểu thức phức tạp (trên một miền giá trị hữu hạn)
• Ví dụ:
Type characterType = (UpperCase,
Type characterType = (UpperCase, LowerCase, …);
var cType: characterType;
case inputChar of
A Z: cType := UpperCase;
Trang 32Tính toán trước các biểu thức
trở thành
var cType: characterType;
cTypeTable: array[char] of characterType;cType := cTypeTable[inputChar];