Tải bản đầy đủ (.docx) (9 trang)

Bai tap va thuc hanh 6

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 (128.95 KB, 9 trang )

<span class='text_page_counter'>(1)</span>TRƯỜNG ĐẠI HỌC KHOA HỌC HUẾ KHOA CÔNG NGHỆ THÔNG TIN. BÀI TẬP MÔN: PHÂN TÍCH THIẾT KẾ THUẬT TOÁN. LỚP: KHMT_PY. 2016-2018 Nhóm 3: 1. Phan Phú Bình 2. Đào Hà An Duyên 3. Lê Trọng Đãi (nhóm trưởng) 4. Nguyễn Ngọc Thiện.

<span class='text_page_counter'>(2)</span> PHẦN I: Tìm hiểu về quy hoạch động Trong thực tế, ta thường bắt gặp những bài toán yêu cầu kết quả tốt nhất (bài toán tối ưu). Phương pháp quy hoạch động dùng để giải bài toán tối ưu có bản chất đệ quy, tức là việc tìm phương án tối ưu cho bài toán đó có thể đưa về tìm phương án tối ưu của một số hữu hạn các bài toán con. Đối với nhiều thuật toán đệ quy, nguyên lý chia để trị (divide and conquer) thường đóng vai trò chủ đạo trong việc thiết kế thuật toán: Để giải quyết một bài toán lớn, ta chia nó làm nhiều bài toán con cùng dạng với nó để có thể giải quyết độc lập. Trong phương pháp quy hoạch động, nguyên lý này càng được thể hiện rõ: Khi không biết cần phải giải quyết những bài toán con nào, ta sẽ đi giải quyết tất cả các bài toán con và lưu trữ những lời giải hay đáp số của chúng với mục đích sử dụng lại theo một sự phối hợp nào đó để giải quyết những bài toán tổng quát hơn. 1. Nội dung phương pháp quy hoạch động: Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quyết những bài toán lớn hơn, cho tới khi giải được bài toán lớn nhất (bài toán ban đầu). 2. Các khái niệm: * Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy hoạch động; * Công thức phối hợp nghiệm của các bài toán con để có nghiệm của bài toán lớn gọi là công thức truy hồi của quy hoạch động; * Tập các bài toán nhỏ nhất có ngay lời giải để từ đó giải quyết các bài toán lớn hơn gọi là cơ sở quy hoạch động; * Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp chúng gọi là bảng phương án của quy hoạch động; Để hiểu rõ hơn về các khái niệm, ta đi tìm hiểu 1 ví dụ rất đơn giản sau: Ví dụ: Dãy Fibonacci là dãy số nguyên dương được định nghĩa như sau: F[1] = F[2] = 1; ∀ i: 3 ≤ i: F = F[i-1] + F[i-2] Hãy tính F[6] Lời giải bằng phương pháp QHĐ: program Fibonacci; var F: array[1..6] of Integer; i: Integer; begin F[1] := 1; F[2] := 1; for i := 3 to 6 do F[i] := F[i - 1] + F[i - 2];.

<span class='text_page_counter'>(3)</span> Writeln(F[6]); end. Trong ví dụ trên: tính F[6] là bài toán lớn, các bài toán con là tính F[1] đến F[5]; F[1] và F[2] là cơ sở quy hoạch động, chúng đã có sẵn kết quả nên ta không cần đi tính; mảng F lưu trữ các kết quả là bản phương án; công thức F := F[i - 1] + F[i - 2] là công thức truy hồi; 3. Các bước cài đặt một chương trình sử dụng quy hoạch động: * Giải tất cả các bài toán cơ sở (thông thường rất dễ), lưu các lời giải vào bảng phương án; * Dùng công thức truy hồi phối hợp những lời giải của những bài toán nhỏ đã lưu trong bảng phương án để tìm lời giải của những bài toán lớn hơn và lưu chúng vào bảng phương án. Cho tới khi bài toán ban đầu tìm được lời giải. * Dựa vào bảng phương án, truy vết tìm ra nghiệm tối ưu; Chú ý: Cho đến nay, vẫn chưa có một định lý nào cho biết một cách chính xác những bài toán nào có thể giải quyết hiệu quả bằng quy hoạch động. Tuy nhiên để biết được bài toán có thể giải bằng quy hoạch động hay không, ta có thể tự đặt câu hỏi: "Một nghiệm tối ưu của bài toán lớn có phải là sự phối hợp các nghiệm tối ưu của các bài toán con hay không ?" và ”liệu có thể nào lưu trữ được nghiệm các bài toán con dưới một hình thức nào đó để phối hợp tìm được nghiệm bài toán lớn". PHẦN II: Xây dựng và cài đặt bài toán bằng quy hoạch động BÀI TẬP: Bài toán tìm độ dài xâu trong chung cực đại của 2 xâu cho trước. 1. Nêu bài ý nghĩa bài toán: a. Bài toán xâu trong cực đại, gọi S là xâu trong của X nếu S nhận được bằng cách xóa đi một số ký từ nào đó. Ví dụ: xâu 'ABC' là xâu trong của 'GAHEBOOC' bằng cách xóa đi các ký tự GHEOO của xâu 'GAHEBOOC'. b. Bài toán thực hiện: Cho 2 xâu X và Y. Tìm một xâu U là xâu trong chung của X và Y có độ dài cực đại. Ví dụ: X='ABCDAE' và Y='XYACADK' có xâu 'ACD' là xâu trong với đội dài cực đại. Ví dụ: X='ABC' và Y='ACB' có xâu 'AB' là xâu trong với đội dài cực đại. Ta có thông tin vào và thông tin ra của bài toán: +Input: Hai xâu X, Y +Output: U là xâu trong chung cực đại của (X,Y).

<span class='text_page_counter'>(4)</span> 2. Phương pháp thực hiện giải bài toán: Sử dụng phương pháp quy hoạch động với 4 bước cụ thể như sau: Bước 1: Phân tích bài toán -Gọi P(r, s) là bài toán xâu trong chung cực đại, với: Xâu X= ' X1, X2, ..........................., Xm' (với m = Length(X)); Xâu Y= ' Y1, Y2, ..........................., Yn' (với n = Length(X)); (Bài toán ban đầu là P(m, n) -Gọi F(r, s) độ dài xâu trong chung cực đại với: r: Độ dài xâu X tính từ ký tự đầu tiên (r  m) s: Độ dài xâu Y tính từ ký tự đầu tiên (s  n) - Các gía trị cần tìm : F(r, s) độ dài xâu trong chung cực đại của bài toán P(r,s) U là xâu con chung cực đại của bài toán P(r,s) Bước 2: Giải pháp đệ quy. +trường hợp chung: X= ' X1, X2, ...............Xr ............, Xm' (với m = Length(X)); r Y= ' Y1, Y2, ................Ys ..........., Yn' (với n = Length(X)); s - Khi (r>0) và (s>0) và (Xr <> Ys) Thì F(r,s) = Max (F(r-1, s), F(r, s-1)) -Khi (r>0) và (s>0) và (Xr = Ys) Thì F(r,s) = 1+ F(r-1, s-1) +Trường hợp suy biến -Khi (r=0) hoặc (s=0) Thì F(r,s) = 0 {một trong 2 xâu cho là rỗng thì độ dài xâu trong chung cực đại bằng 0, U=''}. Bước 3: Lập bảng Nhận xét: - Ta nhận thấy nếu Xr = Ys lúc xâu con chung cực đại U của X và y có thể tính bằng xâu con chung cực đại U của Xr-1 và Ys-1 đồng thời nối Xr vào cuối, tức là U=U + Xr - Nếu X<>Y, lúc này chi U1 là độ dài xâu chung cực đại của Xr-1 và Ys , và U2 là độ dài xâu chung cực đại của Xr và Ys-1. vậy U sẽ là giá trị lớn nhất trong 2 giá trị U1 và U2 0 Nếu r=0 hoặc s=0 F[r,s] 1+F[r-1,s-1] Nếu Xr = Ys Max(F[r-1,s], F[r,s-1] Nếu Xr <> Ys.

<span class='text_page_counter'>(5)</span> -Độ phức tạp thuật toán là O(m*n) Ví dụ: Xâu 'ABC' và 'ACB' có xâu con dài nhất là AB và AC A B C 0 0 0 0 A 0 A 0 0 PROCEDURE LapBang; Var C 0 0 0 C r,s:Integer; Begin B 0 0 B 0 For r:=0 To m Do For s:=0 To n Do if (r=0) or (s=0) then begin F[r,s]:=0; u:=''; end Else If X[r] = Y[s] Then Begin F[r,s]:=F[r-1,s-1]+1; u:=X[r]; end Else F[r,s]:=Max(F[r-1,s], F[r,s-1] End; Bước 4: Tổng hợp kết quả Để tìm xâu kết quả U: ta đi ngực từ ô F[m,n] hướng về ô F[0,0] -Nếu Xr = Ys thì đặt Xr hoặc Ys vào bên trái dãy U (ở đầu xâu) và về ô F[r-1, s-1] -Nếu Xr <> Ys thì + lùi về F[r-1,s] trong trường hợp F[r-1,s] > F[r,s-1], ngược lại + lùi về F[r,s-1] trong trường hợp F[r-1,s] < F[r,s-1], PROCEDURE Tonghop; var r,s:integer; Begin u:=''; r:= m; s:= n; While (r>0) And (s>0) Do Begin If X[r] = Y[s] Then Begin u:= X[r]+u; r:=r-1; s:=s-1; End Else If F[r-1,s] < F[r,s-1] then s:=s-1 Else.

<span class='text_page_counter'>(6)</span> r:=r-1; End; Writeln(f,'do dai xau trong chung cuc dai la:', length(U)); Writeln(f,'xau trong chung cuc dai la:', U); Close(f); End; Độ phức tạp O(max(m,n)). 3. Cài đặt thuật toán Bài toán này nhóm thống nhất cài đặt thuật toán gồm 5 phần được mô tả như sau: Khai báo tên chương trình: Program XauconCD; Khai báo: . 2 xâu dữ liệu vào X, Y và xâu U là xâu trong chung cực đại . Khai báo mảng 2 chiều F: là độ dài xâu trong chung cực đại . 2 biến m, n là độ dài của xâu X, Y. a. Dùng thủ tục nhập dữ liệu: .Khai báo biến tệp f nhận từ tập tin đầu vào xaucon.inp; .Đọc xâu X, Y từ tệp dữ liệu vào f; .gán 2 biến m, n cho độ dài xâu X, Y; b. Dùng thủ tục Lập bảng. c. Dùng thủ tục Tổng hợp. d. Dùng thủ tục xuất tệp kết quả .Khai báo biến tệp f cần gán cho tệp xaucon.out .Đọc tệp f và xuất kết quả: dòng đầu tiên độ dài xâu trong chung cực đại; dòng thứ hai là xâu trong chung cực đại. e. Chương trình chính gọi các thủ tục.. Cài đặt Program XauconCD; Var X,Y,U: String; F:Array [0..100,0..100] of Integer;.

<span class='text_page_counter'>(7)</span> m, n: integer;. PROCEDURE NhapDL; Var f:Text; Begin assign(f,'xaucon.inp'); reset(f); readln(f,X); readln(f,Y); close(f); m:=length(X); n:=length(Y); End;. PROCEDURE LapBang; Var r,s:Integer; Begin For r:=0 To m Do For s:=0 To n Do if (r=0) or (s=0) then begin F[r,s]:=0; u:=''; end Else If X[r] = Y[s] Then Begin F[r,s]:=F[r-1,s-1]+1; u:=X[r]; end Else If F[r-1,s] > F[r,s-1] then begin F[r,s]:=F[r-1, s]; end else begin F[r,s]:=F[r, s-1]; end; End;. PROCEDURE Tonghop; var r,s:integer; Begin u:=''; r:= m; s:= n; While (r>0) And (s>0) Do Begin.

<span class='text_page_counter'>(8)</span> If X[r] = Y[s] Then Begin u:= X[r]+u; r:=r-1; s:=s-1; End Else If F[r-1,s] < F[r,s-1] then s:=s-1 Else r:=r-1; End; End;. PROCEDURE XuatFile; Var f:Text; Begin assign(f,'xaucon.out'); rewrite(f); writeln(f,length(u)); write(f,u); close(f); End;. BEGIN NhapDL; LapBang; Tonghop; XuatFile;. END. --------------------------------------------------------------------------------------. Các bộ Test Test 1 Xaucon.inp ABCDAE XYACADK. Xaucon.out 3 ACD.

<span class='text_page_counter'>(9)</span> Test 2 Xaucon.inp ABC ACB. 2 AB. Test 3 Xaucon.inp MONZPLQCW AMOPHQBOOBWH. Xaucon.out 5 MOPQW. Xaucon.out.

<span class='text_page_counter'>(10)</span>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×