CHƯƠNG 4:
MỘT SỐ VẤN ĐỀ MỞ RỘNG
KỸ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH
NỘ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
1. 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
LƢ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.
2. 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ể
VÍ DỤ 1: VIẾT CHƢƠNG TRÌNH TÍNH TỔNG
S=1+X/1!+X
2
/2!+…+X
N
/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Ã
Qui tắc 1: Sắp xếp biểu thức điều kiện dạng A
1
and A
2
and …A
n
theo xác suất sai của các điều
kiện A
i
giảm dần
Qui tắc 2: Sắp xếp biểu thức điều kiện dạng A
1
or
A
2
or …A
n
theo xác suất đúng của các điều kiện A
i
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
VÍ DỤ: CHO 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”);
VÍ 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”);
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
VÍ 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);
}
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
VÍ DỤ: VIẾT CT TÍNH TỔNG
S=1/1!+3/2!+…+(2N-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;
}
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
VÍ DỤ: VIẾT CT TÍNH TỔNG CÁC PHẦN TỬ TRÊN ĐƢỜNG
CHÉO CHÍNH (S1) VÀ ĐƢỜNG CHÉO PHỤ (S2)
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];
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
VÍ DỤ:CẢI TIẾN PHƢƠNG PHÁP SẮP XẾP
DOUBLE 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;
}
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
CẢ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];
}
}