首页 > 编程语言 >《算法导论》Ch.4_学习笔记

《算法导论》Ch.4_学习笔记

时间:2024-10-30 21:16:17浏览次数:6  
标签:递归 求解 导论 矩阵 mid 问题 算法 Ch.4 代价

<分治策略>

分治策略三步骤:

  1. 分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。
  2. 解决:递归地求解出子问题,如果子问题地规模足够小,则停止递归,直接求解。
  3. 合并:将子问题地解组合成原问题地解。

  • 递归情况:子问题足够大,需要递归求解。
  • 基本情况:子问题足够小,不再需要递归时。

求解递归式的三种方法

  • 代入法:猜测一个界,通过数学归纳法验证其正确性。
  • 递归树法:将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价,采用边界和技术来求解递归式。
  • 主方法(主推)
  •           T(n)=aT(n/b)+f(n),其中a\geqslant 1b\geqslant 1f(n)是一个给定的函数。
  •          该问题生成a个子问题,每个子问题的规模是原问题规模的1/b,分解和合并步骤总共花费时间为f(n)

技术细节,一般忽略

  • n值的奇偶
  • 边界条件,即n很小时

4.1最大子数组问题

最大子数组:最大的非空连续子数组,寻找子数组A[low..high],一般会出现以下三种情况:

  • 完全位于子数组A[low.. mid]中,因此low≤i≤j≤mid
  • 完全位于子数组A[mid+1..high]中,因此mid≤i≤j≤high
  • 跨越了中点,因此low≤i≤mid≤j≤high

原方案一个个计算\begin{pmatrix} 2\\ n \end{pmatrix} ,分治策略中对于重复运算的可直接调用,减少运算时间。

获得运行时间递推式T(n)为,得解为

4.2 矩阵乘法的Strassen算法

使用下标计算,简单的分治算法得到的递推关系式为

花费时间为

Strassen算法

减少一次矩阵乘法带来的代价可能是额外几次\frac{2}{n}×\frac{2}{n}矩阵的乘法。

  1. 将输入矩阵A、B和输出矩阵C分解为\frac{2}{n}×\frac{2}{n}的子矩阵。采用下标计算法,此步骤花费时间为\Theta(1)
  2. 创建10个n/2×n/2的矩阵S1,S2,……,S10,每个矩阵保存步骤1中创建的两个子矩阵的和或差。花费时间为\Theta(n^{2})
  3. 用步骤1中创建的子矩阵和步骤2中创建的10个矩阵,递归计算7个矩阵积P1,P2,…,P7。每个矩阵Pi都是\frac{2}{n}×\frac{2}{n}的。
  4. 通过矩阵Pi的不同组合进行加减运算,计算出结果矩阵C的子矩阵C_{11}C_{12}C_{21}C_{22}。花费时间为\Theta(n^{2})

          

4.3用代入法求解递归式

  • 猜测解的形式(类似的证明递归式较松的上界和下界,然后缩小不确定的范围)。
  • 用数学归纳法求出解中的常数,并证明解是正确的。

4.4用递归式方法求解递归式

每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。将树中每层中的代价求和,得到每层代价后将所有层的代价求和,得到所有层次的递归调用的总代价。

4.5用主方法求解递归式

T(n)=aT(n/b)+f(n),其中a\geqslant 1b> 1f(n)是渐进正函数。

主定理

a\geqslant 1b> 1是常数,是定义在非负整数上的递归式T(n)=aT(n/b)+f(n)

其中将n/b解释为⌈n/b⌉ ⌊n/b⌋。那么T(n)有如下渐近界:

  • 若对某个常数ε>0有f(n)=O(n^{log_{b}^{a- \varepsilon}}),则T(n)=\Theta(n^{log_{b}^{a}})
  • f(n)=\Theta(n^{log_{b}^{a}}),则T(n)=\Theta(n^{log_{b}^{a}}lgn)
  • 若对某个常数ε>0有f(n)=\Omega(n^{log_{b}^{a+\varepsilon}}),且对某个常数c<1和所有足够大的n有af(n/b)\leq cf(n),则T(n)=\Theta(f(n))

Monge阵列

对一个m×n的实数阵列A,若对所有满足1≤ikm和1≤jlnijkl有A[i, j]+ A[k, l] ≤A[i, l]+ A[k, j],则称A是Monge阵列。即,无论何时选出Monge阵列的两行两列,对于交叉点上的4个元素,左上和右下两个元素之和总是小于等于坐下和右上元素之和。

更一般的

其中

求得递归式的解为

标签:递归,求解,导论,矩阵,mid,问题,算法,Ch.4,代价
From: https://blog.csdn.net/qq_42943306/article/details/143374392

相关文章

  • 基于MATLAB红外和可见光图像融合算法研究
    红外技术作为人类认识自然、探索自然的一种新的现代工具,已经被各国普遍的应用于生物、医学、地学等科学领域以及军事侦察方面。红外图像直接反映了物体表面温度分布情况,但由于目标的红外辐射十分复杂,而且影响目标红外辐射的因素很多,红外热图像的清晰度远不如可视图像。可见光图......
  • 【信奥赛·算法基础】插入排序:算法解析与C++实现
    序言插入排序(InsertionSort)是一种简单的排序算法,就像是我们在打扑克牌时,整理手中牌的过程。一、基本原理插入排序的基本思想是:将待排序的元素插入到已经有序的部分序列中合适的位置,直到所有元素都插入完毕,整个序列就变为有序序列。二、算法步骤从第二个元素开始(假设第......
  • 【机器人学导论】简明学习笔记1——概述
    主要参考学习资料:《机器人学导论(第4版)》JohnJ.Craig著台大机器人学之运动学——林沛群前置课程:博主目前只对线性代数和理论力学方面有一定基础,学习过程中遇到额外必要的前置知识我会做补充或者开辟新的知识笔记专栏笔记特点:简明扼要,对学习资料进行消化调整辅助理解码......
  • 排序算法在最坏情况下的性能差异:深入分析
    目录1.排序算法简介2.最坏情况示例分析2.1插入排序2.2归并排序2.3快速排序2.4堆排序3.性能差异与优化策略4.拓展知识:算法选择与优化5.结语        在软件工程中,排序算法是数据处理的基石。不同的排序算法在不同情况下表现出不同的性能。本文将通过......
  • 堆排序算法和Topk思想
    目录1>>导言2>>堆排序2.1>>通过堆结构实现堆排序2.2>>堆思想实现排序3>>Topk思想4>>代码5>>结语1>>导言    今天重点内容就是带着大家实现堆排序和Topk,堆排序分为两种,一种是直接调用堆的数据结构来实现的,另一种就是通过堆的思想实现的,Topk就是在一个数组......
  • H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录
    说明:很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。近期已经自制了STM32H7全系列,N32G003,N32G031,  S......
  • 《贪婪算法实战:寻找最短无序连续子数组的深度解析与实现》
    ......
  • 百度二面算法:合法的括号字符串(贪心解法)
    目录标题1.题目1.1示例2.利用贪心算法求解2.1代码结构分析2.1.1代码优缺点2.1.2星号的角色分析2.1.2.1处理星号的逻辑2.1.2.2整体逻辑2.1.2.3代码逻辑总结2.2贪心的策略体现2.2.1贪心策略的应用1.题目给定一个字符串s,字符串......
  • 算法网关视频分析网关算法定制:适合视频分析的深度学习架构及视频分析原理和应用
    随着信息技术的突飞猛进,视频监控技术已经从模拟监控时代跨入了高清、智能化的新纪元。在这场技术革新中,算法定制视频分析网关扮演着至关重要的角色,它作为连接前端摄像头与后端管理平台的桥梁,其作用日益凸显,不可或缺。一、适合视频分析的深度学习架构深度学习在视频监控系统中的......
  • 【算法】前缀树
    基本内容以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀入门例子PHONELST-PhoneList-洛谷|计算机科学教育新生态题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”,“91140”,“20”,“912”}中,“911”......