You are on page 1of 7

PHN TCH V THIT K THUT TON

Cu 1 (4 im): Gii phng trnh quy. a) Phng php truy hi: Bi 1: Gii phng trnh quy sau: T(n)= n =0 C1 T (n 1) +C 2 n>0

Gii Ta gii bng phng php truy hi 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 trnh kt thc khi n=i khi T(n)= T(0)+nC2=C1+nC2=O(n); Vy T(n)= O(n). Bi 2: Gii phng trnhi sau: n =1
C1 T(n)= n 2T ( ) +C 2 n 2

n >1

Gii: Ta c T(n)= 2T(n/2)+C2n;


n n 2 = 2(2T(n/4)+C2 2 ) +C2n= 2 (T( 2 2 )+2C2n n n =22(2T(n/8)+ C2 4 )+C2n= 23(T( 2 3 )+3C2n

...... = 2iT(
n )+iC2n 2i

Qu trnh kt thc khi n=2i; i= log2n Vy T(n)= nC1+C2 nlog2n= O(nlog2n)

b) Phng php quy tng qut. T(n)= aT( b )+ d(n); * Nu d(n) l hm nhn: - Nu a>d(b) th NR(nghim ring)=O(nlogab)= NTN(nghim thun nht) T(n)= O(nlogba) - Nu a<d(b) th T(n)= O(nlog bd(b)) - Nu a=d(b) th T(n)= O(nlogbaLogbn)
n

Bi 1: Gii phng trnh: T(n) vi T(1)=1 v T(n)= 4T(n/2)+n

Gii Ta c phng trnh dng tng qut v d(n)= n l mt hm nhn a =4; b= 2; d(b)= b= 2; a>d(b) Vy theo cng thc ta c T(n)= O(nlogab)= O(nlog24)= O(n2). Bi 2: Gii phng trnh: T(1)=1; T(n)= 4T(n/2)+n 2 Gii: Ta thy phng trnh dng chun. d(n)= n2 l mt hm nhn. a= 4; b= 2; d(b)=d(2)= 22=4; Nh vy a= d(b) Vy theo cng thc ta c: T(n)= O(nlogbaLogbn) = O(nlog24Log2n)=O(n2 Log2n) Bi 3: Gii phng trnh: T(1)=1 v T(n)= 4T(n/2)+n3 Gii: Ta c phng trnh dng chun. d(n)= n3 l mt hm nhn. a =4; b= 2; d(b)= d(2)= 8; Nh vy a<d(b); Theo cng thc ta c T(n)= O(nlogbd(b)) = O(nlog28)= O(n3) Vy T(n)= O(n3); Bi 4: Gii phng trnh T(1)= 1; T(n)= T(n/2)+1; Gii: Ta thy phng trnh dng chun. d(n)= 1 l mt hm nhn. a =1; b=2; d(b)=d(2)=1; nh vy a=d(b);\ Theo cng thc ta c T(n)= O(nlogbaLogbn) = O(nlog21Log2n)= O(Log2n); Vy T(n)= O(Log2n); * Nu d(n) khng phi l hm nhn:

Cu 2 (4 im): Vit chng trnh: a) Tm kim nh phn


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 do begin writeln(' Phan tu ',i,'la: '); readln(A[i]); end; writeln(' Ban muon kiem tra phan tu nao ? '); readln(x); writeln(' Ket qua: 1 la co, 0 la khong'); TKNP(A,x,1,n); readln;readln; end.

phc tp:

1 T(n)= n T( ) +1 2

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 2 + 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 do begin writeln(' Phan tu thu ',i,' la: '); read(A[i]); end; writeln; writeln(' Ket qua: '); TM2(A,1,n,max,min); readln; readln; end.

phc tp T(n)=

0 1 n 2T ( ) + 2 2

Nu n= 1 Nu n= 2 Nu n>2

c) Sp xp phng php la chn


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 do begin index:=i;key:=a[i]; for j:=i+1 to n do 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 do begin write('a[',i,']=');readln(a[i]); end; sort(a,n); writeln('Day da sap xep la:'); for i:=1 to n do write(a[i]:3); readln; END.

* phc tp: 4

T(n)=

(n i) =
i =1

n1

n(n 1) = O(n2). 2

Cu 3 (2 im): Trnh by tng, thut ton: a) Phng php phn on (Quick Sort) * tng: Gi s v l mt gi tr kha m ta gi l cht. Ta phn hoch dy a[1]..a[n] thnh 2 mng con bn tri v bn phi.Mng con bn tri bao gm cc kha c gi tr nh hn cht. Mng con bn phi bao gm cc kha c gi tr ln hn hoc bng cht. - Sp xp mng con bn tri v bn phi cng theo cch trn. - Mt mng ch gm mt phn t hoc nhiu phn t c kha bng nhau th c th t. * Thut ton:
Chn cht: Function FindPivot(i,j:integer): integer; Var Firstkey: keytype; k: integer; begin k:= i+1; Firstkey:= a[i].key; While (k<=j) and (a[k].key= Firstkey) do k:= k+1; If k>j then Findpivot:= 0 Else If (a[i].key > Firstkey) then findpivot:= k Else Pindpivot:= i; End; - Phn hoch mng: Function Partition(i,j: integer; Pivot: keytype): integer; Var L,R: integer; Begin L:= i; R:= j; While L<=R do Begin While a[L].key<pivot do L:= L+1; While a[R].key>=pivot do R:= R-1; If L<R then Swap(a[L],a[R]); End; Partition:= L; End; - Th tc QuickSort: Procedure QuickSort(i,j:integer): Var Pivot: keytype; PivotIndext,k: integer; Begin PivotIndex:= Finpivot(i,j); If (PivotIndex<>0) then Begin Pivot:= a[pivotIndex].key; K:= partition(i,j,pivot); QuickSort(i,k-1); QuickSort(k,j); End; End;

nh gi phc tp: + Trng hp xu nht:


1 T(n)= T (n 1)+ T (1) + n
Nu n= 1 Nu n>1

Gii ra T(n)= O(n2)

+ Trng hp tt nht: T(n)=


1 n 2T ( ) + n 2

Nu n= 1 Nu n>1

Gii ra T(n)= O(nlogn)

b. Tm dy con c tng cho trc. * tng: - Xc nh dy con (ai0,ai1,ai2...aik) sao cho ai0+ai1+ai2+..+aik=M bng cch chn ln lt ai0,ai1... - Chn ai0 t (a0,a1,...an-1) m ai0<M - Khi chn c (ai0,ai1,ai2...aik-1) th ta c th chn aik vi ik (ik-1,n-1) - Gi s dy s lu trong mng A -Dy ch s ca dy con c lu trong mng I * Thut ton:
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) Tm dy con chung di nht ca hai dy s: * tng: - Vi mi i{1..m}, j{1,..n}; Gi Lij l di ca dy con di nht ca a[1..i] v b[1..j] th Lmn chnh l di ca dy con c cn tm. - Nh vy ta cn tnh Lij * Thut ton:
Void Day_chung(a,b,m,n) { for (i=1;i<=m;i++) If (b1a[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); }

You might also like