《分治递归算法》-课件.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文档。上传文档
查看更多
对于最后一条的例子: 求最长非递减子序列 如: a[]={1,2,3,2,3,2,3,4,5,6,6,8} 则所得结果为a[5]到a[11]为最长的非递减序列 怎样写这么个程序? Divide and Conquer * Divide and Conquer * Divide and Conquer * Divide and Conquer * * * 自己考虑下归并排序是不是也满足这些要求? * 思考:对于这个问题,该如何分解? * 给定平面上n个点的坐标, 找出其中欧几里德最近的两个点 枚举算法: 需要枚举O(n2)个点对, 每个距离的计算时间为O(1), 总O(n2) 有更好的算法吗? 最近点对问题 * 分治法求解需要考虑哪些问题?与前两题有什么不同? 令d=min{dl, dr}, 则跨越两边的点对中,只有竖条中的才有可能更近 * 需要检查竖条里的所有点对吗? 在最糟糕的情况下,n个点可能全部都在竖线里! * 从上往下看, 对于任何一个p, 另一侧可能与它组成更近的点对在一个正方形中, 它最多只有4个点(否则这个方格中会有距离比d小的点对) * 最坏情况(同一行的红蓝点几乎重合), 需要检查接下来的7个点 * Closest-Pair(P, 1, r)//点集P[],从第1个点到第r个点 if r – l 3 then return Brute-Force(P, l, r) q ? é(l+r)/2ù//点集分解 dl ? Closest-Pair(P, l, q-1)//递归求解 dr ? Closest-Pair(P, q, r) d ? min(dl, dr) for i ? l to r do//考察处在分界线中间的元素 if P[q].x - d £ P[i].x £ P[q].x + d then append P[i] to S Sort S on y-coordinate//对中间元素的y坐标排序 for j ? 1 to size_of(S)-1 do if any of d(S[j],S[j]+1), ..., d(S[j],S[j]+7) is smaller than d, set d to the smallest 13. return d * 由于合并时要把竖条内的点按y坐标排序, 因此合并是O(nlogn)的 递归方程: 解得T(n)=O(nlog2n) 下面把它优化到O(nlogn) 时间复杂度分析 * Closest-Pair(P, 1, r)//点集P[],从第1个点到第r个点 if r – l 3 then return Brute-Force(P, l, r) q ? é(l+r)/2ù//点集分解 dl ? Closest-Pair(P, l, q-1)//递归求解 dr ? Closest-Pair(P, q, r) d ? min(dl, dr) for i ? l to r do//考察处在分界线中间的元素 if P[q].x - d £ P[i].x £ P[q].x + d then append P[i] to S Sort S on y-coordinate//对中间元素的y坐标排序 for j ? 1 to size_of(S)-1 do if any of d(S[j],S[j]+1), ..., d(S[j],S[j]+7) is smaller than d, set d to the smallest 13. return d * 如果左右两边集合的点都是在y轴方向上有序的,并且方向相同,那么在对中间元素的y值进行时排序就可以在O(n)时间内完成。 如何使左右集合的点在y轴方向上有序呢? * 实现把所有点分别按x和y排序放在两个有序表x表和y表 Divide. 把点按x值分成两半后, 按顺序遍历y表, 根据x值拆分成两个y表. 这一步O(n) Combine. 合并得到拆分前的y表, 同时把在竖条内的点提取出来扫描一遍, 这一步O(n) 因此时间复杂度降为O(nlogn) 现详细描述对y表的两个操作 优化 * x表为: (1, 3), (2, 2), (3, 4), (4, 1) y表为: (4, 1), (2, 2), (1, 3), (3, 4) 根据x表, 需把点分成两部分: x=2和x=3 按顺序遍历y表, 判断出四个点应分别放在右边、左边、左边和右边, 拆分后的结果为 左边(红色)y表: (2, 2), (1, 3) 右边(蓝色)y表: (4, 1), (3, 4) 拆分后得到的两个点集仍分

文档评论(0)

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

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

1亿VIP精品文档

相关文档