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

这篇具有很好参考价值的文章主要介绍了算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分治法概述

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

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

特点

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

主方法解递归式

分治法一个很重要的步骤就是求解递归式,大多数时候可以用主方法求解,以下举几个例子:

  • 首先,有如下主定理:矩阵乘法 分治,笔记,算法,算法,矩阵,分治
  • T ( n ) = 3 T ( n 2 ) + n lg ⁡ n T(n)=3T(\cfrac {n}{2})+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 {n}{3})+\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(\cfrac{n}{2})+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(\cfrac{n}{3})+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=\cfrac{1}{3},9((\cfrac{n}{3})^3\log (\cfrac{n}{3}))=\cfrac{n^3}{3}(\log n - \log 3)=\cfrac{n^3 \log n}{3}-\cfrac{n^3 \log3}{3}<\cfrac{n^3 \log n}{3} 对于c=31,9((3n)3log(3n))=3n3(lognlog3)=3n3logn3n3log3<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=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次乘法(对每个 M k M_k Mk)而不是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)。文章来源地址https://www.toymoban.com/news/detail-780514.html

残缺棋盘

  • 定义:有缺陷的棋盘是一块2k×2k的正方形棋盘,正好有一个有缺陷的正方形
  • 例子:矩阵乘法 分治,笔记,算法,算法,矩阵,分治
  • 要求用一种化合物来平铺(覆盖)所有非残缺方格。
    • 化合物是一种L形物体,可以覆盖棋盘的三个方格。
    • 有四个方向:矩阵乘法 分治,笔记,算法,算法,矩阵,分治

分治算法

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

到了这里,关于算法导论【分治思想】—大数乘法、矩阵相乘、残缺棋盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 算法-大数相乘

    参考地址:https://blog.csdn.net/u010983881/article/details/77503519 1. 小学乘法代码如下: 2. 小学算法-累加算法   3. 分治算法-Karatsuba

    2024年01月23日
    浏览(71)
  • 【排序算法】 归并排序详解!分治思想!

    【排序算法】 归并排序详解!分治思想!

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! ​ 什么是归并?通过归并排序就能让数据有序?分治法是怎么在归并排序上应用的?本文将对归并排序进行细致入微的讲解,庖丁解牛般让你彻底明白归并排序! 归并排序(MERGE-SORT)是建

    2024年02月08日
    浏览(12)
  • 算法:分治思想处理归并递归问题

    算法:分治思想处理归并递归问题

    利用归并思想进行分治也是很重要的一种思路,在解决逆序对的问题上有很大的需求空间 于是首先归并排序是首先的,归并排序要能写出来: 以上为归并排序基本算法原理,基于这个原理可以解决逆序对问题,逆序对问题通常问法是,给定某一个数据,在整个数组中找比这

    2024年02月10日
    浏览(11)
  • 算法思想—枚举、递推、迭代、递归、分治、贪心、动态规划、回溯、模拟、分支定界

    算法思想 枚举(暴力算法) 枚举算法(暴力算法)是一种通过逐一尝试所有可能解来解决问题的算法。它的基本思想是将问题的所有可能答案一一列举出来,并根据一定的判断条件来确定哪些答案是合适的。这种算法通常使用循环来实现,因为需要尝试所有可能的情况。两

    2024年02月01日
    浏览(12)
  • 算法:分治思想处理快排递归以及快速选择/最小K个数问题

    算法:分治思想处理快排递归以及快速选择/最小K个数问题

    分治的原理就是分而治之,从原理上讲,就是把一个复杂的问题划分成子问题,再将子问题继续划分,直到可以解决 基于分治的原理进行快速排序,区别于传统的快速排序,这里对快速排序进行改良,成为更优先的三路划分算法,可以处理一些极端场景,使快速排序的适用性

    2024年02月10日
    浏览(16)
  • 汇编语言实验——大数相乘

    汇编语言实验——大数相乘

    1.1实验内容 实现两个十进制大整数的相乘(100位以上),输出乘法运算的结果。 1.2实验环境 Microsoft Visual Studio 2017+masm 32 1.3实验思路 1.3.1数据读入 大数相乘由于输入的数字过大而不能用一个dword来存储,所以需要使用数组来存取每一位,每一位大小范围在0-9中,按位读取输入

    2024年02月09日
    浏览(38)
  • 矩阵算法之矩阵乘法

    矩阵算法之矩阵乘法

    矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。 在矩阵乘法中,A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。 运算规则:A的每一行中的数字对应乘以B的每一列的数字把结果相加起来。 1、当矩阵A的列数(column)等于矩阵

    2024年02月11日
    浏览(10)
  • 大数计算(大数加法/大数乘法)

    🐶博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 概念

    2024年02月13日
    浏览(10)
  • 「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

    「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月05日
    浏览(12)
  • 《算法导论》学习(十八)----动态规划之矩阵链乘(C语言)

    《算法导论》学习(十八)----动态规划之矩阵链乘(C语言)

    本文主要讲解了动态规划中的矩阵链乘问题:给定一个矩阵链,得到它的最小代价计算次序。给出了动态规划方案的分析,并且给出了C语言实现。 给定一个n个矩阵的序列(矩阵链) A 1 , A 2 , A 3 , A 4 , . . . , A n A_1,A_2,A_3,A_4,...,A_n A 1 ​ , A 2 ​ , A 3 ​ , A 4 ​ , ... , A n ​ ,现在

    2024年02月06日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包