- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计技巧 高文宇 gwyy@163.com §1 贪心算法 贪婪算法分阶段工作,在每一阶段,选择局部最优解,在算法终止时,希望获得全局最优解。 问题:给定 N 个作业 j1 , j2 , …, jN ,其运行时间分别是 t1 , t2 , …, tN ,处理器只有一个。 多处理器情况 问题:给定 N 个作业 j1 , j2 , …, jN ,其运行时间分别是 t1 , t2 , …, tN ,处理器有多个。 最后完成时间最小化 Minimizing the Final Completion Time 即各处理器之间如何更平均地承担任务 哈夫曼编码 问题: 假设一段文本包含 1000 个由字母 a, u, x, z组成的字符。若按ASCII编码,这段文本需要使用8000 bits存储空间。 若对这4个字母如下编码: a = 00, u = 01, x = 10, z = 11。即 aaaxuaxz 编码为 0000001001001011。则该段文本将占据 2000 bits 存储空间。是否还有更好的方法呢? 根据频率进行编码。例如,在文本 aaaxuaxz 中, f(a) = 4, f(u) = 1, f(x) = 2, f(z) = 1。例如使用变长编码如下: a = 0, u = 110, x = 10, z = 111。则原文本编码为: 00010110010111 。 前缀码 哈夫曼算法 哈夫曼算法示例 §2 分治算法 分治:Divide and Conquer 例子: 最大子序列和 归并排序 快速排序 分治算法的时间复杂度 分治算法的时间复杂度 最近点对问题 平面上有N个点,找出距离最近的两个点。 最近点对的分治 对所有点按x坐标排序。画一条想象的垂线将点集分为两半PL和PR。那么最近点对要么出现在PL中,要么出现在PR中,要么跨越PL和PR。我们把这三个距离分别叫做dL,dR,dC。 dL,dR可以递归计算,但dC如何计算。另外,若想得到O(NlogN)算法,则dC的计算代价最多为O(N)。 考察条带中的点 对于均匀分布的点,平均只有O(N^1/2)个点分布在这个条带中。因此使用蛮力法计算这O(N^1/2)个点两两之间的距离也只需O(N)时间。 考察y坐标 在?×? 的区域中,最多存在4个满足条件的点。即每两点之间的距离小于等于? 。因此在2×?×? 区域中最多存在8个满足条件的点。因此对于每个pi,最多考虑另外7个点即可。 选择问题 从一组未排序的数中选出第k大的数。 整数相乘问题 两个N位数相乘,采用传统的竖式乘法,需要执行N^2次乘法。 有办法改进吗? 整数相乘的改进 设X,Y是两个N位整数(为方便起见,设N=2^k),用XL表示X的前半部分,XR表示X的后半部分;用YL表示Y的前半部分,YR表示Y的后半部分;则: XY= XLYL10N + (XLYR + XRYL)10N/2 + XRYR 以上方程由四次乘法和三次加法构成,因此可得递归式: T(N) = 4T(N) + O(N) 然而,根据定理10.7,上述递归式的解仍为O(N2) 。因此,关键是能否将以上递归式中的“4”变小。 对此有:XLYR + XRYL= (XL-XR)(YR-YL) + XLYL + XRYR 而XLYL和XRYR是已经计算过的。 因此,计算XY可以仅由三次一半规模的乘法和O(N)次加减法来完成。所以递归式变为T(N) = 3T(N/2) + O(N) 。根据定理10.7可知,算法的时间复杂度为T(N) = O(N^log23 ) = O(N^1.59)。 矩阵乘法 两个N阶矩阵X和Y相乘,最终得到一个N阶矩阵Z,矩阵Z中有N^2个元素,每个元素需要花费N次乘法和N-1次加法获得。因此传统的矩阵相乘的时间复杂度为O(N^3) 。 有办法改进吗? 矩阵乘法改进(Strassen) 与整数乘法类似的分治。 T(N) = 7T(N/2) + O(N2) T(N) = O(N^log27 ) = O(N^2.81)。 §3 动态规划 通过避免重复计算来优化递归。 Fibonacci Numbers: F(N) = F(N – 1) + F(N – 2) 更高效的递归 矩阵乘法的顺序安排 如何找到最优的顺序 矩阵乘法 矩阵乘法 最优二叉查找树 图中所有点对间的最短路径 Floyd算法 Floyd-Warshall 算法考虑最短路径上的中间节点(intermediate),简单路径 p = 〈v1, v2,..., vl〉上的中间节点是除v1 和 vl,以外的任意节点。 递归解 设 G 的节点为 V = {1, 2,..., n},对参数k考虑节点集 {1, 2,..., k} 。对任意一对节点 i,
文档评论(0)