算法效率分析与分治法的应用.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法效率分析与分治法的应用.ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 分治思想 分治(divide-and-conquer)就是“分而治之”的意思,其实质就是将原问题分成n个规模较小而结构与原问题相似的子问题;然后递归地解这些子问题,最后合并其结果就得到原问题的解。其三个步骤如下; 分解(Divide):将原问题分成一系列子问题。 解决(Conquer):递归地解各子问题。若子问题足够小,则可直接求解。 合并(combine);将子问题的结果合并成原问题的解。 分治思想 问题S 问题S 问题S S的解 问题S1 …… 问题S2 问题Si 问题Sn …… S1的解 …… S2的解 Si的解 Sn的解 …… 问题的分解 子集解的合并 子问题求解 分治思想 由分治法所得到的子问题与原问题具有相同的类型。如果得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出不用进一步细分就可求解的子问题。分治求解可用一个递归过程来表示。 要使分治算法效率高,关键在于如何分割?一般地,出于一种平衡原则,总是把大问题分成K个规模尽可能相等的子问题,但也有例外,如求表的最大最小元问题的算法,当n=6时,等分定量成两个规模为3的子表L1和L2不是最佳分割。 例题1:消除隐藏线 在计算机辅助设计(CAD)中,有一个经典问题:消除隐藏线(被其它图形遮住的线段)。你需要设计一个软件,帮助建筑师绘制城市的侧视轮廓图。为了方便处理,限定所有的建筑物都是矩形的,而且全部建立在同一水平面上。每个建筑物用一个三元组表示(Li,Hi,Ri)其中Li和Ri分别是建筑物i 的左右边缘坐标,Hi是建筑物i的高度。 下面左图中的建筑物分别用如下三元组表示: (1,11,5),(2,6,7),(3,13,9),(12,7,16),(14,3 ,25),(19,18,22),(23,13,29),(24,4,28) 下面图中的城市侧视轮廓线用如下的序列表示: (1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0) 分析 本题其实是矩形覆盖问题的特殊情形——固定了矩形的下边界。本题可以使用矩形切割或者离散化加上线段树解决,但是前者的时间复杂度在最坏情况下可能达到O(n3),而后者的编程实现比较复杂。 要求n个矩形的轮廓,先将这n个矩形分成两个大小相等的部分,分别求其轮廓,然后再将这两个轮廓合并。 规模为1的问题可以直接解决。具体来说,如果这个矩形的三元组表示为(L,H,R),那么其轮廓为(L,H,R,0)。 对于规模为k的问题,假设得到了两个规模为k/2的轮廓,分别为A和B,我们如何得到合并后的轮廓C?首先,容易证明轮廓C的每一个横坐标,都来源于轮廓A和B的横坐标,而不会产生新的坐标值。因此,我们只需计算A和B中所有涉及到的横坐标在C中的高度。 由于轮廓C中的横坐标值要求有序,我们可以仿照归并排序的方法,用两个指针扫描轮廓A和B。 具体的方法是,设指针i指向轮廓A的当前横坐标,指针j指向轮廓B的当前横坐标。如果指针i指向的横坐标较小,那么将这一横坐标加入到C中,且在C中的高度为A中第i个横坐标对应的高度与B中第j-1个横坐标对应的高度的最大值。 然后将指针i向后移一位;指针j指向的横坐标较小的情况则类似处理。如果两个指针指向的横坐标相同,此时只需将这一横坐标加入到C中一次,且高度为两指针指向高度的最大值,然后将两指针同时向后移一位。最后,需要扫描一遍轮廓C,将相邻的高度相同的横坐标合并。 分析时间复杂度,T(n)=O(nlogn)。空间方面,由于递归的层数为O(logn),每一层需要保存O(n)的空间,所以总的空间复杂度为O(nlogn)。 例题2:Bone Sort(ZJU1440) 求一个未排序的序列需要经过多少次交换操作才能使序列升序有序,并且求出原序列中有多少个逆序对。 算法Part1 算法思想: 按照顺序扫描序列的每一位,如果此位尚未调整至升序要求则进行一次交换。 具体实现: (1)预处理:对原序列升序排序[复杂度O(NLog2N)]。 (2)依次检查原序列的每一位[复杂度O(N)]: 判断该位置目前的值是否与排序后的等位的值相同 相同则继续检查下一位 否则将当前位置值与排序后等位的值所在的位置交换,更新交换次数 求逆序对 求逆序对有多种方法, 目前使用比较广泛且实现比较简单的主要有三种算法: 1、归并排序 2、线段树 3、树状数组 归并排序方法求逆序对 假设当前需要归并[l, mid] 和[mid+1, r] 两段区间,设前一

文档评论(0)

docindoc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档