算法导论分治思想—大数乘法矩阵相乘残缺棋盘
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论分治思想—大数乘法矩阵相乘残缺棋盘相关的知识,希望对你有一定的参考价值。
这里写自定义目录标题
分治法概述
在分而治之的方法中,一个问题被划分为较小的问题,然后较小的问题被独立地解决,最后较小问题的解决方案被组合成一个大问题的解决。
通常,分治算法有三个部分:
- 分解:将问题划分为若干子问题,这些子问题是同一问题的较小实例。
- 解决:通过递归地解决子问题来征服它们。如果它们足够小,则将子问题作为基本情况解决。
- 合并:将子问题的解决方案合并为原始问题的解决方法。
特点
分治方法支持并行性,因为子问题是独立的。因此,使用该技术设计的算法可以在多处理器系统上或在不同的机器上同时运行。在这种方法中,大多数算法都是使用递归设计的,因此内存管理非常高。对于递归函数堆栈,需要存储函数状态。
主方法解递归式
分治法一个很重要的步骤就是求解递归式,大多数时候可以用主方法求解,以下举几个例子:
- 首先,有如下主定理:
-
T
(
n
)
=
3
T
(
n
2
)
+
n
lg
n
T(n)=3T(\\cfrac n2)+n\\lg n
T(n)=3T(2n)+nlgn
- 符合主定理第一种情况: n log n = O ( n 1 + ϵ ) , f ( n ) = n lg n = O ( n log 2 3 − ϵ ) n\\log n=O(n^1+\\epsilon),f(n)=n\\lg n=O(n^\\log_23-\\epsilon) nlogn=O(n1+ϵ),f(n)=nlgn=O(nlog23−ϵ)
- 故 T ( n ) = Θ ( n lg 3 ) T(n)=\\Theta(n^\\lg3) T(n)=Θ(nlg3)
-
T
(
n
)
=
3
T
(
n
3
)
+
lg
n
T(n)=3T(\\cfrac n3)+\\lg n
T(n)=3T(3n)+lgn
- 符合主定理第一种情况, n log 3 3 = n , f ( n ) = lg n = O ( n 1 − ϵ ) n^\\log_33=n,f(n)=\\lg n=O(n^1-\\epsilon) nlog33=n,f(n)=lgn=O(n1−ϵ)
- 故 T ( n ) = Θ ( n ) T(n)=\\Theta(n) T(n)=Θ(n)
-
T
(
n
)
=
4
(
n
2
)
+
n
2
+
n
lg
n
+
n
T(n)=4(\\cfracn2)+n^2+n\\lg n+n
T(n)=4(2n)+n2+nlgn+n
- 符合主定理第二种情况, n log 2 4 = n 2 , k = 0 , f ( n ) = n 2 + n lg n + n = O ( n 2 ) n^\\log_24=n^2,k=0,f(n)=n^2+n\\lg n+n=O(n^2) nlog24=n2,k=0,f(n)=n2+nlgn+n=O(n2)
- 故 T ( n ) = Θ ( n 2 lg n ) T(n)=Θ(n^2\\lg n) T(n)=Θ(n2lgn)
-
T
(
n
)
=
9
T
(
n
3
)
+
n
3
log
n
T(n)= 9T(\\cfracn3)+n^3\\log n
T(n)=9T(3n)+n3logn
- 符合主定理第三种情况, n log 3 9 = n 2 , f ( n ) = n 3 log n = Ω ( n 2 + ϵ ) n^\\log_39=n^2,f(n)=n^3\\log n=Ω(n^2+\\epsilon) nlog39=n2,f(n)=n3logn=Ω(n2+ϵ)
- 对于 c = 1 3 , 9 ( ( n 3 ) 3 log ( n 3 ) ) = n 3 3 ( log n − log 3 ) = n 3 log n 3 − n 3 log 3 3 < n 3 log n 3 对于c=\\cfrac13,9((\\cfracn3)^3\\log (\\cfracn3))=\\cfracn^33(\\log n - \\log 3)=\\cfracn^3 \\log n3-\\cfracn^3 \\log33<\\cfracn^3 \\log n3 对于c=31,9((3n)3log(3n))=3n3(logn−log3)=3n3logn−3n3log3<3n3logn
- 故 T ( n ) = Θ ( n 3 log n ) T(n)=\\Theta(n^3\\log n) T(n)=Θ(n3logn)
大数相乘问题
-
输入:两个n位整数X和Y。
-
输出:X和Y的乘积。
-
示例:X=1980 Y=2315
-
这是你在小学学的算法。注意这需要O(n2) 时间
分治算法
-
按如下方式分解XY,得到一个新的计算公式,但这个公式仍然要计算:ac、ad、bc、bd四个乘式
-
因此它的递归式为:
-
运用主方法可以求出,递归式的解为T(n)=O(n2)。与原始方法相比,该方法没有显著改进。为了减少时间复杂性,我们必须减少乘法次数
-
修改计算公式如下:
-
最后两个XY乘法方案的复杂度为O(nlog3),但考虑到a+b,c+d可能得到n+1位的结果,这使得问题的规模更大,因此没有选择第三个方案。
-
可以列出如下递归式:
-
解得T(n)=O(nlog3)=O(n1.59)。
矩阵相乘
- 让我们考虑两个矩阵A和B。我们想通过乘以A和B来计算得到的矩阵C。
- 朴素方法是如果A=(aij)和B=(bij)是n×n的矩阵,那么在乘积C=A·B中,我们定义条目cij,对于i,j=1,2,。。。,n、 通过 c i j = ∑ k = 1 n a i k ⋅ b k j cij=\\sum^n_k=1a_ik·b_kj cij=∑k=1naik⋅bkj。
- 我们必须计算n2个矩阵条目,每个条目都是n个值的总和。
- 我们假设整数运算需要O(1)时间。该算法中有三个for循环,一个嵌套在另一个循环中。因此,该算法需要O(n3)时间来执行
分治算法
下面是两个方阵相乘的简单除法。
- 将矩阵A和B分成4个子矩阵,大小为N/2×N/2,如下图所示。
- 递归计算以下值
- 在上述方法中,我们对大小为N/2×N/2的矩阵进行了8次乘法运算和4次加法运算。两个矩阵相加需要O(n2) 时间。因此,时间复杂度为T(n)= 8T(n/2)+O(n2) 。根据主定理,上述方法的时间复杂度为 O(n3),不幸的是,这与上述朴素方法相同。简单的分治也会导致O(n3),有更好的方法吗?
- 在上述分治的方法中,高时间复杂度的主要组成部分是8个递归调用。Strassens方法的思想是将递归调
以上是关于算法导论分治思想—大数乘法矩阵相乘残缺棋盘的主要内容,如果未能解决你的问题,请参考以下文章