Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
403,11 KB
Nội dung
ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC TIỂU LUẬN MƠN PHÂN TÍCH THIẾT KẾ THUẬT TỐN Huế, 2015 Bài 1: So sánh độ phức tạp O() O() Áp dụng quy tắc L’Hopital, ta có = ()’= ()’= = = = ==0 Vậy O()< O() Bài 2: Viết chương trình tính tích ma trận Vào: Amxn; Bnxl Ra Cmxl= AXB Từ cho biết độ phức tạp thuật toán Procedure MTT(var c:matran; var m,l:byte); Var i,j,k:byte; Begin For i:=1 to m For j:=1 to l Begin C[i,j]:=0; For k:=1 to n C[i,j]:= C[i,j]+ A[i,k]* B[k,j]; End; End; Độ phức tạp: O(nml) phép * làm nxmxl lần Bài 3: Tính an theo cách có độ phức tạp O(1) Gọi x= an lnx = ln an = n.lna Đặt n.lna = b Ta có: lnx = b => x = eb Vậy: x = en.lna = exp(n.lna) * Nếu a > an = exp(n.lna) * Nếu a = n an = * Nếu a < xét trường hợp: + Nếu n chẵn an = exp(n.ln(-a)) + Nếu n lẽ an = - exp(n.ln(-a)) Vậy độ phức tạp an = O(1) Bài 4: Xét dãy số nguyên a[1], a[2], …, a[n] (n x TKNP:=TKNP(d,giua-1,x); + Trường hợp suy biến: - Nếu d > c: TKNP:=0 - Nếu a[giua] = x TKNP:= giua + Độ phức tạp thuật toán: O(logn) Type mang=array[1 100] of integer; Var n,x,i:integer; a:mang; function tim(A:mang;x,vt1,vt2:integer):integer; var giua:integer; begin giua:=(vt1+vt2) div 2; if a[giua]=x then exit(giua); if vt1>vt2 then exit(0); if a[giua]0 then if x = a[n] then begin n:=n-1;t:=false; xoa(n,x); end else begin tam:=a[n]; n:=n-1; xoa(n,x); n:=n+1; a[n]:=tam; end; end; BEGIN clrscr; repeat Write('Nhap so phan tu mang A: '); Readln(n); if n=0 then Writeln('so phan tu cua mang phai lon hon ban nhe'); until n>0; t:=true; Nhap(n); Write('Nhap gia tri phan tu can xoa x = '); Readln(x); xoa(n,x); if t=true then Writeln('khong ton tai phan tu co gia tri x= ',x,' mang') else Writeln('mang A sau xoa phan tu x= ',x,' la'); for i:=1 to n write(a[i],' '); readln; END Bài 7: Tính giá trị xác suất p(i,j) (i,j:byte) Biết rằng: P(i, j) = Var a:array[0 10,0 10] of REAL; X,Y:BYTE; Function P(i,j:byte):real; var k,l:byte; a:array[0 50,0 50] of real; begin for l:=1 to j a[0,l]:=1; for k:=0 to i a[k,0]:=0; for k:=1 to i for l:=1 to j a[k,l]:=(a[k-1,l]+a[k,l-1])/2; P:=a[i,j]; end; BEGIN WRITE('NHAP X,Y:');READLN(X,Y); WRITELN('GIA TRI XAC SUAT P[',X,',',Y,']= ',P(X,Y):5:2); READLN END Lập bảng tính P(4,5): j 0 1 1 1 0.5 0.75 0.88 0.94 0.97 0.25 0.5 0.69 0.81 0.89 0.12 0.31 0.5 0.66 0.77 0.06 0.19 0.34 0.50 0.64 i Bài 8: BÀI TOÁN DU LỊCH Nêu toán Một người từ thành phố đến thành phố n qua n-1 thành phố khác 1, 2, , n-1, theo lộ trình: → i1→ i2 … → ik → n Trong đó: < i1 < i2 < …< ik< n, Giá vé xe từ thành phố i đến thành phố j c[i,j] (với i < j) Tìm lộ trình từ thành phố đến thành phố n cho tổng chi phí giá vé đạt cực tiểu Từ toán nêu, ta có thơng tin đầu vào đầu toán sau: * Input: + n thành phố cần đến + C[i, j] ma trận vé xe để từ thành phố i đến thành phố j (i, j =0 n) * Output: + Đường đến thành phố n cho chi phí nhỏ Ví dụ: Input Output Chi phi duong di nho nhat la: 10 Duong di voi chi phi nho nhat la: 5013 3104 10 Phương pháp thực hiện: Sử dụng phương pháp quy hoạch động theo bước sau: Bước Phân tích tốn + Gọi Ρ(r) toán du lịch đểđi từ thành phố đến thành phố r (r=0, 1, 2, 3, …, n) ⇒ Bài toán ban đầu Ρ(n) Các giá trị cần tìm: d[r]: chi phí nhỏ để từ thành phố → r toán Ρ(r) L[r]: thành phố cuối cần đến trước đến thành phố r toán Ρ(r) Bước Giải pháp đệ quy TH chung: Khi r > : d[r] = (d[v] + c[v,r]) (0 ≤ v0) {Max la so lon nhat neu khong co duong di qua cap dinh} Begin i := i+1; X[i] := l[r]; r := x[i]; End; Writeln(‘Chi phi nho nhat cua duong di la: ’, d[n]); Write('Duong di voi chi phi nho nhat la: '); for r := i downto write(x[r],’ ‘); End; Độ phức tạp tính tốn: O(n) Chương trình Pascal const Max=100; fi='Du_lich.txt'; Var n:byte; C:array[0 max,0 max]of real; X:array[0 max] of byte; L: array[0 max] of byte; d:array[0 max] of real; Procedure Doc_du_lieu; Var f:text; i,j:byte; Begin Assign(f,fi); Reset(f); readln(f,n); for i:=0 to n for j:=0 to n read(f,c[i,j]); 10 Procedure TongHop; Begin r:=p; For s:=n downto begin x[s]:= u[r,s]; r:= r – x[s].m[s]; end; End; Độ phức tạp tính tốn: O(n) Chương trình Pascal CONST fi='In_bai9.txt'; fo='Out_bai9.txt'; VAR M:array [1 1000] of longint; C:array[1 1000] of real; X:array[1 1000] of longint; U:array[0 1000,1 1000] of longint; L:array[0 1000,1 1000] of real; N: byte; P:longint; f:text; Procedure NhapDL; var i:byte; Begin assign(f,fi);reset(f); readln(f,n,p); for i:=1 to n readln(f,m[i],c[i]); close(f); End; Procedure Lapbang; var tam: real; s:byte; r,k:longint; Begin for s:=1 to n for r:=0 to p if s=1 then begin u[r,1]:=r div m[1]; l[r,1]:= u[r,1]*c[1]; end else begin l[r,s]:=0; u[r,s]:=0; for k:=0 to r div m[s] begin tam:=k*c[s]+ l[r-k*m[s],s-1]; if tam>l[r,s] then begin l[r,s]:=tam; u[r,s]:=k; end; 14 end; end; End; Procedure Tonghop; var s:byte; r:longint; Begin assign(f,fo);rewrite(f); r:=p; for s:=n downto begin x[s]:=u[r,s]; r:=r-x[s]*m[s]; end; Writeln(f,' Gia tri cuc dai cua tui la:',l[p,n]:5:2); for s:= to n writeln (f,'Do vat ',s,' can lay:',x[s],' cai'); close(f); End; BEGIN NhapDL; Lapbang; Tonghop; END * Các liệu Test kết Test Input Output Gia tri cuc dai cua tui la:32.00 Do vat can lay:1 cai Do vat can lay:0 cai Do vat can lay:2 cai Input Output Gia tri cuc dai cua tui la:152.00 Do vat can lay:0 cai Do vat can lay:0 cai Do vat can lay:4 cai Do vat can lay:2 cai Do vat can lay:0 cai Do vat can lay:0 cai Input Output Gia tri cuc dai cua tui la:444.00 Do vat can lay:0 cai Do vat can lay:0 cai Do vat can lay:0 cai Do vat can lay:0 cai 37 12 18 10 Test 40 22 10 34 28 20 28 30 Test 10 124 10 32 12 30 24 15 43 15 11 35 28 20 10 36 27 10 34 Do vat can lay:0 cai Do vat can lay:3 cai Do vat can lay:0 cai Do vat can lay:10 cai Do vat can lay:0 cai Do vat 10 can lay:0 cai Bài 10: PHÉP NHÂN TỔ HỢP NHIỀU MA TRẬN Nêu tốn - Cần tính tích ma trận: M1×M2×…×Mn=M Mi ma trân có cấp m[i-1]×m[i] (i=1 n) Hãy xác định thứ tự thực nhân ma trạn cho số phép tính nhân tối thiểu - Ví dụ: M=M1×M2×M3 đó: M1 có cấp 10×20; M2 có cấp 20×50; M3 có cấp 50×5; đó: + (M1×M2)×M3 có số phép tính nhân là: 10×20×50+10×50×5 =12500 + M1×(M2×M3) có số phép tính nhân là: 10×20×5+20×50×5 =6000 Input: n∈N* { số ma trận};m[0],m[1],…,m[n] {cấp ma trận M1 Mn} Ví dụ: M1 có cấp m[0]×m[1],…,Mn có cấp m[n-1]×m[n] Gọi x[i] vị trí phép nhân ma trận cần thực lần thứ i cho số phép tính nhân thấp Output: x[i]: Phép nhân thực hiện: x[1] x[2] … x[n-1] … Ở ví dụ phần output hiểu sau: Phép nhân thứ thực đầu tiên; Phép nhân thứ thực lần thứ 2;… phép nhân thứ thực lần thứ n-1 Phương pháp thực Sử dụng phương pháp quy hoạch động với bước sau: Bước1: Phân tích tốn Gọi P(r,s) tốn nhân ma trận Mr×Mr+1×…×Ms (1≤ r ≤ s ≤ n) ⇒ Bài toán ban đầu P(1,n) 16 ⇒Các giá trị cần tìm: - K[r,s] vị trí phép nhân hai ma trận thực cuối toàn P(r,s) - L[r,s] số phép nhân tối ưu toán P(r,s) Bước 2: Giải pháp đệ quy: - Trường hợp chung: Khi r+1 0) And (s >0) Do Begin 21 If X[r] = Y[s] Then Begin S := X[r] + S; r:= r – 1; s:= s – 1; End Else If L[r - 1, s] > L[r, s - 1] then r :=r – Else s := s – 1; End; Writeln(‘Do dai xau chung cuc dai là: ’, length(s)); Writeln(‘Xau chung cuc dai là:’, S); End; Độ phức tạp tính tốn: O(max(m,n)) * Chương trình: Const fint = 'in_bai11.txt'; fout = 'out_bai11.txt'; maxn = 255; var X,Y,S1 : string; m,n : byte; l : array[0 maxn,0 maxn] of byte; f1,f2: text; procedure nhapDL; begin assign(f1, fint); reset(f1); assign(f2,fout); rewrite(f2); readln(f1,X);m:= length(X); readln(f1,Y);n:= length(Y); close(f1); end; function Max(a,b:byte):byte; begin if a>b then Max := a else Max := b; end; procedure Lapbang; var r,s:byte; begin for r:=0 to m for s:=0 to n if (r=0)or(s=0) then l[r,s] := else if X[r]=Y[s] then l[r,s] := l[r-1,s-1]+1 else l[r,s]:= Max(l[r-1,s],l[r,s-1]); end; procedure TongHop; var r,s:byte; begin S1 := ''; r:=m; s:=n; while (r>0)and(s>0) Begin If X[r] = Y[s] Then Begin 22 S1 := X[r] + S1; r:= r - 1; s:= s - 1; End Else If L[r - 1, s] > L[r, s - 1] then r :=r - Else s := s - 1; end; writeln(f2,'Do dai xau chung cuc dai la ',l[m,n]); writeln(f2,'Xau chung cuc dai la: ',S1); close(f2); end; BEGIN NhapDL; Lapbang; TongHop; END * Các liệu Test kết Test Input Output ABCDE Do dai xau chung cuc dai la XYACADK Xau chung cuc dai la: ACD Test Input Output dodaixauchung Do dai xau chung cuc dai la baitapthuattoan Xau chung cuc dai la: aiahun Test Input Output AbhdgEFG120ghab87cDD Do dai xau chung cuc dai la ABC12ghkfffGHF3789ghADBGB Xau chung cuc dai la: A12gh7D Bài 12 BÀI TỐN SINH VIÊN ƠN THI Nêu tốn: Bài tốn sinh viên ơn thi: Một sinh viên cịn m ngày để ôn thi n môn Theo kinh nghiệm anh ta, ôn môn j i ngày điểm a[i,j] Giả sử cho biết a[i,j] (với a[i,j]