ǰλãҳ > 算法设计与分析王晓东 - 百度文库
ind[0] = right; ind[1]=left; return false; }
صind[1]СxԪλãind[0]ǴxСԪصλá
ϰ3-3 a[0:n-1] nԪص飬 ǷǸһ㷨 λҪ㷨ºʱΪ ֻõ ĸռ䡣 㷨
Algorithm exchange(a, k, n); Begin
Inverse(n,0,k-1); inverse(n,k,n-1) inversen,0,n-1 End.
Algorithm inverse(a, i, j); Begin
h=[(j-i+1)/2] ; For k=0 to h-1 do
Begin x=a[i+k]; a[i+k]=a[j-k]; a[j-k]= x end ; end
ϰ3-4 ںϲ㷨ķָУa[0;n-1] Ϊ [2飬ÿ ԪءȻݹضԷָõ źϲҪź һʵԵĺϲ㷨㷨ļ㸴ԡ
ʵԵĺϲ㷨£
public static void mergesort(int []a, int left ,int right) {
if (left < right ) {
int j = (int) Math.sqrt(right Cleft+1); if (j>1) {
for (int i=0; i mergeall(a,left,right); } } У㷨mergeallϲn źΡ£㷨mergeallҪOnlogn) ʱ䡣㷨ļʱ T(n)㣺 T(n)=O(1),n<=1 T(n)=n*T(n),n>1 T(n)=O(nlogn) ˵ݹʽĽΪ ϰ3-5 S1,S2...Sk ϣÿ ȡֵΧ һ㷨 ʱڽ ֱ Ͱ㷨˼ʵ ϰ3-6 X[0:n-1] Y[0:n-1] Ϊ飬ÿлnźһ ʱ㷨ҳXY2nλ 1 㷨˼ һ⣺X[i1:j1] y[i2;j2] XYõ飬ҳͬj1-i1=j2-i2 ҳ2(i1-j1+1) λ עX(i1)<=Y(j2) λmedianX(i)<=median<=Y(j2) ͬX(i1)>=Y(j2) Y(j2)<=median<=X(i1) m1=(i1+j1)/2,m2=(i2+j2)/2 m1+m2=i1+i2+(j1-i1)/2+(j2-i2)/2 j1-i1=j2-i2 (j1-i1)/2+(j2-i2)/2=j2-i2 m1+m2=i1+j2 X(m1)=Y(m2) ʱmedian=X(m1)=Y(m2) X(m1)>Y(m2) ʱmedian1 X(m1:j1) Y(j2:m2) λmedian=median1 X(m1) 2 £㷨ļʱΪT(2n) 㷨m1 m2 ѡȡԿ֪ڵݹʱXYĴСһ롣ˣT(2n) ݹʽ T(2n)=(1),n<=1 T(2n)=T(n)+O(1),n>=c ˵ݹ鷽̿ɵãT(2n)=O(logn) ϰ3-7 GrayһΪ2^n СͬԪأÿԪضdzΪnλģ01Ԫǡֻ1λͬ÷βһ㷨nӦGray롣 ļΡ n=1 0 1 n=2 00 01 11 10 n=3 000 001 011 010 110 111 101 100 nλGrayΪG(n) ෴˳еΪG^-1(n)ļοԿG(n) ĹɣG(n+1)=OG(n)1G^-1(n) עG(n) һnλG^-1(n) ĵ1nλͬѧɷ֤G(n) ɡɴ˹ƹG(n) ķη¡ public static void Gray(int n) { if ( n == 1) { a[1] = 0; a[2] = 1; return; } Gray(n-1); for ( int k = 1<< ( n - 1), i = k; i > 0; i--) a[2*k-i+1]=a[i] + k; } 㷨нnλ01Ƕi洢 С ɼ֮outGrayС public static void out(int n) { int m=1< for (int i=1; i<=m; i++) { String str=Integer.toBinaryString(a[i]); int s=str.length(); for ( int j=0; j System.out.println(); } ̬滮 ϰ4-1 һ ʱ㷨ҳnɵеС һbʹb[i]Ϊɨ貿ֵijΪеСֵ ˼ƵĶ̬滮㷨£ j:=0; b[0]:=-maxint; FOR i:=1 TO n DO IF a[i]>b[j] THEN BEGIN j:=j+1; b[j]:=a[i]; END ELSE BEGIN k:=1; while a[i]>b[k] DO k:=k+1; b[k]:=a[i]; END; ϰ4-2 Թ滮⣺ ΪǸ һĶ̬滮㷨㷨ļ㸴ԡ һµı⣬ӽṹʡ ⣺maxCkXk(1..i)AkXk<=j ֵΪm(i,j) m(i,j)DZΪjѡƷΪ12iʱֵɱӽṹʣԽm(i,j ĵݹʽ£ m(i,j)=max{m(i-1,j),m(i,j-ai)+ci} j>=ai, m(i,j)=m(i-1,j),0<=j,ai m(0,j)=m(i,0);m(i,j)=-*,j<0 ˵ݹʽm(n,b) Ϊֵ㷨ļʱΪO(nb) ϰ4-3 һnɵͼ3-2ʾһ㷨εĶһ·ʹ·ܺ f(uij)ΪijԪص·ֵ, aij Ԫ(i,j)ֵ֮ ݹʽ: F(uij)=max{f(ui-1,j)+aij, f(ui-1,j+1)+aij} (i=1,n j=1,i) һ˳ƣӶnn·n·Ϊnnܺ͵·nܺ͵ֵΪȷ𰸡 ݽṹ: a[i,j].val: ϵ֣ a[i,j].f: ɣ11õܺ·ֵܺ type node=record val, f: integer; end; var a:array [1.. maxn, 1..maxn] of node; procedure findmax; begin a [1,1]. f :=a[1,1].val; for i:=2 to n do for j:=1 to i do begin a[i,j]. f:=-1; if (j<>1) and (a [i-1,j-1].f+a[i,j].val > a [i,j].f) then a[i,j]. f:=a [i-1,j-1]. f+a[i,j].val; if (j<>i) and(a [i-1,j].f+a[i,j].val > a[i,j].f) then a[i,j]. f:=a[i-1,j]. f+a[i,j]. val end; max:=1; for i:=2 to n do if a[n,i]. f> a[n, max] .f then max:=i; writeln (a [n, max]. f) end; ̰㷨 ϰ5-1 0-1 0-1УƷʱֵǡݼС0-1⣬һЧ㷨ҳŽ⣬˵㷨ȷԡ
92ƪĵ