好看响应式网站模板,.net 购物网站开发源代码,腾讯服务器租用,wordpress为什么安装不了这里写自定义目录标题分治法概述特点大数相乘问题分治算法矩阵相乘分治算法残缺棋盘分治算法分治法概述
在分而治之的方法中#xff0c;一个问题被划分为较小的问题#xff0c;然后较小的问题被独立地解决#xff0c;最后较小问题的解决方案被组合成一个大问题的解决。 通常…
这里写自定义目录标题分治法概述特点大数相乘问题分治算法矩阵相乘分治算法残缺棋盘分治算法分治法概述
在分而治之的方法中一个问题被划分为较小的问题然后较小的问题被独立地解决最后较小问题的解决方案被组合成一个大问题的解决。 通常分治算法有三个部分
分解将问题划分为若干子问题这些子问题是同一问题的较小实例。解决通过递归地解决子问题来征服它们。如果它们足够小则将子问题作为基本情况解决。合并将子问题的解决方案合并为原始问题的解决方法。
特点
分治方法支持并行性因为子问题是独立的。因此使用该技术设计的算法可以在多处理器系统上或在不同的机器上同时运行。在这种方法中大多数算法都是使用递归设计的因此内存管理非常高。对于递归函数堆栈需要存储函数状态。
大数相乘问题 输入两个n位整数X和Y。 输出X和Y的乘积。 示例X1980 Y2315 这是你在小学学的算法。注意这需要O(n2) 时间
分治算法 按如下方式分解XY得到一个新的计算公式但这个公式仍然要计算ac、ad、bc、bd四个乘式 因此它的递归式为 运用主方法可以求出递归式的解为T(n)O(n2)。与原始方法相比该方法没有显著改进。为了减少时间复杂性我们必须减少乘法次数 修改计算公式如下 最后两个XY乘法方案的复杂度为O(nlog3)但考虑到abcd可能得到n1位的结果这使得问题的规模更大因此没有选择第三个方案。 可以列出如下递归式 解得T(n)O(nlog3)O(n1.59)。
矩阵相乘
让我们考虑两个矩阵A和B。我们想通过乘以A和B来计算得到的矩阵C。朴素方法是如果A(aij)和B(bij)是n×n的矩阵那么在乘积CA·B中我们定义条目cij对于ij1,2。。。n、 通过cij∑k1naik⋅bkjcij\sum^n_{k1}a_{ik}·b_{kj}cij∑k1naik⋅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方法的思想是将递归调用的数量减少到7。Strassens方法与上述简单除法和征服法相似因为该方法也将矩阵划分为大小为N/2×N/2的子矩阵如上图所示但在Strassens法中使用以下公式计算结果的四个子矩阵。Strassen算法定义了新的矩阵仅使用7次乘法(对每个MkM_kMk)而不是8次。我们现在可以用Mk表示Ci两个矩阵的加法和减法需要O(n2)时间。因此时间复杂性可以写成根据主定理上述方法的时间复杂度为O(nlog7)近似于O(n2.8074) Hopcroft和Kerr证明(1971)在两个2×2矩阵的乘法中需要7次乘法。因此为了进一步提高矩阵乘法复杂度的时间它不能再基于计算2×2矩阵的7倍乘法的方法。也许应该研究3×3或5×5矩阵的更好算法。目前最佳计算时间上限为O(n 2.376)。
残缺棋盘
定义有缺陷的棋盘是一块2k×2k的正方形棋盘正好有一个有缺陷的正方形例子要求用一种化合物来平铺(覆盖)所有非残缺方格。 化合物是一种L形物体可以覆盖棋盘的三个方格。有四个方向
分治算法
分成四个小棋盘。其中一个是有缺陷的棋盘。通过在其他三个棋盘的共同角落放置一个三分之一使其有缺陷。递归平铺四个有缺陷的棋盘设n2kd是常数。 设t(k)是平铺2k×2k有缺陷棋盘所花费的时间。然后这里c是常数表示为化合物找到合适位置和旋转化合物以获得所需形状所花费的时间。由于每个网格必须花费θ(1)时间来放置每个化合物因此不可能得到一个更快的算法来解决这个问题