Kỹ thuật tối ưu hóa chương trìnhNội dung:1. Các mức thiết kế một chƣơng trình2. Các kỹ thuật tối ƣu hóa chƣơng trình Kỹ thuật tinh chế mã Kỹ thuật tối ƣu hóa rẽ nhánh Kỹ thuật tối ƣu hóa các vòng lặp Tối ƣu hóa chƣơng trình bằng bảng truy cậpTrƣớc khi viết chƣơng trình:+ Không nên mã hóa 1 chƣơng trình ngay khi chỉ mới có ý tƣởng đầu tiên mà phải xem xét tất cả các mức thiết kếcó thể để chọn ra 1 thiết kế làm tăng tốc nhanh nhất với phí tổn ít nhất.
Trang 1CHƯƠNG 4:
MỘT SỐ VẤN ĐỀ MỞ RỘNG
KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
Trang 2NỘI DUNG
1. Các mức thiết kế một chương trình
2. Các kỹ thuật tối ưu hóa chương trình
Kỹ thuật tinh chế mã
Kỹ thuật tối ưu hóa rẽ nhánh
Kỹ thuật tối ưu hóa các vòng lặp
Tối ưu hóa chương trình bằng bảng truy cập
Trang 31 C ÁC MỨC THIẾT KẾ MỘT CHƯƠNG TRÌNH
1. Đặc tả bài toán
2. Thiết kế cấu trúc hệ thống
3. Cấu trúc dữ liệu và thuật toán
4. Tinh chế mã (tối ưu hóa chương trình)
5. Tính độ phức tạp của thuật toán
Trang 4LƯU Ý
Trước khi viết chương trình:
+ Không nên mã hóa 1 chương trình ngay khi chỉ mới có
ý tưởng đầu tiên mà phải xem xét tất cả các mức thiết kế
có thể để chọn ra 1 thiết kế làm tăng tốc nhanh nhất với phí tổn ít nhất
+ Nên thử nhiều mức thiết kế khác nhau bằng cách giải quyết bài toán trên nhiều mặt từ đó chọn được 1 thiết kế tối ưu về không gian và thời gian
Trang 52 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT TINH CHẾ MÃ
Tối ưu chương trình:
về mặt thời gian hoặc
không gian
rất khó thực hiện được cả hai, nếu muốn tối ưu cả hai
khía cạnh trên thì ta phải thay đổi thuật toán
Xét các kỹ thuật tối ưu chương trình về mặt cấu trúc,
tìm 1 thuật giải có độ phức tạp tốt nhất có thể
Trang 6VÍ DỤ 1: VIẾT CHƯƠNG TRÌNH TÍNH TỔNG
S=1+X/1!+X2/2!+…+XN/N!
s=1;
for(i=1;i<=n;i++)
{
p=1;
for(j=1;j<=i;j++)
p=p*x/j;
s=s+p;
}
s=1;p=1;
for(i=1;i<=n;i++) {
p=p*x/i;
s=s+p;
}
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT TINH CHẾ MÃ
Trang 7 Qui tắc 1: Sắp xếp biểu thức điều kiện dạng A1
and A2 and …An theo xác suất sai của các điều
kiện Ai giảm dần
Qui tắc 2: Sắp xếp biểu thức điều kiện dạng A1 or
A2 or …An theo xác suất đúng của các điều kiện Ai
giảm dần
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA RẼ NHÁNH
Trang 8V Í DỤ : C HO 2 DÃY SỐ NGUYÊN A, B LẦN LƢỢT CÓ SỐ PHẦN TỬ LÀ M VÀ N A=B?
if ((m==n)&& Chua(a,b) && Chua(b,a))
printf(“Hai day bang nhau”);
else
printf(“Hai day khong bang nhau”);
Trang 9VÍ DỤ: NHẬP SỐ TỰ NHIÊN N, NẾU N LÀ SỐ CÓ 1 TRONG CÁC TÍNH CHẤT (LẺ, NGUYÊN TỐ, CHÍNH PHƯƠNG, HOÀN HẢO) THÌ THỰC HIỆN S1, NGƯỢC LẠI S2
if (le(n)||nguyento(n)||chinhphuong(n)||hoanhao(n))
printf(“Thuc hien S1”);
else
printf(“Thuc hien S2”);
Trang 10 Qui tắc 1: Giảm số vòng lặp bằng cách thực hiện
nhiều hơn cho mỗi vòng lặp và chú ý vòng lặp ít
hơn thì đặt ở ngoài
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA CÁC VÒNG LẶP
Trang 11VÍ DỤ: GIẢI BÀI TOÁN CỔ (GÀ - CHÓ…)
for(x=1;x<=24;x++)
for(y=1;y<=35;y++)
if((x+y=36)&&(2*x+4*y==100)) printf(“%d%d”,x,y);
for(x=1;x<=24;x++)
{ y=36-x;
if(2*x+4*y==100)
printf(“%d%d”,x,y);
}
Trang 12 Qui tắc 2: Tách các lệnh không phụ thuộc vào chỉ
số lặp ra khỏi vòng lặp
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA CÁC VÒNG LẶP
Trang 13V Í DỤ : V IẾT CT TÍNH TỔNG
S=1/1!+3/2!+…+(2 N -1)/ N !
s=0;
for(i=1;i<=n;i++)
{ gt=1;
for(j=1;j<=i;j++)
gt=gt*j;
s=s+(2*j-1)/gt;
}
s=0;
gt=1;
for(i=1;i<=n;i++) { gt=gt*i;
s=s+(2*i-1)/gt; }
Trang 14 Qui tắc 3: Hợp các vòng lặp có thể
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA CÁC VÒNG LẶP
Trang 15VÍ DỤ: VIẾT CT TÍNH TỔNG CÁC PHẦN TỬ TRÊN ĐƯỜNG
s1=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) s1=s1+a[i][j];
s2=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i+j==n+1) s2=s2+a[i][j];
s1=0;
for(i=1;i<=n;i++)
s1=s1+a[i][j];
s2=0;
for(i=1;i<=n;i++)
s2=s2+a[i][n-i+1];
Trang 16 Qui tắc 4: Làm nhiều hơn trong 1 vòng lặp
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA CÁC VÒNG LẶP
Trang 17V Í DỤ :C ẢI TIẾN PHƯƠNG PHÁP SẮP XẾP
D OUBLE SORT
i=1;
while(i<n)
{ j=i+1;
while(j<=n)
{
if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
j=j+1;
}
i++;
}
i=1;
while(i<n) { j=i+1;
while(j<=n) { if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
if((j+1<=n)&&(a[i]>a[j+1])) {t=a[i];a[i]=a[j+1];a[j+1]=t;} j=j+2;
} i=i+1;
}
Trang 18 Nếu viết các hệ số trong khai triển nhị thức
Newton ta có thể thiết kế đoạn chương trình sau:
Int ckn(int k,int n)
{ if((k==0)||(k==n)) return 1;
else return ckn(k,n-1)+ckn(k-1,n-1);
}
2 CÁC KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
K Ỹ THUẬT T ỐI ƯU HÓA CHƯƠNG TRÌNH BẰNG BẲNG TRUY CẬP
Trang 19CẢI TIẾN
for(i=1;i<=n;i++)
{c[i][1]=1;c[i][i]=1;}
for(i=2;i<=n;i++)
{ ii=(i-1)/2+1;
for(j=2;j<=ii;j++)
{c[i][j]=c[i-1][j]+c[i-1][j-1]; c[i][i-j+1]=c[i][j];
} }