+ }9 u3 r% X) f, A' y1) 从图2 - 2中的二叉树由根至叶的过程中把一个大问题划分成许多个小问题,小问题的大小为1或2。9 i( a. u/ S. e2 d
" Y& l* S$ Q: A/ i8 q; F
2) 比较每个大小为2的问题中的金块,确定哪一个较重和哪一个较轻。在节点D、E、F和G上完成这种比较。大小为1的问题中只有一个金块,它既是最轻的金块也是最重的金块。7 O0 S+ _; H& @# J, O0 Q7 J
( A5 ^* r1 t3 q4 c
3) 对较轻的金块进行比较以确定哪一个金块最轻,对较重的金块进行比较以确定哪一个金块最重。对于节点A到C执行这种比较。 7 k* s4 m' F T& ]+ O+ e; K6 ?5 }) N3 ?& y1 m" r7 n
根据上述步骤,可以得出程序1 4 - 1的非递归代码。该程序用于寻找到数组w [ 0 : n - 1 ]中的最小数和最大数,若n < 1,则程序返回f a l s e,否则返回t r u e。 - O1 v Y# P S" m4 a' c1 q* G0 ?8 n. H" k6 s
当n≥1时,程序1 4 - 1给M i n和M a x置初值以使w [ M i n ]是最小的重量,w [ M a x ]为最大的重量。 # A2 ]. [8 `. d; x: k) N, H3 }7 F: Z* X' q
首先处理n≤1的情况。若n>1且为奇数,第一个重量w [ 0 ]将成为最小值和最大值的候选值,因此将有偶数个重量值w [ 1 : n - 1 ]参与f o r循环。当n 是偶数时,首先将两个重量值放在for 循环外进行比较,较小和较大的重量值分别置为Min和Max,因此也有偶数个重量值w[2:n-1]参与for循环。 L2 K8 F: c2 D% [
2 J: I4 J7 w8 u在for 循环中,外层if 通过比较确定( w [ i ] , w [ i + 1 ] )中的较大和较小者。此工作与前面提到的分而治之算法步骤中的2) 相对应,而内层的i f负责找出较小重量值和较大重量值中的最小值和 ; i7 ^% \& s3 C( ^! u! O- n E! C0 A9 r3 Y! J+ S3 @3 V1 g5 P
最大值,这个工作对应于3 )。for 循环将每一对重量值中较小值和较大值分别与当前的最小值w [ M i n ]和最大值w [ M a x ]进行比较,根据比较结果来修改M i n和M a x(如果必要)。: F/ m! e9 k# G8 f
9 J5 d m" V6 E( B" F下面进行复杂性分析。注意到当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次。 + _! c+ d/ T' c% j6 T H" a5 W+ I # D0 @. Z; I, I& @" T0 ^程序14-1 找出最小值和最大值的非递归程序 ; S# L) ?5 s: f4 [) J3 \. d% M8 c# ]5 k: k! g% w7 Q m/ A
template<CLASS T>4 \! X: G7 j: {5 W
* j) T# |; n. ?5 V" ]4 w
bool MinMax(T w[], int n, T& Min, T& Max)1 c* {# Q1 C0 h; O
/ E8 N" m- V" a' ~{// 寻找w [ 0 : n - 1 ]中的最小和最大值( ^3 |- e9 P- e4 m+ b
2 a* }$ T1 k) m9 H* Y7 U( [4 C1 R
// 如果少于一个元素,则返回f a l s e& j8 K }4 p4 j) ]+ \* w" r
, t8 A7 ?/ E: v6 n7 |3 h. b
// 特殊情形: n <= 1 ; e; P0 B3 n% b ^1 V+ B1 o 0 J" m5 k4 }% R0 d: b Y1 O/ Y" O% qif (n < 1) return false;5 Z& G3 a# @) c- E5 Z
j. J" u% f+ r, q6 R) C5 yif (n == 1) {Min = Max = 0; : L- n0 O# g( w& |" R. e1 y8 [7 O; ~- P
return true;} ) I. u; C' c" l$ n; [+ w# c, W) | 0 U4 P: T2 q+ _. u/ /对Min 和M a x进行初始化 1 M3 i3 t( K0 n$ C- J( H 7 {7 m% n: X7 r* \9 g# Uint s; // 循环起点 2 X& z! o2 f, w* v8 U8 {' s" p3 W. a6 U4 u
if (n % 2) {// n 为奇数1 I- Y! p% P" L; {2 V
1 w& ~5 M1 [7 z1 L+ Y5 O7 H; e
Min = Max = 0; + y. D! ^8 n9 Y0 S) Y) D% X K. Y$ |0 w+ | x5 k* r$ os = 1;}; I' M& D8 G- Z# m
4 R' J" v* w$ y/ i5 |8 ?# u+ relse {// n为偶数,比较第一对 / Y! a! I& r$ r/ I! { [/ T 4 F, s$ P( D1 jif (w[0] > w[1]) { $ g8 \0 X# W% r7 ]# K4 A2 B0 w+ u& b/ S, e: ]$ Z
Min = 1; 1 B, D, R/ s1 M4 {% p4 q x6 E/ v1 @$ _) D
Max = 0;} a) H% C* w1 e& ~0 u C9 d. N/ E# Y5 h6 x* [4 u1 A
else {Min = 0;8 {, u) o9 L( H
! [9 y6 |( S# Y; M" R# a( A4 o2 T
Max = 1;}+ `( a1 B; H% i+ Y# `& U( C
q) V9 K Z( ?1 q( |+ j5 U
s = 2;} ( P2 L! v% |: s # S0 \1 f& c6 w6 S v: D// 比较余下的数对 4 j$ \( O0 `, O ) ]/ g0 g1 J; F" Ofor (int i = s; i < n; i += 2) { 1 W0 w) y5 P" Y , G' v; m7 g) y// 寻找w 和w [ i + 1 ]中的较大者 ; Z. V1 e2 d+ s4 Y7 b' } ) a6 s* L1 u# a$ U) F// 然后将较大者与w [ M a x ]进行比较9 T' H' L/ b: I3 l
* b3 E+ v; ~1 N2 |* ~" z$ o0 ]% f+ _// 将较小者与w [ M i n ]进行比较5 s1 w b$ s5 C" U
. T6 o& `* i3 i
if (w > w[i+1]) {# ~; Y% b/ c$ Y4 W# u
9 N, d* L8 y1 W6 m# U
if (w > w[Max]) Max = i; 0 A7 f2 b4 S$ q ]; r n4 E" x3 _6 R4 e* yif (w[i+1] < w[Min]) Min = i + 1;}! J* b7 \3 H' I
: M& I' o- ^( {. e" Q& `3 d& velse { 0 j% p6 D- [( {/ {0 f7 Q4 v. z- |: M% G0 U( b. W
if (w[i+1] > w[Max]) Max = i + 1; & F. B& R7 d: ^+ B3 O; `: ^0 I# j- A, s% ` t2 U
if (w < w[Min]) Min = i;}- M+ g& R9 G3 C( `
5 o( n$ a$ e% \2 G5 S+ o3 ~/ n*6. 编写S t r a s s e n矩阵乘法程序。利用不同的k 值(见公式(1 4 - 6))进行实验,以确定k 为何值时程序性能最佳。比较程序及程序2 - 2 4的运行时间。可取n 为2的幂来进行比较。+ C0 L; A; l- S; o; I
3 B: @) R6 D0 F" z7. 当n 不是2的幂时,可以通过增加矩阵的行和列来得到一个大小为2的幂的矩阵。假设使用最少的行数和列数将矩阵扩充为m 阶矩阵,其中m 为2的幂。6 \8 B& `& M( \
5 I1 ~2 S: n a! v8 o* C. D1 A
1) 求m / n。8 b5 W8 Z: N+ M
/ H! a7 K( C. X1 G) R% N
2) 可使用哪些矩阵项组成新的行和列,以使新矩阵A' 和B' 相乘时,原来的矩阵A和B相乘的结果会出现在C' 的左上角? / | Q9 b: |+ U0 P; Y1 V' |" }& T( a# E
3) 使用S t r a s s e n方法计算A' * B' 所需要的时间为(m2.81 )。给出以n 为变量的运行时间表达式。 </P>