- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 分治法 概述:算法概要、算法效率 折半查找 合并排序 快速排序 大整数乘法 Strassen 矩阵乘法 本章习题 概述 6.1 分治法基本思想(算法概要、算法效率) 分治法是著名的通用算法设计技术,很多非常有效的算法实际上是这个 通用算法的特殊实现。基本思想符合人们在解决复杂问题时,常常将其 从大到小逐步分解,进而将较易求解的小问题解合并得到原问题的解。 这即是“分治法”的分而治之的思想。 算法概要 1. 分解原问题规模为较小的子问题,子问题最好有相同规模; 2. 求解子问题;( 1 2 步“分解-求解”过程通常是递归的,直到子问题可简单求解为止) 3. 合并子问题的解,得到原问题的解(必要的话)。 分治算法概要描述 分治算法概要描述: 分治法应用的一个简例 6.2 分治算法设计的特点 分治法应用的一个简例:—— 查找最大元素 已知 S 有 n 个元素,求 S 的最大元素。不妨设 的整数。 本问题可设计多种算法,这里用分治法求解:每次将 S 一分为二,直到 分解到仅有2个元素的求解子集为止;求解算法是返回两元素之较大者。 分治法应用简例的过程图解 分治法应用简例的过程图解 已知: S = { 30, 11, 42, 22, 1, 55, 21, 43 } 有 n = 23 个元素; 求: S 的最大元素。 分治算法设计的两个基本特征 1、分治求解子集是规模相同,求解过程相同的实际问题的分解。即使用一个函数,求解不同的子集。 2、求解过程反复使用相同的求解子集函数来实现,一般用递归函数来实现算法。 分治法时间效率(例) 6.3 分治法的时间复杂度 上例的时间效率:—— 查找最大值 输入规模:元素个数 n ; 基本操作:比较操作; 效率类别:无最佳、最差、平均效率之分; 建立递归算法的递推式并求解得到增长函数的增长率类型: 本例求解子集仅2个元素,需比较一次。下面用归纳法分析: ① n=2=21:T(n) = T(2) = 1。——比较一次 ② n=4=22:T(n) = 2T(4/2)+1。2T(4/2):求解子集个数为2,求解子集 规模 4/2。+1:两个子集解需合并一次即比较一次。 ③ n=8=23: T(n) = 2T(8/2)+1 = 2T(4) + 1。 ④ n=2k: T(n) = 2T(2k/2)+1= 2T(2k-1) + 1。 本例归纳结果: 通用分治递推式及其效率 分治法运算时间的通用分治递推式: 一个规模 n 的问题,每次被分为 a 个子问题,每个子问题规模 n/b (上例:a = 2, b = 2)。为简化分析,假定 n 是 b 的乘方即 n = bk, k=1,2,3,..., 通用分治递推式如下: c:子集 (规模为 tr )求解时间 (常量);(时间:基本操作数) f (n):子集分解和子集解合并的时间。(本例比较1次即 f (n) = 1) 解递推式,得到时间效率(主定理): 折半查找 折半查找 算法策略:(非降序) 通过比较查找键 K 和有序数组中间元素 A[m] 来完成查找工作。若它们 相等,算法结束;否则,如果KA[m],则在数组前半部分内进行查找, 如果KA[m],就在数组的后半部分内进行查找。 算法描述 折半查找算法效率 折半查找的算法效率 输入规模:元素个数 n ; 基本操作:键值比较; 效率类别:显然键值比较次数与输入特征(元素的顺序)有关,因此 存在最佳、最差、平均效率。(最佳效率 Tbest(n)=1) 最差效率:(如数组中没有查找键,即失败查找) 对该问题,可直接写出键值比较次数(基本操作)递推式: 理解一: 原区间通过 1次 比较K=A[m],化为一半规模的 1个求解子问题。 理解二: 根据通用分治递推式得到,a = 1, b = 2, f (n) = 1 分解需1次比较。 问题:递推式为什么是向下取整?(A[0...n-1]) 求解递推式得:(过程略) 折半查找算法简评 折半查找算法简评 就键值比较的查找算法而言,折半查找是一种最优的查找算法; 但还有一些查找算法具有更优的平均效率(插值查找、散列查找), 散列查找甚至不需要输入是有序的!当然,这些算法除了键值比较, 还有一些特殊的附加计算。 折半查找所包含的思想不仅仅能用于查找,还可以用于一元高次方程 求解(如解超越方
文档评论(0)