Tải bản đầy đủ (.doc) (16 trang)

Tiểu luận môn phân tích và đánh giá thuật toán phương pháp quy hoạch động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (154.68 KB, 16 trang )

Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

MỤC LỤC
TÀI LIỆU THAM KHẢO..........................................................................16

HV: Bùi Đức Giang

-1-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

MỞ ĐẦU
Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị
hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ
một trạng thái ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ
dẫn đến kết quả sau cùng như đã dự đoán. Nói cách khác, thuật toán là một bộ
các quy tắc hay quy trình cụ thể nhằm giải quyết một vấn đề trong một số bước
hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của các dữ kiện đưa
vào.
Phân tích và thiết kế thuật toán là một lĩnh vực quan trọng của khoa học
máy tính. Quá trình phân tích thuật toán sẽ giúp ta hiểu sâu sắc được mục đích,
yêu cầu mà thuật toán cần xây dựng, qua đó có thể tiên liệu được các tài nguyên
mà thuật toán yêu cầu như: tài nguyên bộ nhớ, băng thông, hoặc các tài nguyên
ngoại vi… Song phần chính thời gian tính toán mới là yếu tố quan trọng mà ta


cần quan tâm và đánh giá khi thuật toán thực hiện.
Trong bài viết tiểu luận này trình bày về phương pháp vét cạn, và quy
hoạch động, áp dụng cho bài toán tính tổng độ dài của các đoạn thẳng là lớn
nhất sao cho đôi một không có điểm chung.
Trong quá trình trình bày không tránh khỏi những thiếu sót, rất mong
nhận được sự đóng góp ý kiến quý báu của Thầy giáo và các bạn.
Em xin trân thành cảm ơn Thầy giáo Đào Thanh Tĩnh, đã tạo điều kiện
thuận lợi để em hoàn thành bài tập này.

HV: Bùi Đức Giang

-2-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

PHẦN 1: PHÂN TÍCH BÀI TOÁN
1. Đề bài
Mỗi đoạn thẳng trên trục Ox được mô tả bới hai giá trị [a, b]. Kí
hiệu S là tập hợp n đoạn thẳng S = { [ai,bi], i = 1,2,...,n}. Xây dựng thuật
toán tìm tập S*⊆ S sao cho các đoạn thẳng trong S* đôi một không có điểm
chung mà có tổng độ dài các đoạn thẳng là lớn nhất.
2. Phân tích
a. Dữ liệu đầu vào và đầu ra (input, output)
- Dữ liệu đầu vào (Input): Đầu vào là tập S gồm n đoạn thẳng trên
trục Ox được mô tả bởi 2 giá trị a,b; a là điểm đầu, b là điểm cuối của

đoạn thẳng.
- Dữ liệu đầu ra (Output): Tập kết quả S* chứa các đoạn thẳng trong
đó với hai đoạn thẳng Si, Sj bất kỳ trong tập S* không có điểm chung và
có tổng độ dài các đoạn thẳng là lớn nhất.
* Nhận xét:
- Mỗi đoạn thẳng nếu có xuất hiện, chỉ xuất hiện một lần trong S *
- Trong tập S*, các đoạn thẳng phải đôi một không có điểm chung
- Số lượng các đoạn thẳng trong kết quả trả về không quan trọng mà
quan trọng là tổng độ dài là lớn nhất.
Như vậy chúng ta quan tâm đến hai yếu tố: Là các đoạn thẳng có
điểm chung hay không, và tổng độ dài các đoạn thẳng không có điểm
chung đó.
b. Vị trí tương đối của 2 đoạn thẳng
Với 2 đoạn thẳng bất kỳ trên trục Ox, để đơn giản ta sắp xếp chúng
theo chiều tăng của b i , giả sử có 2 đoạn thẳng [ai,bi] và [aj,bj] với bi<=bj ta
có các vị trí tương đối như sau:
TH1 : Hai đoạn thẳng có điểm chung khi
- aj<=bi

HV: Bùi Đức Giang

-3-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh


- Như vậy ta quy ước: nếu aj=bi thì coi như 2 đoạn thẳng đó có 1 điểm
chung, tức là trong trường hợp này không thoã mãn yêu cầu bài toán.
TH2: Hai đoạn thẳng không có điểm chung khi
- aj>bi

HV: Bùi Đức Giang

-4-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

PHẦN 2: GIẢI QUYẾT BÀI TOÁN
Với dữ liệu bài toán đã cho, số luợng các đoạn thẳng là hữu hạn, ta
hoàn toàn tính được tất cả các tập S* (các tập chứa các đoạn thẳng trong S
không có điểm chung) có thể có và tìm ra được tập tập S* có tổng độ dài
các đoạn thẳng là lớn nhất.
1. PHƯƠNG PHÁP VÉT CẠN
1.1. Ý tưởng
Quy ước xâu ký tự chứa n bít 0,1 tương ứng với n đoạn thẳng. Bít thứ
i ứng với đoạn thẳng thứ i, là bít 0 nếu đoạn thẳng i không được chọn vào
tập S*, là bít 1 nếu đoạn thẳng i được chọn vào tập S*.
Xét với từng xâu ký tự:
- Nếu tồn tại một cặp bít i, j làm cho đoạn thẳng thứ i và thứ j có
điểm chung thì phương án này không được chọn.
- Ngược lại với mọi đoạn thẳng thứ i và thứ j bất kỳ không có điểm

chung ta sẽ đưa vào tập phương án được chọn.
Trong các tập phương án được chọn phương án nào có tổng độ dài
của các đoạn thẳng lớn nhất là kết quả ta cần tìm.
1.2. Thuật toán
Ta ký hiệu di là độ dài đoạn thẳng [a i, bi ],
Ta gọi các xâu Ui (nhị phân có độ dài n) là phương án thứ i chọn các đoạn
thẳng trong tập n đoạn thẳng.
- Bước 1. Sắp xếp các đoạn thẳng S i theo chiều tăng dần của a i.
- Bước 2: Tìm các phương án Ui thoã mãn đièu kiện thứ nhất đôi một
các đoạn thẳng không có điểm chung.
- Bước 3. Tính độ dài tổng T i các đoạn thẳng được chọn với mỗi
phương án Ui được chọn ở bước 2. Nếu xâu Ui không được chọn ở
bước 2 thì T i = 0.
- Bước 4. Tìm giá trị lớn nhất trong tập T i , T k = max {T i , i=0, 1, 2 n-1}.
- Bước 5. Khi đó ứng với các đoạn thẳng được chọn trong phương án
thứ k tương ứng với giá trị max chính là kết quả cần tìm kiếm. (Các
đoạn thẳng được chọn là những đoạn thẳng mà các bít tương ứng
trong T k bằng 1, tổng độ dài lớn nhất có được là T k).
HV: Bùi Đức Giang

-5-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

1.3.Đánh giá

- Ưu điểm:
o Phương án này dễ thực hiện.
o Bài toán chuyển thành 2 bài toán con:
 bài toán tìm xâu Ui thoã mãn yêu cầu bài toán. Với bài
toán này cần xét đôi một các đoạn thẳng có điểm chung
hay không.
 bài toán tìm max của n phần tử, đây là bài toán đơn giản.
- Nhược điểm:
o Tổng số các trường hợp phải xét là rất lớn. Với xâu nhị phân có
độ dài n ta phải xét 2 n -1 trường hợp (Trừ trường hợp tất cả các
bít bằng 0). Thuật toán có độ phức tạp tính toán lớn cỡ hàm mũ
O(2 n)

HV: Bùi Đức Giang

-6-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

2. PHƯƠNG PHÁP QUY HOẠCH ĐỘNG
2.1 Tư tưởng
Quy hoạch động là kỹ thuật thiết kế bottom-up (từ dưới lên). Kỹ
thuật này được bắt đầu với những trường hợp con nhỏ nhất (thường là đơn
giải nhất và giải được ngay). Bằng cách tổ hợp các kết quả đã có (không
phải tính lại) của các trường hợp con, sẽ đạt đạt tới kết quả của trường hợp

có kích thước lớn dần lên và tổng quát hơn, cho đến khi cuối cùng đạt tới
lời giải của trường hợp tổng quát nhất. Với bài toán này ta hoàn toàn có
thể giải được bằng phương pháp quy hoạch động.
2.2 Phân tích bài toán
- Để đơn giản thuật toán ta tiến hành sắp xếp các đoạn thẳng trong S
theo chiều không giảm của các b i (tức là {b 1≤b2 ≤b 3≤…≤b n-1 ≤b n}, nếu
bi=bj , thì a i ≤aj với i- Xét ví dụ sau:

HV: Bùi Đức Giang

-7-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

Giả sử ta có 10 đoạn thẳng sau khi đã sắp xếp.
Ta thấy rằng giả sử đang xét đến đoạn thẳng 5: Nếu ta lấy đoạn 5 vào
tập kết quả thì các đoạn 4,3,2 sẽ không thể tồn tại trong tập kết quả,… cứ
như vậy ta sẽ phải xét xem những đoạn nào gần nhất trong tập những đoạn
thẳng đã xét trước đó phải có điểm kết thúc nhỏ hơn điểm bắt đầu của đoạn
thẳng đang xét thì khi đó đoạn thẳng đang xét mới được đưa vào tập kết
quả được.
Để giải quyết vấn đề này ta xây dựng một mảng index, trong đó
index(j) lưu chỉ số lớn nhất của các đoạn thẳng từ 1..j-1 mà có thể kết hợp
với đoạn j.

Với ví dụ hình trên thì ta có các index(j) như sau:
index(1):=0 {trước đó không có đoạn thẳng nào có điểm kết thúc nhỏ hơn
hoặc bằng điểm bắt đầu của đoạn 1};
Tương tự như vậy ta tính được: index(2):=0; index(3):=0; index(4):=3;
index(5):=2;
index(6):=3;
index(7):=5;
index(8):=6;
index(9):=6;
index(10):=8;
Gọi L(j) là tổng độ dài lớn nhất của các đoạn thẳng khi xét đến đoạn
thẳng thứ j (1,2,…,j). Khi đó có các 2 trường hợp sau:
Trường hợp 1: Đoạn thẳng j được chọn vào tập S*.
Khi đó, ta có:
- S* không chứa các đoạn thẳng {index(j)+1,index(j)+2,…, j-1}: vì
index(j) là chỉ số lớn nhất của các đoạn thẳng từ 1..j-1 mà có thể kết hợp
với đoạn j. Do đó các đoạn thẳng {index(j)+1,index(j)+2,…, j-1} không thể
kết hợp với đoạn j.
- S* có thể chứa các đoạn thẳng 1,2..index(j).
Khi đó: L(j)=(b j -aj ) + L(index(j)) với a j ,bj là toạ độ điểm đầu và điểm cuối
của đoạn thẳng thứ j.
Trường hợp 2: Đoạn thẳng j không được chọn vào tập S*.
Kết quả sẽ quay về trường hợp xét tới đoạn j-1, hay L(j)=L(j-1).
2.3 Thuật toán
- Sắp xếp các đoạn thẳng trong S theo chiều không giảm của các b i
(tức là {b 1≤b2 ≤b 3≤…≤b n-1 ≤b n}, nếu b i=bj , thì a i ≤aj với i- Đặt d[1..n] là mảng lưu độ dài n đoạn thẳng (sau khi các đoạn thẳng
được sắp xếp).
HV: Bùi Đức Giang


-8-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

- Gọi L(j) là tổng độ dài lớn nhất khi xét đến j đoạn thẳng đầu tiên
thoã mãn yêu cầu bài toán.
- Công thức quy hoạch động để tính L(j):
o L(0)=0.
o L(1) = d(1) = 0+d(1).
o Công thức tổng quát khi xét đến đoạn thẳng thứ j là:
0, j = 0

L( j ) = 
 max{ d ( j ) + L(index( j )), L( j − 1)} , j > 0

- Đáp án của bài toán là L(n)
- Công việc tiếp theo là truy hồi để tìm tập các đoạn thẳng thoả mãn
đầu bài là S* :
Nếu d(j)+L(index[j])>L[j-1] thì đoạn thẳng j được chọn.
Ngược lại đoạn j không được chọn.
2.4 Xét ví dụ cụ thê

Bảng index(j)
J
index(j)


1
0

2
0

3
0

4
3

5
2

6
3

7
5

8
6

9
6

10
8


Bảng d(j)
HV: Bùi Đức Giang

-9-

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

j
d(j)

GVHD – PGS-TS Đào Thanh Tĩnh

1
2

2
2

3
3

4
1

5
4


6
2

7
2

8
1

9
2

10
3

1
0
2
2

2
0
2
2

3
0
3
3


4
3
1
4

5
2
4
6

6
3
2
6

7
5
2
8

8
6
1
8

9
6
2
8


10
8
3
11

1
0
2
2

2
0
2
2

3
0
3
3

4
3
1
4

5
2
4
6


6
3
2
6

7
5
2
8

8
6
1
8

9
6
2
8

10
8
3
11

Bảng L(j)
j
index(j)
d(j)

L(j)
Truy hồi:
j
index(j)
d(j)
L(j)

1. d(10)+L(index[10])=3+6=9>L[9]=7 vậy đoạn 10 được chọn,
Index[10]=8, xét đoạn 8
2. d(8)+L(index[8])=1+5=6< L[7]=8 vậy đoạn 8 không được chọn, xét tiếp
đoạn 7
3. d(7)+L(index[7])=2+6=8>L[6]=5 vậy đoạn 7 được chọn, L(index[7])=5,
xét tiếp đoạn 5
4. d(5)+L(index[5])=4+2=6>L[4]=5 vậy đoạn 5 được chọn, L(index[5])=2,
xét tiếp đoạn 2
5. d(2)+L(index[2])=2+0=2=L[1]=2 vậy đoạn 2 không được chọn, xét tiếp
đoạn 1
6. d(1)+L(index[1])=2+0=2>L[0]=0 vậy đoạn 1 được chọn.
Như vậy L(10) = 11 và S* ={đoạn 10, đoạn 7, đoạn 5, đoạn 1}. Đây
là 1 phương án tối ưu của bài toán.
2.5 Cụ thê giải thuật
Khai báo:
const static char fileoutput[] = "output.txt"; //{File ket qua dau ra }
const static char fileinput[] = "input.txt";//{File du lieu vao }
const static int MAX = 5000;
- Định nghĩa cấu trúc đoạn thẳng
struct doanthang
{
HV: Bùi Đức Giang


- 10 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

long a;
long b;

GVHD – PGS-TS Đào Thanh Tĩnh

// Toa do diem dau
// Toa do diem cuoi

};
- Khai báo mảng chứa các đoạn thẳng
typedef struct doanthang Listdoanthang[MAX];
Listdoanthang S, S_output; danh sách các đoạn thẳng đầu vào và đầu ra.
index[0..n]: lưu chỉ số lớn nhất của các đoạn thẳng từ 1..j-1 mà có thể kết
hợp với đoạn j.
long d[1..n]; lưu độ dài của các đoạn thẳng
a. Giải thuật tính các giá trị index(i):
for (i=0;i<= sodoanthang;i++)
index[i]=0;
for (i=1;i<=sodoanthang;i++)
{
j=i-1;
while ((j>0)&&(S[j].b>=S[i].a))
j--;

index[i]=j;
}
Số phép so sánh nhiều nhất: 2(1+2+…+n)=n(n+1)
Độ phức tạp: O(n 2 )
b. Giải thuật tính L(j)
void Quyhoachdong()
{
L[0]=0;
for(int j=1;j<=sodoanthang;j++)
L[j]=max(d[j]+L[index[j]],L[j-1]);
}
Độ phức tạp: O(n)
c. Giải thuật truy hồi tìm phương án tối ưu cho bài toán
void Truyhoi(int j)
{
if (j>0)
{
if ((d[j]+L[index[j]])>L[j-1]) // neu doan j duoc chon
HV: Bùi Đức Giang

- 11 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

{

k++; // luu so doan thang duoc chon
S_output[k].a= S[j].a;
S_output[k].b= S[j].b;
file_out << S[j].a << " " << S[j].b << "\n";
cout << S[j].a << " " << S[j].b << "\n";
Truyhoi(index[j]);
}
else // neu doan thang j khong duoc chon
Truyhoi(j-1);
}
}
Độ phức tạp: O(n)
d. Giải thuật tổng thể giải quyết bài toán
A. Đọc thông tin các đoạn thẳng từ file dữ liệu đầu vào (input.txt) và
sắp xếp theo chiều không giảm của b (b i ) và a (a i) bằng hàm
ReadData(int& n, Listdoanthang& arr)
C. Tính độ dài của các đoạn thẳng
For j:=1 to N do
d[j]:=S[j].b-S[j].a;
D. Tính index(j);
E. Quyhoachdong();
F. Truyhoi();
2.6 Đánh giá độ phức tạp theo phương pháp quy hoạch động
1. Sắp xếp tập các đoạn thẳng theo chiều không giảm của b và a. Độ
phức tạp: tồi nhất là O(n 2), tốt nhất là O(nlogn).
2. Tính các giá trị index(j), j=1..n: Độ phức tạp O(n 2) {Sau khi đã sắp
xếp}
3. Tính các L(j), j=1..n: với mỗi lần gọi mất O(1) => tổng cộng tối đa
trong thuật toán này là: O(n).
4. Tìm truy vấn lại các đoạn thẳng đã chọn vào S_output: tối đa là O(n).

Như vậy độ phức tạp toàn bộ thuật toán là O(n).
2.7 Test thử các bộ dữ liệu khác nhau
a. Dữ liệu chỉ có 1 đoạn thẳng
HV: Bùi Đức Giang

- 12 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

b. Dữ liệu có nhiều đoạn thẳng có điểm chung

HV: Bùi Đức Giang

- 13 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

c. Dữ liệu gồm các đoạn thẳng rời nhau

d. Dữ liệu gồm các đoạn thẳng bao nhau nhiều


Nhận thấy, các ví dụ test trên chương trình đều cho kết quả đúng.

HV: Bùi Đức Giang

- 14 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán

GVHD – PGS-TS Đào Thanh Tĩnh

KẾT LUẬN
- Với thuật toán vét cạn thì ta thấy độ phức tạp của bài toán là O(2 n ).
Tổng tất cả các khả năng của bài toán là 2 n-1 trường hợp ứng với mỗi
dãy nhị phân có độ dài n.
- Với phương pháp quy hoạch động thì bài toán trở nên rõ ràng và
khắc phục được các nhược điểm của thuật toán vét cạn với độ phức
tạp là O(n 2 ).

HV: Bùi Đức Giang

- 15 -

Lớp CHKHMT25B13


Bài tập môn Phân tích và đánh giá thuật toán


GVHD – PGS-TS Đào Thanh Tĩnh

TÀI LIỆU THAM KHẢO





vi.wikipedia.org/wiki/Quy_hoạch_động
Bài giảng phân tích đánh giá thuật toán - Đào Thanh Tĩnh
INTRODUCTION TO ALGORITHMS by Thomas H. Cormen,
Charles E. Leiserson, and Ronald L. Rivest
CROCHEMORE, M., RYTTER, W., 1994, Text Algorithms, Oxford
University Press.

HV: Bùi Đức Giang

- 16 -

Lớp CHKHMT25B13



×