2
2
(Divide-and-Conquer) (Divide): .(Conquer): .(Combine): () . (top-down) .
2
(Binary Search): : n S x .: n, S[1..n], x: locationout - x S . x S 0:x , , ! :: x , .: x .: ( )
2
(Binary Search): index location (index low, index high) {index mid;
if (low > high) return 0; // else { mid = (low + high) / 2 // ( ) if (x == S[mid])return mid; // else if (x < S[mid])return location(low, mid-1); // elsereturn location(mid+1, high); // }}locationout = location(1, n);...
2
locationout ? n, S, x . (recursive call) .
2
(recursive algorithm) () (tail recursion) - (iterative algorithm) . (activation records) , (). . (constant factor) () . ML Scheme .
2
: x S[mid] : n (= high - low + 1) while 2 , . : (1) ; (2) x 2 . () , 1 .
2
1: (recurrence) . n > 1 , n = 2k(k 1)
.......
2
.: :: n = 1, W(1) = 1 = lg 1 + 1.: 2 (power) n , W(n) = lg n + 1 .: W(2n) = lg(2n) + 1 . ,
2
2: - y , n , .
. .
2
n
mid
n/2 - 1
1
n/2
(n-1)/2
1
(n-1)/2
n .: : n = 1, .: n > 1, 1 < k < n k , .: n (, ),
2
n (, ),
2
(Mergesort): n .: n, n S[1..n]: S[1..n]: 27, 10, 12, 20, 25, 13, 15, 22
2
:
void mergesort (int n, keytype S[]) {const int h = n / 2, m = n - h;keytype U[1..h], V[1..m];
if (n > 1) { copy S[1] through S[h] to U[1] through U[h]; copy S[h+1] through S[n] to V[1] through V[m]; mergesort(h,U); mergesort(m,V); merge(h,m,U,V,S);}}
2
(Merge): .: (1) h, m, (2) U[1..h], V[1..m]: U V S[1..h+m]
2
: U[i] V[j] : 2 : h m: i = h, j = m -1 (loop) , h + m -1. , W(h,m) = h + m -1.
2
: merge : S n: W(h,m) = W(h) + W(m) + (h + m 1) . W(h) U , W(m) V , h + m - 1 . n 2k(k 1) , . :
2 , .
2
n 2 (power) .
. , , n = 2k , . , n = 2k .
2
(in-place sort) . . S U V . ? mergesort S U V . merge U V . mergesort . S n, U V n . . . n , , n ( ). .
2
(Mergesort): n .: n, n S[1..n]: S[1..n]:void mergesort2 (index low, index high) { index mid; if (low < high) { mid = (low + high) / 2; mergesort2(low, mid); mergesort2(mid+1, high); merge2(low, mid, high); }} mergesort2(1, n); ...
2
(Merge): .: (1) low, mid, high, (2) S[low..high], S[low..mid] S[mid+1..high] .: S[1..high]
2
(The Master Theorem)a b 1 , f(n) , n T(n) .
T(n) (asymptotic bound) .1. > 0 , 2. , . 3. > 0 , , c < 1 n , , . , .
2
a = 9, b = 3, f(n) = n, , = 1 , . 1 , .
a = 1, b = , f(n) = 1, , . 2 , .
2
a = 3, b = 4, f(n) = n lg n, , 0.2 , = 1 , . 3 , n , 1 c . , , n . .
a = 2, b = 2, f(n) = nlgn, , . 3 , n , 1 c . , n c . , , c . . .
2
, k 0 k f(n) . ( ) 4 .
. .
2
(Quicksort)1962 (C.A.R. Hoare) (Quicksort) . . (partition exchange sort) .: 15 22 13 27 12 10 20 25
2
: n : n > 0, n S[1..n]: S[1..n]:void quicksort (index low, index high) {index pivotpoint;if (high > low) { partition(low,high,pivotpoint); quicksort(low,pivotpoint-1); quicksort(pivotpoint+1,high);}}
2
: S[i] key : , n = high - low + 1: , T(n) = n - 1.
2
: S[i] key : S , n: . ? () , n 0 , n-1 . ,, T(0) = 0, . T(n) = T(n - 1) + n - 1, n > 0 T(0) = 0
2
, T(n) = T(n - 1) + n - 1 T(n - 1) = T(n - 1) + n - 2 T(n - 2) = T(n - 3) + n - 3 ... T(2) = T(1) + 1 T(1) = T(0) + 0 T(0) = 0
, . ? , .
2
n , .: (): n = 0 ,: 0 k < n k ,: pivotpoint p
p 1 .
,
.
2
: S[i] key : S , n: . 1 n , . , . p , p [A(p - 1) + A(n - p)], n - 1, .
2
n ,
n n - 1 ,
(1) (2) ,
,
,
, .
,...
2
,
. ln n = logen,
, an 2 ln n. ,
2
I:: : , n : . II:: : , n : .
2
2 2 : : 2 2 A B (product) C,
(Strassen) :
: 8 4 , 7 18 / . ! .
2
n n : : n 2 , 4 (submatrix) . n n A B C:
(Strassen) :
2
I: : , n : 1 . ( .)
,
. . 3 1 .
2
II: / : , n : 1 .
3 1 .
2
(n2) .
.
2
n 2 , n : (exponential)
n n , n/c . c . : (nlg n)
2
2 , , , 1999 2 , , , 1999