! i) a1 A6 N$ G, F y* u& t根据上述步骤,可以得出程序1 4 - 1的非递归代码。该程序用于寻找到数组w [ 0 : n - 1 ]中的最小数和最大数,若n < 1,则程序返回f a l s e,否则返回t r u e。 + w q! ?4 Y# F. _* m! i % ?4 `0 F9 y; D9 v& T* j当n≥1时,程序1 4 - 1给M i n和M a x置初值以使w [ M i n ]是最小的重量,w [ M a x ]为最大的重量。 " r: v- C& b; m1 q! D6 h" w - E6 N8 P- d/ U7 I# c( H r/ k首先处理n≤1的情况。若n>1且为奇数,第一个重量w [ 0 ]将成为最小值和最大值的候选值,因此将有偶数个重量值w [ 1 : n - 1 ]参与f o r循环。当n 是偶数时,首先将两个重量值放在for 循环外进行比较,较小和较大的重量值分别置为Min和Max,因此也有偶数个重量值w[2:n-1]参与for循环。 ! }* l1 |2 D+ u( r3 g4 G0 ~ M& U0 h+ q, ~4 }- s在for 循环中,外层if 通过比较确定( w [ i ] , w [ i + 1 ] )中的较大和较小者。此工作与前面提到的分而治之算法步骤中的2) 相对应,而内层的i f负责找出较小重量值和较大重量值中的最小值和, A9 h" h. S1 d. Q
' F2 a' h7 @, I最大值,这个工作对应于3 )。for 循环将每一对重量值中较小值和较大值分别与当前的最小值w [ M i n ]和最大值w [ M a x ]进行比较,根据比较结果来修改M i n和M a x(如果必要)。/ u) z# |+ P$ l7 e
1 c- N" M, W* Q. d
下面进行复杂性分析。注意到当n为偶数时,在for 循环外部将执行一次比较而在f o r循环内部执行3 ( n / 2 - 1 )次比较,比较的总次数为3 n / 2 - 2。当n 为奇数时,f o r循环外部没有执行比较,而内部执行了3(n-1)/2次比较。因此无论n 为奇数或偶数,当n>0时,比较的总次数为「3n/2ù-2次。) T5 w' S* T2 w k
2 z& l& q( X9 o3 f! |* O& N
程序14-1 找出最小值和最大值的非递归程序 ^' F& Y& o( ]2 |! U
; [9 j) O/ {, E# Y* [
template<CLASS T> 8 ]" @+ k! |$ u4 ^ ! ~9 a' d4 d' `6 xbool MinMax(T w[], int n, T& Min, T& Max)3 D" R/ G; q9 O3 c0 A
; {# B# @' k* q' G7 z6 v5 U7 c
{// 寻找w [ 0 : n - 1 ]中的最小和最大值 ; F/ u$ H' T) l2 a# J. j& E$ Z1 i- P7 i* \0 `* z
// 如果少于一个元素,则返回f a l s e3 w4 c) i* p% k* e2 Q7 l+ w3 e% T7 R
0 c! h* x* j3 k/ [
// 特殊情形: n <= 1 @6 K1 `% Y5 i5 p3 e1 g
$ M% k+ R3 K2 W. k. D; C! y) q! N
if (n < 1) return false; ) I" Z' W; {6 Y5 _ c! w( y% G$ e6 A- f0 Q z6 T5 z! F
if (n == 1) {Min = Max = 0;: i/ y$ D# z. p# c
* X1 G2 O# V: c
return true;}* F( h7 m0 V- j6 l
% K9 x9 P& z, S' k) a, Z. E/ /对Min 和M a x进行初始化 ]+ b6 A/ A8 ~) {! u 3 {2 l; u. |- w. ?: J) Z3 uint s; // 循环起点 - f+ y q5 |, N! _4 G+ B9 u$ s4 O( h! n1 y2 U9 q( T
if (n % 2) {// n 为奇数 * q% l6 n; |2 A2 Z S( g% O' y+ C. H V h' m; C7 a' @$ Q) R
Min = Max = 0;8 @* z5 J5 i, J. }
& V8 B" `' ~& [s = 1;} 9 J+ W6 G n: ~; {. C w, C8 U7 p/ J8 \2 ]3 O
else {// n为偶数,比较第一对 8 P! L: q, M7 b 2 u3 t2 C" w/ a. r6 dif (w[0] > w[1]) { 8 ~" L. {9 E2 g* J9 p4 B- P4 k' m7 Y) _7 c
Min = 1; ) q% V3 _7 k" E8 D2 s" q 9 J" `5 _. g, E2 _2 C' t6 |3 X$ HMax = 0;}% F0 y4 e& ]8 Z8 G9 ~
8 v* E! B r: U: j+ x( J& p
else {Min = 0;, B; T8 M. i# R) b" E' ^7 | l& q( v
# [; e0 f! q* U- P B
Max = 1;} % j4 Y7 \% r& d; V$ j7 Q, x& {+ `6 g7 ^, n
s = 2;} + ]4 a2 j3 ]0 ?+ V: t, E; R% c$ ~0 Y8 U/ }0 q/ Y" E
// 比较余下的数对0 H, G1 \ ]# U3 Y
+ t0 U3 Q7 M9 Y G9 }$ zfor (int i = s; i < n; i += 2) {) ]1 V, V5 l# J# k; p# F
# ^" R4 R; I! w// 寻找w 和w [ i + 1 ]中的较大者 7 Z8 j& y. b/ v- R% p+ o) L2 ^5 _" C) S3 i* m3 k
// 然后将较大者与w [ M a x ]进行比较! N" |! ?6 P3 s5 C8 f4 }7 |
( a8 P0 d( Q6 Z) M// 将较小者与w [ M i n ]进行比较/ Q- \: O' W, n+ u% r
6 s+ U+ B! Z' z+ T" p/ E
if (w > w[i+1]) { 2 r7 g' Q7 d/ _5 F* x" @9 p3 Q1 i6 H9 q4 n$ S1 A0 x# \ k5 h
if (w > w[Max]) Max = i;' R8 X2 L B+ q- Y8 {3 @
6 e* p% \, J1 tif (w[i+1] < w[Min]) Min = i + 1;} $ k; s$ s9 J8 Y9 ^' D3 g5 V9 d2 M8 T7 O' _" L
else {' i& ^8 j" u, O9 F: L) l' x- h+ N
+ V) N. k5 r$ H0 a& P6 _
if (w[i+1] > w[Max]) Max = i + 1; 9 N# p6 i3 c" U: B/ {4 E, d, D3 K8 A6 E2 z
if (w < w[Min]) Min = i;}( A- n5 \* F/ \2 r% G% j
/ [# X* K. l9 l |/ C2 A*6. 编写S t r a s s e n矩阵乘法程序。利用不同的k 值(见公式(1 4 - 6))进行实验,以确定k 为何值时程序性能最佳。比较程序及程序2 - 2 4的运行时间。可取n 为2的幂来进行比较。' I, h4 ]9 b5 H5 a4 `
& k6 H& e. p5 F
7. 当n 不是2的幂时,可以通过增加矩阵的行和列来得到一个大小为2的幂的矩阵。假设使用最少的行数和列数将矩阵扩充为m 阶矩阵,其中m 为2的幂。 / C0 S+ w' {( w9 Q' Y& c: k( }
1) 求m / n。 6 X+ P8 I2 n8 Y# n0 y& C$ O; {! b1 V
2) 可使用哪些矩阵项组成新的行和列,以使新矩阵A' 和B' 相乘时,原来的矩阵A和B相乘的结果会出现在C' 的左上角?& F. s. {5 W' I1 @; H3 m
9 r Y4 J" v2 W
3) 使用S t r a s s e n方法计算A' * B' 所需要的时间为(m2.81 )。给出以n 为变量的运行时间表达式。 </P>