a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 220|回复: 3

[专业语言] JAVA认证:Weiss的java数据结构与问题解决完整代码讲解

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
import java.util.Random;   public final class MaxSumTest) u! e( W. K. |, J$ _& d
  {5 f  `0 J8 A$ j
  static private int seqStart = 0;
& \0 S7 C/ _2 m  static private int seqEnd = -1;* t# w9 [( b. u# r" T( z( W
  /**4 c; p3 ?1 u( ~+ g- q( ]1 O
  * Cubic maximum contiguous subsequence sum algorithm.
- h! f2 o* k7 ^7 Y  * seqStart and seqEnd represent the actual best sequence.
5 E6 g' Z1 v" i4 i. ]" E8 t0 ?4 p  */
% W+ e  y$ b, A: U  public static int maxSubSum1( int [ ] a )
( E  w- C  _$ ~& ~  {) B! }) `9 `5 W/ |3 C+ }' f) ?
  int maxSum = 0;
# o; B' K' w1 t  for( int i = 0; i < a.length; i++ )
6 r' q$ k5 o( O2 Q  for( int j = i; j < a.length; j++ )
: f2 R( T4 }) y; y  {2 U) j5 |& i5 a: f7 u& w; r
  int thisSum = 0;
' D' K: k. ]) a  for( int k = i; k  maxSum )# o' |* y7 ?9 X6 U: |0 E
  {
8 h8 t/ n6 f* I8 ^2 g0 q  maxSum   = thisSum;$ ?& o' z6 s! C% R" ~- A# ?7 a" u( I
  seqStart = i;1 R8 ~8 \3 R% ~& u8 x# o2 Z  h
  seqEnd   = j;1 C3 o; _1 z1 D$ r8 A
  }& l6 G0 H1 i' T% c9 [7 {

& C& }" K8 [0 _8 P0 G  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:Weiss的java数据结构与问题解决完整代码讲解

</p>  return maxSum;
; G$ Q- l9 [5 m1 i1 N) a; e" `  }
! a1 H$ c4 F# u! E& E% j; L1 b7 V5 [0 T  /**
( M- E) s$ o. j  R6 H9 t  * Quadratic maximum contiguous subsequence sum algorithm.; ~, ~% Y! o( o1 b+ v
  * seqStart and seqEnd represent the actual best sequence.
& r; }2 S* D7 E$ T1 K4 H  */
* G% U8 l/ K1 P9 d  public static int maxSubSum2( int [ ] a )% z# m1 z; Q& _, g6 S& k* G
  {
0 b- P' C1 ?% i  int maxSum = 0;
4 @3 v5 o! A* @" W* C  for( int i = 0; i < a.length; i++ )
, A  s4 c" P1 I, p* F' x  {/ W9 k+ f" o/ ?% U- ?
  int thisSum = 0;+ B# \- D* l+ t+ o6 I2 T7 k( M
  for( int j = i; j < a.length; j++ )
3 T6 s9 b8 U+ y- Z  {
6 g/ l/ `4 Y2 l4 `8 C7 A5 x) q  thisSum += a[ j ];9 t. P4 \, v, ]. h
  if( thisSum > maxSum )
$ I' _0 w. w2 u& s7 h, \  {- R0 o9 M4 T% Y/ @0 Y5 U$ W
  maxSum = thisSum;8 G0 l) g( w: A( d4 n
  seqStart = i;" F  C4 Z( u1 O( ]3 [
  seqEnd   = j;  i& _" Q( c' X8 b2 b/ X2 U
  }
0 B% A8 Y5 `- H9 E  }* i( M7 h, E1 b, c8 W$ i, o7 p
  }
( |# s. a. a- N6 n  |: @' e4 K  return maxSum;5 ]# D$ w' a& [/ p3 i6 a
  }
8 U' J% E4 l8 j4 X4 M  /**6 H1 Z2 S7 [: h9 i1 K6 e
  * Linear-time maximum contiguous subsequence sum algorithm.
' j) a% |$ c# \  _/ V5 p9 @  k  * seqStart and seqEnd represent the actual best sequence.6 l. N/ U" y+ ^1 |
  */
3 J/ x  _- X$ {9 V  public static int maxSubSum3( int [ ] a )
& W  W. F% B3 P) x, D! L  {
2 W+ Y% {5 P0 S9 w6 J  int maxSum = 0;  ^9 u" Y0 o/ P8 s+ z
  int thisSum = 0;+ O# x' w" o3 m! ]% K
  for( int i = 0, j = 0; j < a.length; j++ )
3 @6 N+ a4 D- F. y  {" T3 t+ y9 z/ `! r
  thisSum += a[ j ];
& k, a4 w0 U/ D$ o  if( thisSum > maxSum )
8 ?) b+ T6 c: S) Z  {3 Y6 |0 b3 B; g5 L1 r1 h7 B, x
  maxSum = thisSum;; Z& I" T6 {, X  X- W8 h* c
  seqStart = i;
, N+ M; \; t* h" `, L$ o, _4 `# l  seqEnd   = j;
! e  y- C. m+ C8 v2 P: L1 I  }
( e/ s" g9 k; q# V& m7 a- A  else if( thisSum < 0 )
* n( u9 m$ P' k5 I; T$ {! u  {6 N6 _% H' E: Q5 V3 B  I' j2 \
  i = j + 1;+ m( H9 C) I9 W% I
  thisSum = 0;
" z# X2 |1 d; Q4 @8 T  }7 G3 Q3 u' n$ @7 @5 z
  }+ _, z/ l7 `- O( T* O7 n# g2 H
  return maxSum;: e$ k7 Z' H) K
  }
7 t6 b+ z  D7 K4 S8 G/ v! h  /**7 @; x% E: ^  p% R
  * Recursive maximum contiguous subsequence sum algorithm.0 A. P2 A) J$ m
  * Finds maximum sum in subarray spanning a[left..right].! h8 V8 [6 j$ b& N: p
  * Does not attempt to maintain actual best sequence.- C: Z" Z3 B7 z* `) h( x
  */8 o1 n0 |4 P2 m/ k
  private static int maxSumRec( int [ ] a, int left, int right ): V7 K; D4 V+ C" r# n+ }' `1 A5 y
  {! m% x) F" v$ V. N0 m& b9 ~% \
  int maxLeftBorderSum = 0, maxRightBorderSum = 0;* E9 ~$ O. W, [2 N5 f: m6 M
  int leftBorderSum = 0, rightBorderSum = 0;
5 q4 m; [$ c2 X& {1 K  int center = ( left + right ) / 2;' j* i/ E) ~) Z! P3 t3 |* c5 ]) h; R
  if( left == right )  // Base case
8 z4 [' d( O" P) V  return a[ left ] > 0 ? a[ left ] : 0;& s4 Z+ z4 z0 b* Z* `
  int maxLeftSum  = maxSumRec( a, left, center );! V7 z0 f7 W: P
  int maxRightSum = maxSumRec( a, center + 1, right );! ^+ U0 K6 d5 ~; Q9 l
  for( int i = center; i >= left; i– )' k! \$ C) [" l+ w1 x7 s) E& E
  {
+ p6 ?1 y) N6 I  leftBorderSum += a[ i ];7 x$ O3 A% M) o
  if( leftBorderSum > maxLeftBorderSum )
6 _$ B: G) z$ r  ]" Y0 f  maxLeftBorderSum = leftBorderSum;$ G0 ?7 K3 |$ r- f9 f/ r

8 ~& M* r% f$ C, l' S. W- w  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:Weiss的java数据结构与问题解决完整代码讲解

</p>  for( int i = center + 1; i  maxRightBorderSum )6 N5 r& X8 [3 H) n4 _6 f* s- O
  maxRightBorderSum = rightBorderSum;
9 d1 N! Y1 l: Z: K( s. o  }
6 `6 U# c( H. @) O& K  return max3( maxLeftSum, maxRightSum,* P; e4 v; |) K: s3 K% \
  maxLeftBorderSum + maxRightBorderSum );  M7 A! t  f# C- d+ b5 ]3 [
  }
3 ^1 _8 t8 i/ t4 }6 z0 B /**
8 ?/ ~$ ]3 J* z* S$ o) ~* }  * Return maximum of three integers.
) @2 A/ ]- J# R/ l7 j4 W  */
6 L0 i+ K! A1 T5 @  private static int max3( int a, int b, int c )" @) w- m& c! M0 D0 W
  {
+ j  e& F3 k" C( c" K# V" H  return a > b ? a > c ? a : c : b > c ? b : c;* y& c' O, O& u9 M
  }
& _0 F% s9 b. _) p  /**
# y3 d( u; {6 @0 w+ q* x/ ], m  * Driver for divide-and-conquer maximum contiguous6 v( Z5 o' Q/ H/ t0 q# d* V% X
  * subsequence sum algorithm.& O. R( D* r. M9 _, L" Y: c8 _; ~
  */
0 O$ H5 B: R) g: l) u  public static int maxSubSum4( int [ ] a )
, W7 P7 D* I2 B  {, K' y- g; I: A( n+ z# O0 u) v  [5 u
  return a.length > 0 ? maxSumRec( a, 0, a.length - 1 ) : 0;' D+ n+ ?9 G& c/ ^( ~$ w
  }) ]- c: ~  X8 h. Y9 Z
  public static void getTimingInfo( int n, int alg )
$ u, {" l3 V) j  {  K6 G& o" N  }! K. P- U- j
  int [] test = new int[ n ];
% r; D( @& a9 y0 j  D/ y+ p  long startTime = System.currentTimeMillis( );;
+ \7 G! X* L5 B- Q7 F  long totalTime = 0;% J( n  @" Z3 ^% [
  int i;5 ?/ A: L/ |' W% ^1 C& d2 p
  for( i = 0; totalTime < 4000; i++ )
) w/ Z9 \3 E4 H4 @% y3 H; M* ^  {
0 [% q) L% c* F/ z' p; i' y  for( int j = 0; j < test.length; j++ )! K- h" P' `4 ~& a8 z5 ^
  test[ j ] = rand.nextInt( 100 ) - 50;
! L  O* }/ R# H  switch( alg )# w2 j+ f7 b" D) u
  {) A0 ?/ _1 v  V3 \  s6 e
  case 1:5 V8 i8 E! n* X8 @: s3 I1 y
  maxSubSum1( test );* j) P9 H) P+ l* R2 A
  break;
6 p: `5 r0 c1 t% l4 {# ~* |/ H  case 2:  K2 Q! R" C0 N  y# p$ Z
  maxSubSum2( test );
% e1 H$ b9 R' T. ~+ h1 ~& Q5 |  break;
. e2 R7 u; b- l  z  case 3:
/ O; s' ?4 M& @5 ?, X  maxSubSum3( test );  z" U/ |4 R3 M" U4 U
  break;# v! D& `" z1 H9 C. g  C  w5 ~2 ^) k
  case 4:
1 N3 g; P+ q7 i  maxSubSum4( test );6 c8 t# x& R- Z2 D# |+ F  @# H
  break;* v8 {; X$ |. m! L! R
  }- h5 f& D8 z, x' D5 g% j. L
  totalTime = System.currentTimeMillis( ) - startTime;
0 Q3 b8 y: L7 P: g1 b% E  }7 U  i; W, \* Z, T" l
  System.out.println( ”Algorithm #” + alg + ”t”
& p; u* w  I3 _- ]. W5 b2 ]  + ”N = ” + test.length; P/ I$ z# n+ j8 S1 f+ {# \
  + ”ttime = ” + ( totalTime * 1000 / i ) + ” microsec” );6 R9 s9 R9 v# l" `3 }4 `$ E: t

' D$ P- [7 I0 L% W; O" ^9 j  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:47 | 显示全部楼层

JAVA认证:Weiss的java数据结构与问题解决完整代码讲解

</p>  private static Random rand = new Random( );
2 E( T, ?" w7 K9 N/ D* T! x# V8 @  /**/ w# \7 Q5 R! W; A* D
  * Simple test program.
& n( [% V2 q3 c5 O  */
1 n! I+ H+ o4 X& b- M8 z& ~  public static void main( String [ ] args ). C( }, O2 z1 Q$ U
  {8 m7 f6 R7 k" T* ?( H/ R, I% U2 N
  int a[ ] = { 4, -3, 5, -2, -1, 2, 6, -2 };
9 t  `( m1 y+ m+ A' V% k  int maxSum;
" i" d0 P7 J" v6 J$ u  maxSum = maxSubSum1( a );
2 {- T; D4 ?3 @- [  System.out.println( ”Max sum is ” + maxSum + ”; it goes”$ v5 ~" K9 n8 G! J$ Z( k. X* D
  + ” from ” + seqStart + ” to ” + seqEnd );! H  H: X/ e" z
  maxSum = maxSubSum2( a );
& K: g" b2 P" k6 ~! a  System.out.println( ”Max sum is ” + maxSum + ”; it goes”
! V# ~9 \; k% `. w% \  + ” from ” + seqStart + ” to ” + seqEnd );* V) q  \# `8 j* G4 G
  maxSum = maxSubSum3( a );
9 b& w* C6 D# [: P, p  System.out.println( ”Max sum is ” + maxSum + ”; it goes”) l( B4 V3 K1 ]. L) G, [7 |8 s4 w
  + ” from ” + seqStart + ” to ” + seqEnd );& C. ?7 P0 _* P
  maxSum = maxSubSum4( a );% j1 L& e/ u0 U; A. G7 [9 G: N6 U
  System.out.println( ”Max sum is ” + maxSum );3 k3 \3 `$ W, X/ p$ N8 D
  // Get some timing info' @' y& [6 W! B+ H0 l- B
  for( int n = 10; n = 1; alg– )9 r% _9 ~7 R* V( ^" |
  {
( M: u: c5 ?% X& {% U) w) n  if( alg == 1 && n > 50000 )
! N5 E! [( M. B  continue;3 ?( q, G; Q& m
  getTimingInfo( n, alg );
; l6 Y* v0 {2 B8 u  }
' z$ `. B6 n& \5 ?% t) R; E  j/ l5 m  }" M! S. n( z' a
  }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-8 06:24 , Processed in 0.283978 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表