分治法(divide-and-conquer)

过程

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:

\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^n = \begin{pmatrix} F_{n+1} & F_n \\ F_n & F_{n-1} \end{pmatrix}.
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.矩阵乘法

法一:直接用公式

乘积矩阵的元素如下面式子得出:

 (AB)_{ij} = \sum_{r=1}^n a_{ir}b_{rj} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj}.
T(n) = O(n^3)
法二:分块矩阵算法

ABC分成相等大小的方块矩阵:

 \mathbf{A} =\begin{bmatrix}\mathbf{A}_{1,1} & \mathbf{A}_{1,2} \\\mathbf{A}_{2,1} & \mathbf{A}_{2,2}\end{bmatrix}\mbox { , }\mathbf{B} =\begin{bmatrix}\mathbf{B}_{1,1} & \mathbf{B}_{1,2} \\\mathbf{B}_{2,1} & \mathbf{B}_{2,2}\end{bmatrix}\mbox { , }\mathbf{C} =\begin{bmatrix}\mathbf{C}_{1,1} & \mathbf{C}_{1,2} \\\mathbf{C}_{2,1} & \mathbf{C}_{2,2}\end{bmatrix}

\mathbf{A}_{i,j}, \mathbf{B}_{i,j}, \mathbf{C}_{i,j} \in F^{2^{n-1} \times 2^{n-1}}

于是

\mathbf{C}_{1,1} = \mathbf{A}_{1,1} \mathbf{B}_{1,1} + \mathbf{A}_{1,2} \mathbf{B}_{2,1}
\mathbf{C}_{1,2} = \mathbf{A}_{1,1} \mathbf{B}_{1,2} + \mathbf{A}_{1,2} \mathbf{B}_{2,2}
\mathbf{C}_{2,1} = \mathbf{A}_{2,1} \mathbf{B}_{1,1} + \mathbf{A}_{2,2} \mathbf{B}_{2,1}
\mathbf{C}_{2,2} = \mathbf{A}_{2,1} \mathbf{B}_{1,2} + \mathbf{A}_{2,2} \mathbf{B}_{2,2}
T(n) = 8T(n/2) + O(n^2)

       = O(n^3)

法三:Strassen算法(只适用于方阵)

引入新矩阵

\mathbf{M}_{1} := (\mathbf{A}_{1,1} + \mathbf{A}_{2,2}) (\mathbf{B}_{1,1} + \mathbf{B}_{2,2})
\mathbf{M}_{2} := (\mathbf{A}_{2,1} + \mathbf{A}_{2,2}) \mathbf{B}_{1,1}
\mathbf{M}_{3} := \mathbf{A}_{1,1} (\mathbf{B}_{1,2} - \mathbf{B}_{2,2})
\mathbf{M}_{4} := \mathbf{A}_{2,2} (\mathbf{B}_{2,1} - \mathbf{B}_{1,1})
\mathbf{M}_{5} := (\mathbf{A}_{1,1} + \mathbf{A}_{1,2}) \mathbf{B}_{2,2}
\mathbf{M}_{6} := (\mathbf{A}_{2,1} - \mathbf{A}_{1,1}) (\mathbf{B}_{1,1} + \mathbf{B}_{1,2})
\mathbf{M}_{7} := (\mathbf{A}_{1,2} - \mathbf{A}_{2,2}) (\mathbf{B}_{2,1} + \mathbf{B}_{2,2})

可得:

\mathbf{C}_{1,1} = \mathbf{M}_{1} + \mathbf{M}_{4} - \mathbf{M}_{5} + \mathbf{M}_{7}
\mathbf{C}_{1,2} = \mathbf{M}_{3} + \mathbf{M}_{5}
\mathbf{C}_{2,1} = \mathbf{M}_{2} + \mathbf{M}_{4}
\mathbf{C}_{2,2} = \mathbf{M}_{1} - \mathbf{M}_{2} + \mathbf{M}_{3} + \mathbf{M}_{6}
T(n) = 7T(n/2) + O(n^2)
O(n^{log_2 7}) = O(n^{2.807})



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值