当前位置: 首页 > news >正文

算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘

这里写自定义目录标题

  • 分治法概述
  • 特点
    • 大数相乘问题
      • 分治算法
    • 矩阵相乘
      • 分治算法
    • 残缺棋盘
      • 分治算法

分治法概述

在分而治之的方法中,一个问题被划分为较小的问题,然后较小的问题被独立地解决,最后较小问题的解决方案被组合成一个大问题的解决。
通常,分治算法有三个部分:

  • 分解:将问题划分为若干子问题,这些子问题是同一问题的较小实例。
  • 解决:通过递归地解决子问题来征服它们。如果它们足够小,则将子问题作为基本情况解决。
  • 合并:将子问题的解决方案合并为原始问题的解决方法。

特点

分治方法支持并行性,因为子问题是独立的。因此,使用该技术设计的算法可以在多处理器系统上或在不同的机器上同时运行。在这种方法中,大多数算法都是使用递归设计的,因此内存管理非常高。对于递归函数堆栈,需要存储函数状态。

大数相乘问题

  • 输入:两个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、 通过cij=∑k=1naik⋅bkjcij=\sum^n_{k=1}a_{ik}·b_{kj}cij=k=1naikbkj
  • 我们必须计算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形物体,可以覆盖棋盘的三个方格。
    • 有四个方向:在这里插入图片描述

分治算法

  • 分成四个小棋盘。
  • 其中一个是有缺陷的棋盘。在这里插入图片描述
  • 通过在其他三个棋盘的共同角落放置一个三分之一,使其有缺陷。
  • 递归平铺四个有缺陷的棋盘在这里插入图片描述
  • 设n=2k,d是常数。 设t(k)是平铺2k×2k有缺陷棋盘所花费的时间。然后在这里插入图片描述
  • 这里,c是常数,表示为化合物找到合适位置和旋转化合物以获得所需形状所花费的时间。在这里插入图片描述
  • 由于每个网格必须花费θ(1)时间来放置每个化合物,因此不可能得到一个更快的算法来解决这个问题
http://www.lryc.cn/news/12794.html

相关文章:

  • Java【七大排序】算法详细图解,一篇文章吃透
  • Autosar OS IOC
  • 记录一次Binder内存相关的问题导致APP被杀的BUG排查过程
  • 设计模式(十)----结构型模式之适配器模式
  • 【数据结构】——队列
  • Android OTA升级常见问题的解决方法
  • 说说Hibernate
  • 目标检测论文阅读:DETR算法笔记
  • Golang sync.Once 源码浅析
  • C++面向对象(上)
  • 经常用但是不知道什么是BFC?
  • GO的临时对象池sync.Pool
  • 高精度算法一
  • 2023年全国最新食品安全管理员精选真题及答案1
  • C++入门:引用
  • SpringSecurity的权限校验详解说明(附完整代码)
  • Java-集合(5)
  • 研制过程评审活动(四)设计定型阶段
  • 【Linux】进程替换
  • LeetCode171-Excel表列序号(进制转换问题)
  • React SSR
  • 如何系统地优化页面性能
  • Vulnhub 渗透练习(八)—— THE ETHER: EVILSCIENCE
  • 华为OD机试题 - 水仙花数 2(JavaScript)| 代码+思路+重要知识点
  • 字符设备驱动基础(二)
  • 看见统计——第三章 概率分布
  • 【基于众包标注的语文教材句子难易度评估研究 论文精读】
  • 实例五:MATLAB APP design-APP登录界面的设计
  • 作用域和闭包:
  • Vue常见面试题?