分治法与递归式求解试题.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Strassen矩阵乘法方法 给定两个矩阵A=(aij)nxn,B=(bij)nxn 两个矩阵的乘积:C=A·B=(cij)nxn, Strassen矩阵乘法方法 Strassen矩阵乘法方法 显然,上述算法的时间复杂度为Θ(n3). 问题:能否利用分治法策略将矩阵乘法时间降到ο(n3)? Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen矩阵乘法方法 以上算法的时间复杂度为: Strassen矩阵乘法方法 Strassen矩阵乘法方法: Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen矩阵乘法方法 Strassen算法的时间复杂度表示如下: 最大子数组问题 给定数组A,求A中具有最大和子数组。 显然,当A中元素均为非负数时,A中具有最大和子数组就是A本身。而当A中元素均为非正数时,A中具有最大和子数组就是A中的最小元素。一般情况下,A中既有负数又有正数。 应用背景:例如,股票的买卖。 最大子数组问题 最大子数组问题 蛮力搜索方法:若A的长度为n,则测试所有 n+ 个子数组,取和为最大者。算法的时间复杂度为: 能否应用分治策略设计更有效的算法使其时间复杂度降低到о(n2)? 最大子数组问题 最大子数组问题 最大子数组问题 FIND-MAXIMUM-SUBARRAY 算法复杂度为 FIND-MAX-CROSSING-SUBARRAY算法复杂度为: 小结 本章主要讨论归并排序、快速排序、最大子数组、Strassen矩阵乘法方法等算法的主要思想及其时间复杂度的表示;求解递归式的几种常用方法;递归算法复杂度分析;最后讨论堆排序算法的分析。 * * 快速排序算法 Quicksort(A, p, r) { if (p r) { q = Partition(A, p, r); //分割 Quicksort(A, p, q-1); Quicksort(A, q+1, r); } } 分割Partition 分割partition()进行了以下动作 重新对数组元素的位置进行调整 最终结果: 所得的两个子数组具有这样的性质:第一个子数组中所有数 ? 第二个子数组中的任意数 返回主元(两个子数组的分界)的下标 算法Partition的伪代码 Partition(A,p,r){ x ← A[r]; i ← p-1; For(j=p;j=r-1;j++){ if(A[j]≤ x) { i=i+1; swap(A[i],A[j]);} Swap(A[i+1],A[r]); return i+1 快速排序算法的性能分析 最坏情况时间复杂性: T(1) = ?(1) T(n) = T(n - 1) + ?(n) 因此有: T(n) = ?(n2) 最好情况时间复杂性: T(n) = 2T(n/2) + ?(n) T(n) = ?(n log n) 快速排序算法的性能分析 快速排序算法改进 The real liability of quicksort is that it runs in O(n2) on already-sorted input Book discusses two solutions: Randomize the input array, OR Pick a random pivot element How will these solve the problem? By insuring that no particular input can be chosen to make quicksort run in O(n2) time 快速排序算法的平均情况性能分析 Assuming random input, average-case running time is much closer to O(n lg n) than O(n2) First, a more intuitive explanation/example: Suppose that partition() always produces a 9-to-1 split. This looks quite unbalanced! The recurrence is thus: T(n) = T(9n/10) + T(n/10) + n How deep will the recursion go? (draw it) Use n instead of O(n)

文档评论(0)

1112111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档