算法设计与分�王晓东 - 百度文库

loading ·ÖÏí 2026-10-19 ÏÂÔØÎĵµ

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)£» inverse£¨n,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ÐèÒªO£¨nlogn) ʱ¼ä¡£Òò´ËÉÏÊöËã·¨ËùÐèµÄ¼ÆËãʱ¼ä 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¸öÒÑÅźÃÐòµÄÊý¡£ÊÔÉè¼ÆÒ»¸ö ʱ¼äµÄËã·¨£¬ÕÒ³öXºÍYµÄ2n¸öÊýµÄÖÐλÊý¡£ ·ÖÎöÓë½â´ð£º £¨1£© Ëã·¨Éè¼ÆË¼Ïë

¿¼ÂÇÉÔÒ»°ãµÄÎÊÌ⣺ÉèX[i1:j1] ºÍy[i2;j2] ÊÇXºÍYµÄÅÅÐòºÃµÄ×ÓÊý×飬ÇÒ³¤¶ÈÏàͬ£¬¼´j1-i1=j2-i2 ¡£ÕÒ³öÕâÁ½¸öÊý×éÖÐ2(i1-j1+1) ¸öÊýµÄÖÐλÊý¡£

Ê×ÏÈ×¢Òâµ½£¬ÈôX(i1)<=Y(j2) £¬ÔòÖÐλÊýmedianÂú×ãX(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 µÄѡȡ²ßÂÔ¿ÉÖª£¬Ôڵݹéµ÷ÓÃʱ£¬Êý×éXºÍYµÄ´óС¶¼¼õÉÙÁËÒ»°ë¡£Òò´Ë£¬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λµÄ£¨0£¬1£©´®£¬ÏàÁÚÔªËØÇ¡ºÃÖ»ÓÐ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) µÄµÚ1¸önλ´®Ïàͬ£¬¿ÉÓÃÊýѧ¹éÄÉ·¨Ö¤Ã÷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루0£¬1£©´®¿´×öÊǶþ½øÖÆÕûÊý£¬µÚi¸ö´®´æ´¢ÔÚ ÖС£ Íê³É¼ÆËãÖ®ºó£¬ÓÉoutÊä³öGrayÂëÐòÁС£ 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]ΪÒÑɨÃ貿·ÖµÄ³¤¶ÈΪ£éµÄÉýÐò×ÓÐòÁеÄ×îСÖÕÖµ¡£ °´´Ë˼ÏëÉè¼ÆµÄ¶¯Ì¬¹æ»®Ëã·¨ÃèÊöÈçÏ£º 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 ¿¼ÂÇÏÂÃæµÄÕûÊýÏßÐԹ滮ÎÊÌ⣺ Ϊ·Ç¸ºÕûÊý£¬

ÊÔÉè¼ÆÒ»¸ö½â´ËÎÊÌâµÄ¶¯Ì¬¹æ»®Ëã·¨£¬²¢·ÖÎöËã·¨µÄ¼ÆË㸴ÔÓÐÔ¡£ ·ÖÎöÓë½â´ð£º

¸ÃÎÊÌâÊÇÒ»°ãÇé¿öϵı³°üÎÊÌ⣬¾ßÓÐ×îÓÅ×ӽṹÐÔÖÊ¡£ ÉèËù¸ø±³°üÎÊÌâµÄ×ÓÎÊÌ⣺max¡ÆCkXk(1..i)¡ÆAkXk<=j

µÄ×îÓÅֵΪm(i,j) £¬¼´ m(i,j)ÊDZ³°üÈÝÁ¿Îªj£¬¿ÉÑ¡ÔñÎïÆ·Îª1£¬2£¬¡­£¬iʱ±³°üÎÊÌâµÄ×îÓÅÖµ¡£Óɱ³°üÎÊÌâµÄ×îÓÅ×ӽṹÐÔÖÊ£¬¿ÉÒÔ½¨Á¢¼ÆËã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)

¾­¹ýÒ»´ÎË³ÍÆ£¬±ã¿ÉÇó³ö´Ó¶¥ÖÁµ×n¸öÊýµÄnÌõ·¾¶£¨ÕânÌõ·¾¶ÎªÖÁµ×ÉÏn¸öÊýµÄn¸ö×î´ó×ܺ͵Ä·¾¶£©£¬Çó³öÕân¸ö×ܺ͵Ä×î´óÖµ£¬¼´ÎªÕýÈ·´ð°¸¡£ Êý¾Ý½á¹¹:

a[i,j].val: Èý½ÇÐÎÉϵÄÊý×Ö£¬

a[i,j].f: ÓÉ£¨1£¬1£©ÖÁ¸ÃµãµÄ×î´ó×ܺÍ·¾¶µÄ×ܺÍÖµ¡£ 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±³°üÎÊÌ⣬Éè¼ÆÒ»¸öÓÐЧËã·¨ÕÒ³ö×îÓŽ⣬²¢ËµÃ÷Ëã·¨µÄÕýÈ·ÐÔ¡£ ·ÖÎöÓë½â´ð£º


算法设计与分æž�王晓东 - 百度文库.doc ½«±¾ÎĵÄWordÎĵµÏÂÔØµ½µçÄÔ
ËÑË÷¸ü¶à¹ØÓÚ£º 算法设计与分æž�王晓东 - 百度文库 µÄÎĵµ
Ïà¹ØÍÆ¼ö
Ïà¹ØÔĶÁ