KHOA CÔNG NGHỆ THÔNG TIN
----- -----
BÀI TẬP LỚN
Bài toán phân phối áo áp dụng phương
pháp xấp xỉ
Giảng viên hướng dẫn: PGS.TS Đào Thanh Tĩnh
Học viên thực hiện: Lê Văn Hợp
Lớp: Cao học 25B - HTTT
Hà nội, 05/ 2014
Phân tích và đánh giá thuật toán
Mục lục
LỜI NÓI ĐẦU
Phân tích và đánh giá thuật toán là một trong những nhân tố quan
trọng xác định được hiệu năng hệ thống khi giải quyết bài toán tin học đặt
ra. Có nhiều bài toán (thuật toán) được đưa ra chỉ tốt ở một mức độ nào đó
chấp nhận được. Việc tính toán cho phép chấp nhận một sai số nào đó. Vì
vậy, thời gian gần đây phương pháp xấp xỉ được quan tâm và phát triển
trong một số ứng dụng. Có rất nhiều bài toán mà ta có thể giải bằng phương
pháp này. Trong đó phải đề cấp đến bài toán phân phối áo, đây là một bài
toán tối ưu hóa. Bài toán được đặt tên từ vấn đề lựa chọn cách phân phối áo
sao cho kết quả thu được là độ lệch cực tiểu.
Liên quan đến việc giải quyết bài toán này chúng ta có rất nhiều
phương án khác nhau như: Phương pháp sắp xếp (vun đống), phương pháp
tham lam …
Ở mỗi phương pháp đều có những ưu nhược điểm khác nhau. Tuy
nhiên tất cả chỉ là những phương án tốt chứ chưa phải là phương án tối ưu
nhất.
Lê Văn Hợp – Cao học 25B – HTTT
2
Phân tích và đánh giá thuật toán
I.
PHƯƠNG PHÁP XẤP XỈ
Thuật toán cho kết quả gần với kết quả tối ưu được gọi là thuật toán xấp xỉ.
1. Tỷ lệ xấp xỉ
− Bài toán có thể có nhiều giải pháp.
− Cần tối ưu hóa một hàm mục tiêu.
− Giải pháp tối ưu là giải pháp mà cực đại (hoặc cực tiểu) hóa hàm mục
tiêu.
Đặt:
− C là giá trị của hàm mục tiêu của giải pháp xấp xỉ.
− C* là giá trị của hàm mục tiêu của giải pháp tối ưu.
Một thuật toán xấp xỉ có tỷ lệ xấp xỉ, ký hiệu ρ(n), với bất kỳ dữ liệu vào
kích thước n là:
max(
C C*
, ) ≤ ρ ( n)
C* C
+ Bài toán cực tiểu hóa: C ≥ C* > 0, khi đó ρ(n)=C/C*
+ Bài toán cực đại hóa: C* ≥ C > 0, khi đó ρ(n)=C*/C
Một thuật toán với tỷ lệ xấp xỉ ρ(n) được gọi là thuật toán xấp xỉ-ρ(n). Ta
luôn có: ρ(n) ≥ 1
Lê Văn Hợp – Cao học 25B – HTTT
3
Phân tích và đánh giá thuật toán
Nếu ρ(n) càng nhỏ thì giải pháp xấp xỉ càng gần với giải pháp tối ưu.
Thuật toán xấp xỉ-1 cho giải pháp tối ưu (nghĩa là ρ(n)=1)
2. Yêu cầu của thuật toán xấp xỉ:
Một thuật toán xấp xỉ phải thoả mãn các yêu cầu sau đây:
−
−
−
−
II.
Dễ tính, dễ chương trình hoá.
Ước lượng được sai số gặp phải.
Tính được thời gian chạy của thuật toán.
Chứng minh được tính đúng đắn của thuật toán.
TÊN ĐỀ TÀI (Đề số 23)
Người ta may sẵn n cái áo với các kích thước vai V(1), V(2), …, V(n)
cho n học sinh. Các học sinh này được đánh số từ 1 tới n và có kích thước
vai là p(1), p(2), …, p(n). Nếu học sinh i nhận được áo j thì độ lệch vai cho
trường hợp này sẽ là |V(i)-p(j)|. Một phương án phân phối áo cho các học
sinh 1,2,...n được mô tả như một hoán vị π 1, π 2, …,π n với hàm ý học sinh i
nhận được áo πi. Độ lệnh phương án này được định nghĩa bằng:
max {|V(i) – p( π i )|, i=1,2,...,n}
Hãy xây dựng thuật toán phân phối áo cho các học sinh sao cho độ lệnh
là cực tiểu. Đánh giá độ phức tạp của thuật toán xây dựng được.
III.
PHÂN TÍCH BÀI TOÁN
1. Các vấn đề của bài toán
− Dữ liệu đầu vào là hai dãy số V(1), V(2), …, V(n) và p(1), p(2), …,
p(n) tương ứng với kích thước vai áo và kích thước vai của n học
sinh.
− Đầu ra bài toán là đưa ra phương án phân phối áo cho học sinh với độ
lệnh là cực tiểu.
− Giải pháp phân phối áo cho học sinh như thế nào.
− Cách tính độ lệnh cực tiểu của các phương án.
− Xây dựng thuật toán phân phối áo cho các học sinh sao cho độ lệnh là
cực tiểu.
Lê Văn Hợp – Cao học 25B – HTTT
4
Phân tích và đánh giá thuật toán
− Đánh giá được độ phức tạp của thuật toán.
− Khả năng nâng cao số phần tử tối đa của hai mảng dữ liệu đầu vào có
thể lên đến 1.000.000 phần tử. Do vậy, bài toán phải tính đến khả
năng không thể chứa hết trong bộ nhớ quy ước.
2. Các ví dụ minh họa
Ví dụ 1:
Kích thước vai áo có số thứ tự là: V(1,2…8) = {19, 8, 6, 11, 9, 13, 5, 14}
Kích thước vai học sinh có số thứ tự là: p(1,2..8) = {15, 4, 3, 2, 6, 5, 1, 10}
Phương án 1:
Phân phối các áo có kích thước vai V1, V2,...V8 tương ứng với các học
sinh kích thước vai p1, p2,...p8
Khi đó độ lệnh của phương án phân phối là .
d1 = max {|V(i) – p(π i)|, i=1,2,...,8}
d1 = max {(19–15), (8–4), (6–3), (11–2), (9–6), (13–5), (5–1), (14–10)} = 9
Phương án 2:
Sắp xếp kích thước vai áo, vai học sinh theo thứ tự tăng dần và đánh
số lại theo thứ tự, ta có:
Kích thước vai áo có số thứ tự là: V(1,2…8)= { 5, 6, 8, 9, 11, 13, 14, 19}
Kích thước vai học sinh có số thứ tự là: p(1,2..8)= { 1, 2, 3, 4, 5, 6, 10, 15}
Phân phối các áo có kích thước vai V1, V2,...V8 tương ứng với các học
sinh kích thước vai p1, p2,...p8
Khi đó độ lệnh của phương án phân phối là :
d2 = max {|V(i) – p(π i)|, i=1,2,...,8}
d2 = max {(5–1), (6–2), (8–3), (9–4), (11–5), (13–6), (14–10), (19–15)} = 7
Phương án 3 :
Tìm áo có kích thước nhỏ nhất trong dãy V1..V8 = Vmin1= 5
Lê Văn Hợp – Cao học 25B – HTTT
5
Phân tích và đánh giá thuật toán
Tìm học sinh có kích thước vai nhỏ nhất trong dãy p1…p8 = pmin1= 1
Phát áo có kích thước Vmin1 cho học sinh có kích thước vai pmin1
Thực hiện tương tự với các dãy còn lại có kết quả :
Vmin2 = 6 , pmin2= 2
Vmin3 = 8 , pmin3= 3
Vmin4 = 9 , pmin4= 4
Vmin5 = 11 , pmin5= 5
Vmin6 = 13 , pmin6= 6
Vmin7 = 14 , pmin7= 10
Vmin8 = 19 , pmin8= 15
Khi đó độ lệnh của phương án phân phối là :
d3= max {|V(i) – p(π i)|, i=1,2,...,8} = max {|Vmin(α) – pmin(α)|,
α=1,2,...,8}
d3= max {|5 -1|, |6 -2|, |8 -3|, |9 -4|, |11 -5|, |13 -6|, |14 - 10|, |19 - 15|} = 7
Nhận xét: Trong hai phương án trên thì phương án 2 và phương án 3 có độ
lệnh bằng 7 tốt hơn.
Ví dụ 2:
Kích thước vai áo có số thứ tự là:
V(1,2…10) = {2, 8, 10, 17, 11, 27, 33, 42, 19, 19}
Kích thước vai học sinh có số thứ tự là:
p(1, 2…10) = {12, 5, 3, 6, 13, 23, 16, 20, 9, 22}
Phương án 1 :
Phân phối các áo có kích thước vai V1, V2,...V10 tương ứng với các
học sinh kích thước vai p1, p2,...p10
Khi đó độ lệnh của phương án phân phối là .
d1 = max {|V(i) – p(π i)|, i=1,2,...,10}
d1 = max {(12–2), (8–5), (10–3), (17–6), (13–11), (27–23), (33–16), (42–
20), (19–9), (22–19)} = 22
Lê Văn Hợp – Cao học 25B – HTTT
6
Phân tích và đánh giá thuật toán
Phương án 2 :
Sắp xếp kích thước vai áo, vai học sinh theo thứ tự tăng dần và đánh
số lại theo thứ tự, ta có:
Kích thước vai áo có số thứ tự là:
V(1,2…10)= {2, 8, 10, 11, 17, 19, 19, 27, 33, 42}
Kích thước vai học sinh có số thứ tự là:
p(1,2..10) = {3, 5, 6, 9, 12, 13, 16, 20, 22, 23}
Phân phối các áo có kích thước vai V1, V2,...V10 tương ứng với các học sinh
kích thước vai p1, p2,...p10
Khi đó độ lệnh của phương án phân phối là:
d2 = max {|V(i) – p(π i)|, i=1,2,...,10}
d2 = max {(3–2), (8–5), (10–6), (11–9), (17–12), (19–13), (19–16), (27–20),
(33–22), (42–23)} = 19
Phương án 3 :
Tìm áo có kích thước nhỏ nhất trong dãy V1..V10 = Vmin1= 2
Tìm học sinh có kích thước vai nhỏ nhất trong dãy p1…p10 = pmin1= 3
Phát áo có kích thước Vmin1 cho học sinh có kích thước vai pmin1
Thực hiện tương tự với các dãy còn lại có kết quả :
Vmin2 = 8 , pmin2= 5
Vmin3 = 10 , pmin3= 6
Vmin4 = 11 , pmin4= 9
Vmin5 = 17 , pmin5= 12
Vmin6 = 19 , pmin6= 13
Vmin7 = 19 , pmin7= 16
Vmin8 = 27 , pmin8= 20
Vmin9 = 33 , pmin9= 22
Vmin10 = 42 , pmin10= 23
Khi đó độ lệnh của phương án phân phối là :
Lê Văn Hợp – Cao học 25B – HTTT
7
Phân tích và đánh giá thuật toán
d3= max {|V(i) – p(π i)|, i=1,2,...,10} = max {|Vmin(α) – pmin(α)|,
α=1,2,...,10}
d3= max {|2 - 3|, |8 -5|, |10 -6|, |11 -9|, |17 -12|, |19 -13|,|19 - 16|, |27 - 20|, |33
-22|, |42 -23|} = 19
Nhận xét: Trong phương án trên thì phương án 2 (phương án sắp xếp lại hai
dãy theo thứ tự tăng dần (không giảm)) và phương án 3 (phương pháp tham
lam) là phương án cho kết quả có độ lệnh nhỏ hơn.
3. Cách xây dựng các phương án phân phối áo
Sắp xếp n cái áo theo chiều không giảm của kích cỡ vai, sắp xếp các học
sinh theo chiều không giảm của kích cỡ vai. Một phương án phân phối áo
cho các học sinh có độ lệch cực tiểu là chọn áo có kích thước vai nhỏ nhất
phát cho học sinh có kích thước vai nhỏ nhất. Sau đó tiến hành tương tự với
các áo và học sinh còn lại.
IV.
THUẬT TOÁN
1. Thuật giải cơ bản
1.1. Ý tưởng
Qua phân tích bài toán và cách xây dựng phương án phân phối áo như ở
trên, ta dự đoán một phương án phân phát áo cho học sinh như sau:
− Ý tưởng 1:
Sắp xếp n học sinh theo thứ tự tăng dần (không giảm) của kích
thước vai, đánh số từ 1 đến n theo thứ tự đó. Tương tự sắp xếp n cái
áo theo thứ tự tăng dần (không giảm) của kích thước vai, đánh số từ
1 đến n theo thứ tự đó.
Lần lượt phát áo cho học sinh theo quy tắc:
- Học sinh thứ 1 được nhận áo thứ 1;
- Học sinh thứ 2 được nhận áo thứ 2;
- ………
- Học sinh thứ n nhận áo thứ n.
Tính độ lệch của phương án.
− Ý tưởng 2 (Thuật toán tham lam)
+ Tìm học sinh có kích thước vai nhỏ nhất trong n học sinh
+ Tìm chiếc áo có kích thước vai nhỏ nhất trong n chiếc áo
+ Phát chiếc áo vừa tìm được cho học sinh vừa tìm được
+ Tìm học sinh có kích thước vai nhỏ nhất trong n-1 học sinh còn lại
Lê Văn Hợp – Cao học 25B – HTTT
8
Phân tích và đánh giá thuật toán
+ Tìm chiếc áo có kích thước vai nhỏ nhất trong n-1 chiếc áo còn lại
+ Phát chiếc áo vừa tìm được cho học sinh vừa tìm được
+ Thực hiện các bước trên cho đến khi không còn học sinh & áo
1.2. Thuật giải bằng lời cho ý tưởng 1:
− Input: Hai dãy số nguyên V1, V2, V3,… Vn; p1, p2, p3,…pn;
− Ouput: Độ lệnh cực tiểu d; mảng đã được sắp xếp tương ứng với
phương pháp phân phối áo.
Thuật toán:
1. Bước 1: Sắp xếp mảng kích thước vai áo theo thứ tự tăng dần
(không giảm).
2. Bước 2: Sắp xếp mảng kích thước vai học sinh theo thứ tự tăng
dần (không giảm).
3. Bước 3: Lấy tương ứng học sinh thứ i sẽ được áo thứ i.
4. Bước 4: Tính độ lệch của từng học sinh, tính độ lệch lớn nhất
(độ lệch của phương án phân phối áo).
1.3. Thuật giải giả mã cho ý tưởng 1:
* Input: mảng số nguyên V[1..n],p[1..n] số nguyên n
* Output: mảng số nguyên đã săp xếp V[1..n],p[1..n] độ lệnh d;
{Sử dụng thuật toán Sắp xếp vun đống(HeapSort) để sắp xếp hai mảng kích
thước của vai áo và vai học sinh vì thuật toán vun đống được đánh giá là có
độ phức tạp O(nlog2n)}.
Proc Swap(x:gia tri, y:gia tri)
Begin
1. temp := x;
2. x := y;
3. y := temp;
End;
Proc Adjust( X:mang,i:chi so,n:tri so)
j,flag:interger;
k:gia tri;
Begin
Lê Văn Hợp – Cao học 25B – HTTT
9
Phân tích và đánh giá thuật toán
1.k := X[i];flag := 1; j := 2 * i;
2. while(j <= n)and(flag)do
begin
2.1 if(j < n )&&( X[j] < X[j+1])then
j:=j+1;
2.2 if( k >= X[j]) then
flag :=0;
else
X[j/2] = X[j];
j := j *2;
end;
3. X[j/2] = k;
End;
proc Build_Initial_Heap( X:mang, n: tri so)
i: interger;
Begin
For i=n/2 down to 0
Adjust(X,i,n-1);
End;
proc SortHeap( X:mang , n tri so)
i:interger;
Begin
1. Build_Initial_Heap(X,n);
2. for i=(n-2)downto 0
2.1 Swap(X[0],X[i+1]);
2.2 Adjust(X,0,i);
End;
Function Dolech(X:mang,Y:mang, n:tri so)
tg: giatri
Begin
1.For i=0 to n-1
Lê Văn Hợp – Cao học 25B – HTTT
10
Phân tích và đánh giá thuật toán
1.1.In(X[i],Y[i]);
1.2.tg=abs(X[i]-Y[i]);
1.3.if(dl<=tg)
dl=tg;
2.Dolech:=dl;
End;
Proc Main()
1.SortHeap(V,0,n);
2.SortHeap(p,0,n);
3.d :giá trị;
d=Dolech(V,p,n);
Output
d; V[1],p[1]; V[2],p[2]; …; V[n],p[n];
1.4. Thuật giải bằng lời cho ý tưởng 2:
−
−
Input: Hai dãy số nguyên V1, V2, V3,… Vn; p1, p2, p3,…pn;
Ouput: Độ lệnh cực tiểu d; Phương án phân phối áo V(1),p(1);
V(2),p(2); … V(n),p(n) (kết quả này đã đánh thứ tự lại số thứ tự của học
sinh).
Thuật toán:
1. Bước 1: Tìm áo có kích thước vai áo nhỏ nhất.
2. Bước 2: Tìm học sinh có kích thước vai nhỏ nhất.
3. Bước 3: Tính độ lệch vai áo của cặp áo và kích thước vai tìm
được.
4. Bước 4: Thực hiện tương tự với số áo và học sinh còn lại.
1.5. Thuật giải giả mã cho ý tưởng 2:
* Input: Mảng số nguyên V[1..n],p[1..n] số nguyên n
* Output: Độ lệnh cực tiểu d; Phương án phân phối áo V(1),p(1); V(2),p(2);
…; V(n),p(n) (kết quả này đã đánh thứ tự lại số thứ tự của học sinh).
Proc Greedy(X,Y: mảng,n:chỉ số)
If (n>0) then
1.i=0; j=0; l=0; m=0; d=0;
V=X[0];p=p[0];
Lê Văn Hợp – Cao học 25B – HTTT
11
Phân tích và đánh giá thuật toán
2.While (i
2.1. if (X[i]<=V]) then
V=X[i];
l=i;
2.2. i++;
3. While (j
3.1. if (Y[j]<=p) then
p=Y[j];
m=j;
3.2. j++;
4.Doicho(X[l],X[n]);Doicho(Y[m], Y[n]);
5.if d<=|X[n]-Y[n]|then d=|X[n]-Y[n]|
6.Inra(X[n],Y[n]);
7.Greedy(X,Y,n-1);
Output
d;
2. Thuật giải mở rộng
Đối với thuật toán 1: Thuật toán cơ bản áp dụng khi toàn bộ dữ liệu
của mảng V[ ] và mảng p[ ] có thể chứa được trong toàn bộ bộ nhớ quy ước
(640KB). Trong trường hợp số phần tử của X lớn hơn khả năng chứa của bộ
nhớ này (ví dụ n ≈ 1.000.000), thì việc sắp xếp với dữ liệu đầu vào là dãy V[
] và p[ ] với số lượng n lớn thì khi đó chúng ta không thể áp dụng thuần túy
thuật giải cơ bản được, mà sẽ phải mở rộng thuật giải sắp xếp cho hai mảng
V[ ] và mảng p[ ].
Thuật giải mở rộng này chủ yếu liên quan đến cách thức tải dữ liệu từ file ra
bộ nhớ và sắp xếp. Ý tưởng chính sẽ là chia dãy V và p thành các dãy con
có độ dài MAXP (max length of part) thỏa mãn: bộ nhớ quy ước đủ chứa
toàn bộ mỗi dãy con. Khi đó, ta sẽ áp dụng thuật giải HeapSort cho các dãy
con này.
Đối với ý tưởng 2: Thuật toán có thể giải quyết được với số lượng lớn
của bộ dữ liệu đầu vào bằng việc xét từng phần tử. Tuy nhiên thuật toán sẽ
phải trả giá bằng độ phức tạp lớn hơn.
Nhận xét: Qua hai thuật toán xây dựng được thì việc giải quyết bài toán tùy
thuộc vào đặc thù bài toán cụ thể đặt ra, dữ liệu đầu vào ta có thể chọn thuật
Lê Văn Hợp – Cao học 25B – HTTT
12
Phân tích và đánh giá thuật toán
toán cho phù hợp. Xét về độ phức tạp của thuật toán thì thuật toán 1 xây
dựng được có độ phức tạp nhỏ hơn so với thuật toán 2.
3. Chứng minh tính đúng đắn
Sắp xếp tập p và V theo thứ tự tăng dần (không giảm).
Không mất tính tổng quát, giả sử theo thứ tự p(i), V(i), i=1…n là thứ tự sau
khi đã được sắp xếp.
Khi đó, ghép các cặp tương ứng p(i) với V(i) sẽ cho ta lời giải bài toán.
Chứng minh:
3.1. Xét các phương án phân phối áo với n =2 nghĩa là cho áo có kích
thước V(1),V(2) và học sinh có kích thước vai là p(1), p(2) và ta có độ
lệch.
d = max{|V(i)- p(π i)|, i=1,2}.
Ta có các độ lệch vai tương ứng như sau:
d1= max{|V(1)- p(1) |,|V(2)- p(2) |} và d2= Max{|V(2)- p(1) |,|V(1)- p(2) |}
Giả sử p(1) ≤ p(2) và V(1)≤ V(2) thì ta chứng minh được: d 1 ≤ d2 trong mọi
trường hợp.
TH1: p(1) ≤ p(2) ≤V(1) ≤ V(2)
− Nếu |V(2) - p(2)| ≤ |V(1) - p(1)| thì d1 = |V(1) - p(1)|
− Nếu |V(1) - p(1)| ≤ |V(2) - p(2)| thì d1= |V(2) - p(2)|
Ta có |V(1)- p(2) |≤|V(2)- p(2)|≤|V(2) - p(1)| d1 ≤ d2.
Vậy d1 ≤ d2.
TH2: p(1) ≤ V(1) ≤ p(2) ≤ V(2)
− Nếu |V(2)- p(2)|≤|V(1)- p(1)| thì d1=|V(1)- p(1)|
Ta có |V(1)- p(1)|≤|V(2)- p(1)| d1 ≤ d2.
− Nếu |V(1)- p(1)|≤|V(2)- p(2)| thì d1 = |V(2)- p(2)|
Ta có |V(2)- p(2)|≤|V(2)- p(1) | d1 ≤ d2.
Vậy d1 ≤ d2.
TH3: V(1) ≤ p(1) ≤ p(2) ≤ V(2)
Lê Văn Hợp – Cao học 25B – HTTT
13
Phân tích và đánh giá thuật toán
− Nếu |V(2) - p(2)|≤|V(1)- p(1)| thì d1= |V(1)- p(1)|
Ta có |V(1)- p(1)|≤|V(1)- p(2)| d1 ≤ d2.
− Nếu |V(1)- p(1)|≤|V(2)- p(2) | thì d1=|V(2)- p(2)|
Ta có |V(2)- p(2)|≤|V(2)- p(1)| d1d2.
Vậy d1 ≤ d2.
TH4: p(1) ≤ V(1)≤ V(2) ≤ p(2)
− Nếu |V(2)- p(2)|≤|V(1) - p(1)| thì d1=|V(1)- p(1)|
Ta có |V(1)- p(1)|≤|V(2)- p(1) | d1 ≤ d2.
− Nếu |V(1) - p(1)|≤|V(2) - p(2)| thì d1 =|V(2)- p(2)|
Ta có |V(2)- p(2)|≤|V(1)- p(2)| d1 ≤ d2.
Vậy d1 ≤ d2.
TH5: V(1)≤ p(1) ≤ V(2) ≤ p(2)
− Nếu |V(2) - p(2)|≤|V(1)- p(1)| thì d1=|V(1)- p(1)|
Ta có |V(1)- p(1)|≤|V(1)- p(2) | d1 ≤ d2.
− Nếu |V(1)- p(1) |≤|V(2)- p(2) | thì d1=|V(2)- p(2)|
Ta có |V(2)- p(2)|≤|V(1)- p(2) | d1 ≤ d2.
TH6: V(1) ≤ V(2)≤ p(1) ≤ p(2)
− Nếu |V(2)- p(2) |≤|V(1)- p(1)| thì d1=|V(1)- p(1)|
Ta có |V(1)- p(1)|≤|V(1)- p(2) | d1 ≤ d2.
− Nếu |V(1)- p(1)|≤|V(2)- p(2)| thì d1 = |V(2)- p(2)|
Ta có |V(2)- p(2)|≤|V(1)- p(2) | d1 ≤ d2.
Vậy d1 ≤ d2.
Nhận xét: Như vậy trong tất cả các trường hợp thì ta luôn được d1 ≤ d2.
3.2. Xét các phương án phân phối áo với n nghĩa là cho áo có kích thước
V(1),V(2)…V(n) và học sinh có kích thước vai là p(1), p(2),…,p(n) và
ta có độ lệch.
Gọi độ lệch của phương án sắp xếp hai mảng kích thước áo và kích
thước vai áo là d= max{|V(i)- p(i)|, k=1,n}=|V(k)-p(k)|.Giả sử tồn tại một
phương án phân phối áo khác mà cho ta giá trị d’= max{|V(i)- p(i)|,
k=1,n}=V(j)-p(j) nhỏ hơn d như vậy theo chứng minh trên thì chỉ V(k),V(j)
Lê Văn Hợp – Cao học 25B – HTTT
14
Phân tích và đánh giá thuật toán
và p(k),p(j) cùng tăng hoặc cùng giảm (V(k)≤ V(j) và p(k)≤p(j) hoặc V(j)≤
V(k) và p(j)≤p(k)). Mặt khác d’ là trường hợp khác không phải là trường
hợp được sắp xếp. vậy điều giả sử là sai. Như vậy phương pháp sắp xếp cho
ta lời giải tối ưu.
Việc chọn chiếc áo có kích thước nhỏ nhất cho người có kích thước
vai nhỏ nhất sẽ cho độ lệch nhỏ nhất mà học sinh có kích thước vai nhỏ nhất
có thể nhận đươc áo. Tiến hành tương tự cho đến hết n học sinh thì cho ta
một dãy các độ lệch kích thước áo và vai áo nhỏ nhất. Vì thế mà chọn giá trị
lớn nhất của các giá trị độ lệch ấy sẽ cho ta độ lệch phương án nhỏ nhất
nhận đươc.
Nhận xét: Vậy thuật toán đã xây dựng đúng đắn.
V.
ĐÁNH GIÁ, BÌNH LUẬN
1. Đánh giá thuật toán
− Input: Dữ liệu đầu vào của thuật toán là hai dãy số nguyên với kích
thước n được xác định trước, số n là một số nguyên không lớn hơn
1.000.000.
− Output: Dữ liệu đầu ra của thuật toán này là tìm được độ lệch và
phương án phân phối các áo.
− Tính xác định: Mỗi bước của thuật toán được thực hiện đơn giản và
chỉ bao gồm 3 phép toán: phép so sánh, phép gán và phép trừ. Đó là
các phép so sánh để sắp xếp các dãy số nguyên, tính độ lệch của
phương án sắp xếp.
− Tính khả khi: Các phép toán của thuật toán chỉ sử dụng phép gán,
phép so sánh và phép trừ trên tập số nguyên, đều là những phép toán
thông thường.
− Tính dừng: Dữ liệu vào là dãy số nguyên có kích thước n thì theo cả
thuật toán trình bày ở trên ta luôn đưa ra kết quả.
2. Độ phức tạp thuật toán
Trong thuật giải 1, Thuật toán gồm 2 bước chính là sắp xếp dãy số không
giảm (2 dãy) và so sánh giá trị phần tử thứ k của dãy 1 với phần tử thứ k của
dãy 2 (k =1,2,… n).
Lê Văn Hợp – Cao học 25B – HTTT
15
Phân tích và đánh giá thuật toán
Để giảm độ phức tạp của thuật toán, ta chọn phương pháp sắp xếp vun đống
(Heapsort) với số phép so sánh đối với mỗi dãy là = nlog2n
Ở bước so sánh có n cặp phần tử nên số phép so sánh là n.
Bảng thống kê các phép so sánh của từng dòng lệnh:
Dòng lệnh
Số phép so sánh
Số vòng lặp
Dòng 1
SortHeap
nlog2n
Dòng 2
SortHeap
nlog2n
Dòng 3
N
N
TỔNG CỘNG
Tổng phép so sánh
2nlog2n+n
Vậy độ phức tạp của thuật toán 1là O(nlog2n)
Trong thuật giải thuật 2, ta thấy rằng phép chủ yếu số phép so sánh đã
nhiều hơn.
Bảng thống kê các phép so sánh như sau:
Dòng lệnh
Số phép so sánh
Số vòng lặp
Tổng phép so sánh
while số 2
N
N
while số 3
N
N
if số 5
1
1
Số 7
n
TỔNG CỘNG
n*(2n+1)
Vậy độ phức tạp của thuật toán 2 là O(n2)
3. Bình luận
Qua 2 thuật toán xây dựng được, thì thuật toán 1 (sắp xếp) được cải thiện
về độ phức tạp tính toán hơn thuật toán số 2 (tham lam).
Lê Văn Hợp – Cao học 25B – HTTT
16
Phân tích và đánh giá thuật toán
VI.
THỬ NGHIỆM
1. Chương trình thử nghiệm
Chương trình thử nghiệm cài đặt trên ngôn ngữ C++.
Chương trình thử nghiệm gồm:
− File mã nguồn chương trình: PhanPhoiAo.dev
− File chạy chương trình: PhanPhoiAo.exe
− Các file dữ liệu đầu vào được tạo sẵn để thử nghiệm: 10.txt, 20.txt,
50.txt, 100.txt, 500.txt, 1000.txt, 10000.txt, 100000.txt
Cách chạy chương trình như sau:
− Chạy file PhanPhoiAo.exemàn hình chương trình như sau:
Lê Văn Hợp – Cao học 25B – HTTT
17
Phân tích và đánh giá thuật toán
− Chọn chức năng: Nhấn phím 1 để phân phối áo dựa trên 1 file lưu
trữ kích thước vai áo và kích thước vai học sinh có sẵn bằng thuật
toán 1 (*.txt).
− Chọn chức năng:Nhấn phím 2 phân phối áo dựa trên thuật toán 1 cho
bộ dữ liệu ngẫu nhiên với kích thước được nhập từ bàn phím.
− Chọn chức năng:Nhấn phím 3 để phân phối áo dựa trên 1 file lưu trữ
kích thước vai áo và kích thước vai học sinh có sẵn bằng thuật toán 2
(*.txt).
− Chọn chức năng:Nhấn phím 4 phân phối áo dựa trên thuật toán 2 cho
bộ dữ liệu ngẫu nhiên với kích thước được nhập từ bàn phím.
− Chọn chức năng: Nhấn phím 5 để thoát chương trình.
2. Các ví dụ thử nghiệm
Trong các ví dụ thử nghiệm, nếu cho dãy đầu vào là X1, X2, … Xn trong các
file *.txt có cấu trúc sau:
− Dòng đầu tiên: Số phần tử n
− Dòng tiếp theo là các giá trị V[1],p[1] các giá trị cách nhau bởi dấu
cách.
− Các dòng tiếp theo là các giá trị V[i],p[i]; i = 2,3, … n.
Cách phân phối áo sẽ được in ra màn hình và độ lệch của phân phối áo đó
cùng thời gian thực hiện.
Môi trường thử nghiệm:Intel® Core ™ i5, 8GB RAM, Windows 7 x64.
Chọn chức năng: 1
-
File: 20.txt (Thời gian chạy 19ms)
Lê Văn Hợp – Cao học 25B – HTTT
18
Phân tích và đánh giá thuật toán
Chọn chức năng: 1
-
File: 100.txt (Thời gian chạy 152ms)
Lê Văn Hợp – Cao học 25B – HTTT
19
Phân tích và đánh giá thuật toán
Lê Văn Hợp – Cao học 25B – HTTT
20
Phân tích và đánh giá thuật toán
Chọn chức năng: 1
-
File: 100000.txt (Thời gian chạy 46220ms)
Lê Văn Hợp – Cao học 25B – HTTT
21
Phân tích và đánh giá thuật toán
Chọn chức năng: 2
-
Nhập 20 (Thời gian chạy 18ms)
Lê Văn Hợp – Cao học 25B – HTTT
22
Phân tích và đánh giá thuật toán
Chọn chức năng: 2
-
Nhập 100 (Thời gian chạy 150ms)
Lê Văn Hợp – Cao học 25B – HTTT
23
Phân tích và đánh giá thuật toán
Lê Văn Hợp – Cao học 25B – HTTT
24
Phân tích và đánh giá thuật toán
Chọn chức năng: 2
-
Nhập 100000 (Thời gian chạy 40963ms)
Lê Văn Hợp – Cao học 25B – HTTT
25