Divide and Conquer(分治法):1.Divide;2.Conquer;3.Combine.
EX.Merge Sort:T(n)=2T(n/2)+Θ(n).
Binary Search(二分查找算法):find x in sorted array.每次都找中间那个,和目标值比较大小后,缩小范围。T(n)=T(n/2)+Θ(1)=Θ(lgn)
Powering a number(乘方问题):compute x^n.
Naive algorithm:x*x*...*x=x^n.-->Θ(n)
Divide-and-Conquer algorithm:相当于从x开始,一直平方到x^n。--》Θ(lgn)
Fbonacci numbers:
Bottom-up algorithm:Compute F0,F1,...,Fn -->Θ(n)
Recurrsive squaring:
theorem:
Fn+1 | Fn |
Fn | Fn-1 |
1 | 1 | ^n |
1 | 0 |
Matrix multiplication(矩阵乘法):
传统的矩阵分块:n*n matrix=2*2 block matrix of n/2 *n/2 submatrix
r | s |
t | u |
a | b | * | e | f |
c | d | g | h |
8次乘积,4次相加:T(n)=8T(n/2)+Θ(n^2)=Θ(n^3) (由主定理可得)
如果想要优化,可以想办法减小a的值,Strassan's algorithm特拉森算法,把a值从8减小到了7:
p1=a(f-h),p2=(a+b)h,p3=(c+d)e,p4=d(g-e),p5=(a+d)(e+h),p6=(b-d)(g+h),p7=(a-c)(e+f)
r=p5+p4-p2-p6,s=p1+p2,t=p3+p4,u=p5+p1-p3-p2
T(n)=7T(n/2)+Θ(n^2)=Θ(n^lg7)
VLSI layout:
如果是画成类似二叉树的形状,那么H(n)=H(n/2)+Θ(1)=Θ(lgn),W(n)=2W(n/2)+Ο(1)=Θ(n),Area=Θ((nlgn)
如果想让面积为线性,那么可以考虑改变高和宽的设置,让高和宽一致,H(n)=W(n)=Θ(n^1/2),设置为H型可以实现:L(n)=2L(n/4)+Θ(1)=Θ(n^1/2).
设计思路主要是由主定理中,a,b变量的值决定的。