过程
1.divide
2.conquer
3.combine
1.二分查找(binary search)
若未找到返回-1
T(n) = T(n/2) + O(1)
=O(lgn)
int binarysearch(int a[],int lft,int rth,int x){
int mid;
mid = (lft + rth) / 2;
if(lft<rth){
if(x == a[mid]) return mid;
else if(x<a[mid]) return binarysearch(a,lft,mid,x);
else return binarysearch(a,mid+1,rth,x);
}
else return -1;
}
2.计算x的n次幂
T(n) = T(n/2) + O(1)
= O(lgn)
double power(int x,int n){
double tmp;
if(n == 0) return 1;
tmp = power(x,n/2);
if(n%2) return tmp*tmp*x;
else return tmp*tmp;
}
3.斐波那契数计算
法一
F(n)=的整数部分+1,n为偶数时
F(n)=的整数部分,n为奇数时
法二
the Fibonacci numbers:
-
- T(n) = T(n/2) + O(1)
- = O(lgn)
int a[2][2];
int b[2][2] = {1,1,1,0};
void matrixmult(int a[2][2],int b[2][2]){
int c[4];
c[0] = a[0][0]*b[0][0] + a[0][1]*b[1][0];
c[1] = a[0][0]*b[0][1] + a[0][1]*b[1][1];
c[2] = a[1][0]*b[0][0] + a[1][1]*b[1][0];
c[3] = a[1][0]*b[0][1] + a[1][1]*b[1][1];
a[0][0] = c[0];
a[0][1] = c[1];
a[1][0] = c[2];
a[1][1] = c[3];
}
int fab(int n){
if(n == 0) return 1;
if(n == 1){
a[0][0] = 1;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 0;
}
else {
fab(n / 2);
matrixmult(a,a);
if(n % 2) matrixmult(a,b);
}
return a[0][1];
}
3.矩阵乘法
法一:直接用公式
乘积矩阵的元素如下面式子得出:
-
- T(n) = O(n^3)
- 法二:分块矩阵算法
将A, B, C分成相等大小的方块矩阵:
即
于是
= O(n^3)
法三:Strassen算法(只适用于方阵)
引入新矩阵
可得:
![O(n^{log_2 7}) = O(n^{2.807})](http://upload.wikimedia.org/math/3/6/e/36e413950cb0ad2419334b21f1d5b0b1.png)