1. Trang chủ
  2. » Cao đẳng - Đại học

thu thuat

8 5 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 17,92 KB

Nội dung

Câu 2 4 điểm: Viết chương trình: a Tìm kiếm nhị phân program CTTKNP; uses crt; type Mang= array[1..100] of integer; var A: Mang; i,n,x: integer; procedure TKNPa:mang;x,dau,cuoi:integer; [r]

(1)PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN Câu (4 điểm): Giải phương trình đệ quy a) Phương pháp truy hồi: Bài 1: Giải phương trình đệ quy sau: T(n)= ¿ n =0 C1 n>0 T (n −1)+C ¿{ ¿ Giải Ta giải phương pháp truy hồi Ta có T(n)= T(n-1) +C2 = (T(n-2)+C2) + C2= T(n-2) + 2C2 = ((T(n-3)+C2)+C2)+C2= T(n-3)+3C2 = T(n-i) + iC2 Quá trình kết thúc n=i đó T(n)= T(0)+nC2=C1+nC2=O(n); Vậy T(n)= O(n) Bài 2: Giải phương trìnhi sau: n =1 ¿ n >1 C1 n T(n)= 2T ( )+C n ¿{ ¿ Giải: Ta có T(n)= 2T(n/2)+C2n; n n = 2(2T(n/4)+C2 ) +C2n= 22(T( )+2C2n n n =22(2T(n/8)+ C2 )+C2n= 23(T( )+3C2n = 2iT( n )+iC2n 2i Quá trình kết thúc n=2i; i= log2n Vậy T(n)= nC1+C2 nlog2n= O(nlog2n) b) Phương pháp đệ quy tổng quát T(n)= aT( n b )+ d(n); * Nếu d(n) là hàm nhân: - Nếu a>d(b) thì NR(nghiệm riêng)=O(nlogab)= NTN(nghiệm nhất) T(n)= O(nlogba) (2) - Nếu a<d(b) thì T(n)= O(nlog bd(b)) - Nếu a=d(b) thì T(n)= O(nlogbaLogbn) Bài 1: Giải phương trình: T(n) với T(1)=1 và T(n)= 4T(n/2)+n Giải Ta có phương trình đã dạng tổng quát và d(n)= n là hàm nhân a =4; b= 2; d(b)= b= 2;  a>d(b) Vậy theo công thức ta có T(n)= O(nlogab)= O(nlog24)= O(n2) Bài 2: Giải phương trình: T(1)=1; T(n)= 4T(n/2)+n2 Giải: Ta thấy phương trình đã dạng chuẩn d(n)= n2 là hàm nhân a= 4; b= 2; d(b)=d(2)= 22=4; Như a= d(b) Vậy theo công thức ta có: T(n)= O(nlogbaLogbn) = O(n log24Log2n)=O(n2 Log2n) Bài 3: Giải phương trình: T(1)=1 và T(n)= 4T(n/2)+n3 Giải: Ta có phương trình đã dạng chuẩn d(n)= n3 là hàm nhân a =4; b= 2; d(b)= d(2)= 8; Như a<d(b); Theo công thức ta có T(n)= O(nlogbd(b)) = O(nlog28)= O(n3) Vậy T(n)= O(n3); Bài 4: Giải phương trình T(1)= 1; T(n)= T(n/2)+1; Giải: Ta thấy phương trình đã dạng chuẩn d(n)= là hàm nhân a =1; b=2; d(b)=d(2)=1; a=d(b);\ Theo công thức ta có T(n)= O(nlogbaLogbn) = O(nlog21Log2n)= O(Log2n); Vậy T(n)= O(Log2n); * Nếu d(n) không phải là hàm nhân: (3) Câu (4 điểm): Viết chương trình: a) Tìm kiếm nhị phân program CTTKNP; uses crt; type Mang= array[1 100] of integer; var A: Mang; i,n,x: integer; procedure TKNP(a:mang;x,dau,cuoi:integer); var giua:integer; begin if (dau>cuoi) then writeln(' Khong thoa man') else begin giua:= (dau+cuoi) div 2; if (x= a[giua]) then writeln(' Chuc mung ban') else begin if (x>a[giua]) then TKNP(a,x,giua+1,cuoi) else TKNP(a,x,dau,giua-1); end; end; end; BeGin clrscr; writeln(' Chuong trinh tim kiem nhi phan '); writeln(' Moi ban nhap so phan tu cua mang n:= '); read(n); writeln; writeln; for i:=1 to n begin writeln(' Phan tu ',i,'la: '); readln(A[i]); end; writeln(' Ban muon kiem tra phan tu nao ? '); readln(x); writeln(' Ket qua: la co, la khong'); TKNP(A,x,1,n); readln;readln; end (4) Độ phức tạp: T(n)= ¿ n T ( )+ ¿{ ¿ n=1 n >1 b) Max, Min program TimMaxMin; uses crt; type Mang= array[1 100] of integer; var i,n,x,max,min: integer; A: mang; procedure TM2(M:Mang;d,c:integer;var max:integer;var min:integer); var max1,min1,max2,min2: integer; begin if (d= c) then begin max:= M[d]; min:= M[d]; end else begin TM2(M,d,(d+c)div 2,max1,min1); TM2(M,(d+c)div + 1,c,max2,min2); if(max1>max2) then max:= max1 else max:= max2; if(min1>min2) then min:= min2 else min:= min1; writeln(' max:= ',max); writeln(' Min:= ',min); end; writeln; end; BeGin clrscr; writeln(' CHUONG TRINH TIM MAX,MIN CUA DAY SO'); writeln(' Nhap so phan tu cua day n:= '); read(n); writeln; writeln; for i:=1 to n begin writeln(' Phan tu thu ',i,' la: '); read(A[i]); end; (5) writeln; writeln(' Ket qua: '); TM2(A,1,n,max,min); readln; readln; end Độ phức tạp T(n)= ¿ n 2T ( )+2 ¿{{ ¿ Nếu n= Nếu n= Nếu n>2 c) Sắp xếp phương pháp lựa chọn program select_sort; uses crt; Type mang=array[1 100]of integer; var a:mang; i,j,n,index,key:integer; procedure swap(var a,b:integer); var tam:integer; Begin tam:=a; a:=b; b:=tam; End; procedure sort(var a:mang;n:integer); var i,j,index,key:integer; Begin for i:=1 to n-1 begin index:=i;key:=a[i]; for j:=i+1 to n if(a[j]<key)then begin key:=a[j];index:=j; end; swap(a[i],a[index]); end; end; BEGIN clrscr; write('Nhap so phan tu can sap xep:');readln(n); writeln('Nhap cac phan tu:'); for i:=1 to n begin write('a[',i,']=');readln(a[i]); end; sort(a,n); writeln('Day da sap xep la:'); for i:=1 to n write(a[i]:3); readln; END * Độ phức tạp: n −1 T(n)= ∑ (n −i)= i=1 n(n −1) = O(n2) Câu (2 điểm): Trình bày ý tưởng, thuật toán: a) Phương pháp phân đoạn (Quick Sort) * Ý tưởng: Giả sử v là giá trị khóa mà ta gọi là chốt Ta phân hoạch dãy a[1] a[n] thành mảng bên trái và bên phải.Mảng bên trái bao gồm các khóa có (6) giá trị nhỏ chốt Mảng bên phải bao gồm các khóa có giá trị lớn chốt - Sắp xếp mảng bên trái và bên phải theo cách trên - Một mảng gồm phần tử nhiều phần tử có khóa thì đã có thứ tự * Thuật toán: Chọn chôt: Pivot:= a[pivotIndex].key; Function FindPivot(i,j:integer): integer; K:= partition(i,j,pivot); Var Firstkey: keytype; QuickSort(i,k-1); k: integer; QuickSort(k,j); begin End; k:= i+1; End; Firstkey:= a[i].key; Đánh giá độ phức tạp: While (k<=j) and (a[k].key= Firstkey) k:= k+1; + Trường hợp xấu nhât: If k>j then Findpivot:= ¿ Else T(n)= T (n −1)+T (1)+ n If (a[i].key > Firstkey) then findpivot:= ¿{ k ¿ Else Pindpivot:= i; Giải T(n)= O(n ) End; - Phân hoạch mảng: Function Partition(i,j: integer; Pivot: keytype): integer; Var L,R: integer; Begin L:= i; R:= j; While L<=R Begin While a[L].key<pivot L:= L+1; While a[R].key>=pivot R:= R-1; If L<R then Swap(a[L],a[R]); End; Partition:= L; End; - Thủ tục QuickSort: Procedure QuickSort(i,j:integer): Var Pivot: keytype; PivotIndext,k: integer; Begin PivotIndex:= Finpivot(i,j); If (PivotIndex<>0) then Begin Nếu n= Nếu n>1 + Trường hợp tốt nhất: T(n)= ¿ n 2T ( )+n ¿{ ¿ Nếu n= Nếu n>1 Giải T(n)= O(nlogn) b Tìm dãy có tổng cho trước * Ý tưởng: - Xác định dãy (ai0,ai1,ai2 aik) cho ai0+ai1+ai2+ +aik=M cách chọn ai0,ai1 - Chọn ai0 từ (a0,a1, an-1) mà ai0<M - Khi đã chọn (ai0,ai1,ai2 aik-1) thì ta có thể chọn aik với ik  (ik-1,n-1) - Giả sử dãy số đã lưu mảng A -Dãy số dãy lưu mảng I * Thuật toán: (7) Void SubSequences(int A[n];int M;int I[n]); { k= 0; I[0]= -1; int S=0; While (k>=0) { I[k]++; If (I[k]<n) { if (S+A[I[k]])<=M iF (S+A[I[k]])==M) for (i:=1;i<=k;i++) printf(I[i]); else { S= S+A[I[k]]; I[k+1]= I[k]; K++; } } Else { k ; S= S-A[I[k]]; } } } c) Tìm dãy chung dài hai dãy số: * Ý tưởng: - Với i{1 m}, j{1, n}; Gọi Lij là độ dài dãy dài a[1 i] và b[1 j] thì Lmn chính là độ dài dãy c cần tìm - Như ta cần tính Lij * Thuật toán: Void Day_chung(a,b,m,n) { for (i=1;i<=m;i++) If (b1a[1 i]) L[i][1]= 1; Else L[i][1]=0; For (j=1;j<=n;j++) If (a[1]b[1 j]) L[1][j]= 1; Else L[1][j]= 0; For (i=2;i<=m;i++) For (j=2;j<=n;j++) { if (a[i]=b[j]) x=1; Else x=0; L[i][j]= Max{L[i][j-1],L[i-1][j], L[i-1][j-1] + x} } Return(L); } (8) (9)

Ngày đăng: 11/06/2021, 03:51

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w