算法导论三-分治法

2023-11-17

分治法

  • 简单说,分治法即分而治之,即将问题分化为小问题来处理。
  • 简化起来看有二到三个步骤:
    • 分:将问题分解为若干子问题(复杂度n降低)。
    • 治:递归解决子问题。
    • 合:合并子问题的解。
  • 常见分治法的递归式为: T(n) = 2T(n/2) + θ(n) ,即分为两个解法一样的子问题,以及额外的线性时间。满足主方法的条件2,可得解为: T(n) = n * lg n。

归并排序

目标:数组排序

分治法:
  • 分:将数组分成两个数组
  • 治:递归排序
  • 合:合并结果,已有序的子序列合并
时间复杂度: T(n) = 2 T(n/2) + θ(n) 根据主方法(2)得出解为: T(n) = n log n

二分查找

目标:在一个已排序的数组中查找某个值
原始方式:通过一次遍历查找,时间复杂度: T(n) = n 。
二分查找:通过查看数组中间的值进行查找,时间复杂度: T(n) = log n 。(log n 远小于n)

分治原理:
  • 分:取中间值进行比较,从而将数组分成了两段
  • 治:递归从其中一个数组取中间值进行比较
  • 合:如果找到即结束,否则确定从哪边进行递归,常量时间。
时间复杂度: T(n) = T(n/2) + θ(1) 根据主方法(2)得出解为: T(n) = log n

乘方

目标:给出一个数 X, 整数 n, 求 n 个 X 相乘的值。
原方式:n个 X 相乘,需要计算n次结果,时间复杂度: T(n) = θ(n)

分治法:
  • 先考虑乘方原理,例如 5^4 = 5 * 5 * 5*5 = 5^(2+2) = 5^2 * 5^2 ,可以发现,其实4次计算可以缩减为两次
  • 分:如果n是偶数,将 X^n 分成两个 X^n/2 相乘;如果n是奇数,将 X^n 分成 X^(n-1/2) * X^(n-1/2) * X
  • 治:递归计算分出来的值。
  • 合:合并计算结果。
时间复杂度: T(n) = 2(n/2) + θ(1) ,根据主方法(2)得出解为: T(n) = log n

斐波那契数

目标:根据斐波那契数定义,即, F0 = 0,F1=1,Fn=Fn-1 + Fn-2 (n大于等于2),算出第n个的值。
原始方式:递归计算,即直接根据定义计算, Fn-1 和 Fn-2 ,Fn-1和Fn-2再根据定义向下计算。时间复杂度(指数级别):T(n) = (φ) ⁿ 其中 φ = (1+ √5)/2 即黄金比例,该值大于1。
原始方式时间复杂度的大概证明:简单画了个递归树图,如下,可以看到,从根节点出发,每次分了两个节点出来。设高为h,因此叶节点数为, 2^h ,那么h的值是多少?我们知道,可以发现 h >= n/2 ,因此 T(n) >= 2 ^ (n/2) ,这个数基本接近 T(n) = (φ) ⁿ
优化1:从递归树可以发现,很多子树是重复的,没有必要重复计算,但是要得到k项值,又必须知道k-1项和k-2项的值。那么,我们换一种思路,假设计算第k项钱,k-1项和k-2项我们已经知道了呢?那么计算k项只需要一次相加。而我们只要从头算起,就可以在计算k项值前知道k-1项和k-2项值。即,计算 F0,F1,F2,F3…Fn 从而得到Fn,时间复杂度为 T(n) = θ(n)。
优化2:通过定理(数学归纳法得到),转化为2阶矩阵乘法来得到。

    Fn+1  Fn				    1     1
(                    )  =  (                      ) ^n                  
    Fn    Fn-1                  1     0   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法导论三-分治法 的相关文章

随机推荐

  • JDBC 获取数据库连接的方式一,二

    获取方式一 通过实现Driver类的对象获取 使用此方式需要实现以下步骤 1 获取Driver实现类的对象 2 将用户名和密码信息封装在Properties中 3 获取连接 这样我们就获取到了java与数据库的连接 JDBC URL用于标识
  • 订阅消息发送47003

    订阅消息发送失败信息 errcode 47003 errmsg argument invalid data phrase4 value invalid rid 600a44c7 56086c1c 4f499b49 提示phrase4这个字段
  • Cypress笔记--隐式断言.should()和.and()方法详解

    should 作用 为当前对象做断言 语法 should 方法 预期 示例 cy get assertion table find tbody tr last should have class success find td first
  • vue3 无法导入vue-router 报错vue_router__WEBPACK_IMPORTED_MODULE_1__.default is undefined

    问题描述 报错vue router WEBPACK IMPORTED MODULE 1 default is undefined 在启动的时候 报错 export default imported as Vue was not found
  • 蓝图类

    感谢程序员的暴击 https www bilibili com video BV125411h7c4 p 17 这个例子说明了蓝图类的用法 而不是关卡蓝图 把蓝图类当作类就可以了 可以把蓝图类拖到场景多份 就像多个对象一样 蓝图类更加灵活
  • oracle和mysql的区别

    Oracle与MySQL的区别以及优缺点 MySQL的特点 1 性能卓越 服务稳定 很少出现异常宕机 2 开放源代码无版本制约 自主性及使用成本低 3 历史悠久 社区和用户非常活跃 遇到问题及时寻求帮助 4 软件体积小 安装使用简单且易于维
  • tp5 ueditor 请求后台配置项http错误,上传功能将不能正常使用 报错403解决

    百度的都尝试过了 对我没有用 时间有限 简单改了一下部分功能 大部分功能是可以用的 我重新改了一下 打开ueditor本目录下的ueditor confin js将serverUrl修改为您的上传接口 大约在33行左右 serverUrl
  • 【产品运营】如何提升B端产品竞争力(下)

    好产品不是能力内核 做好产品的流程才是 一 建立需求池和需求反馈渠道 需求池管理是B端产品进化最重要的环节 它的重要性远超产品设计 开发等其他环节 维护需求池有主动和被动两种 主动维护是产品经理在参与售前 迭代 交付 售后 竞品分析 老板沟
  • dell 台式机bios虚拟化_如何在BIOS中开启虚拟化技术

    虚拟化技术目前主要依赖于您电脑的CPU型号及BIOS 某些CPU或者BIOS暂时还不能支持虚拟化技术 支持虚拟化技术的可以在BIOS中开启 开启方法如下 1 进入BIOS 开机时按F2或F12或DEL或ESC等键 各电脑有所不同 2 进入B
  • 一些有意思的面试题

    1 写一个高效C语言程序 计算一个无符号整数中1的个数 for count 0 x count x x 1 同理 计算0的位数 for count 32 x count x x 1 2 给定字符串S1和S2 写程序判断S2是否能由S1旋转而
  • 局域网中共享文件夹

    以 Windows 10 系统为例 首先 在右下角的网络图标上单击右键 选择 打开 网络和Internet 设置 然后点击这里的 网络和共享中心 在弹出的窗口中 点击 更改高级共享设置 在来宾或公用网络这里 勾选 启用网络发现 勾选 启用文
  • R语言第三章练习题

    R语言第三章练习题 1 求10以内所有偶数的和 a lt 0 cou lt 0 while a lt 9 a a 1 if a 2 0 cou lt cou a print cou 2 求焉尾花数据集iris属性的均值 中位数 至少用三种方
  • Vue的指令(一)

    指令 Directives 是vue为开发者提供的模板语法 用于辅助开发者渲染页面的基本结构 Vue中指令按照不同的用途可分为6大类 1 内容渲染指令 内容渲染指令用来辅助开发者渲染DOM元素的文本内容 常用的内容渲染指令有3个 v tex
  • Java入门实例(九九乘法表)

    乘法口诀 也叫 九九歌 在我国很早就已产生 远在春秋战国时代 九九歌就已经广泛地被人们利用着 在当时的许多著作中 已经引用部分乘法口诀 最初的九九歌是以 九九八十一 起到 二二如四 止 共36句口诀 发掘出的汉朝 竹木简 以及敦煌发现的古
  • docker(5)-数据卷

    容器运行时会产生一些数据 在容器内部不便于管理 而且容器删除后数据也会被删除 数据卷可以将容器中的动态数据直接存储到宿主机上 独立于容器 挂载自定义目录 docker run id v root data1 root openjdk 8 v
  • iOS编程基础-OC(八)-运行时系统的结构

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第八章 运行时系统的结构 运行时系统是OC平台的关键元素 OC语言的动态特性和面向对象功能就是由它实现的 运行时系统提供了公用API 是你编写的代码能够直接调用运行时
  • 安装 Rust

    curl proto https tlsv1 2 sSf https sh rustup rs sh 安装 Rust Training Microsoft Learn
  • 【Java】 &【Js】 & 【Vue 】字符串截取括号内的字符串(可以适应99.99%场景)

    文章目录 问题描述 预期效果 解决方案 1 javascript vue 实现 2 java实现 问题描述 截取一个字符串里 以 开始和结束 的内容 不使用正则表达式实现 预期效果 传入字符 xx 撒打sdsa 算 x 22 撒 我是括号里
  • android studio for ubuntu,安装android studio for Ubuntu12.04.4-------(1)

    1安装jdk8 joe joe Aspire Z3730 sudo add apt repository ppa webupd8team java You are about to add the following PPA to your
  • 算法导论三-分治法

    分治法 简单说 分治法即分而治之 即将问题分化为小问题来处理 简化起来看有二到三个步骤 分 将问题分解为若干子问题 复杂度n降低 治 递归解决子问题 合 合并子问题的解 常见分治法的递归式为 T n 2T n 2 n 即分为两个解法一样的子