Ch-5贪心策略.docVIP

  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文档。上传文档
查看更多
Ch-5贪心策略

第5章 贪心策略 5.1 概述 问题导入:找零钱问题 有4 种硬币,面值分别为2角5分、1角、5分和1分。现在要求以最少的硬币个数找给顾客6角3分。通常做法是: 先拿2个2角5 分的 + 1个1角 + 3个一分 这种找法所拿出的硬币个数最少。 这种算法其实就是贪心算法。(考虑动态规划法如何求解?) 顾名思义,该算法总是做出在当前看来最好的选择,并且不从整体上考虑最优问题,所做出的每一步选择只是在某种意义上的局部最优选择,逐步扩大解的规模。当然,希望贪心算法得到的最终结果也是整体最优的(上面的解法得到的恰好是最优解)。但未必总是得到最优解。 假如,面值有1角1分、5分和1分,要找给顾客1角5分。如果还是使用上述贪心算法,得到的解是:1个1角1分+ 4个1分。而实际上最优解是3个5分。 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解,例如:单源最短路径问题、最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。 贪心法的难点在于它的正确性证明。 5.1 单源最短路径问题 G = (V, E) 是一个有向图,每条边上有一个非负整数表示长度值,其中有一个顶点称为源节点。所谓的单源最短路径问题就是:求解该源节点到所有节点的最短。不失一般性,假设V = {1,2,3,...,n} 并且s = 1。那么该问题可以使用Dijkstra算法来求解,该算法是一种贪心算法,并且能求得最优解。开始时,我们将所有的顶点划分为两个集合X = {1}, Y = {2,3,4,..,n}。所有已经计算好的顶点存放在X中,Y中表示还没有计算好的。Y中的每个顶点y有一个对应的量λ[ y],该值是从源顶点到y 并且只经由X中的顶点的最短路径。Dijkstra算法假设V = {1,2,3,...,n} 并且s = 1。选择一个λ[y] 最小顶点y∈Y,并将其移动到X 中。 y 被从Y 移动到X 中,Y 中每个和y 相邻的顶点w 的λ[w]都要更新表示经由y 到w 的一条更短的路径被发现 Dijkstra算法 X={1}; Y←V-{1}; λ[1]←0 for y←2 to n if y 相邻于1 then λ[y]←length[1,y] //((n) else λ[y]← ∞ //O(n) end if end for for j←1 to n-1 令y∈Y, 使得λ[y]为最小的 //∑(n-i){i=1,…,n-1}= ((n2) X←X∪{y} //((n) Y←Y - {y} //((n) for 每条边(y,w) //每条边恰好检查一次,((m), m=|E| if w∈Y and λ[y]+length[y,w] λ[w] then λ[w] ←λ[y]+length[y,w] //((m) end if end for end for 算法的时间复杂度 ((n)+ O(n)+ ((n2)+ ((n)+ ((n)+ ((m)+ ((m) = ((m+n2) 对于任意一个顶点 v∈V假如我们使用δ[v]表示源顶点到顶点v 的最短路径,可以证明上述的贪心法结束后有λ[v] = δ[v] 下面来证明使用该方法得到的是最优解,也就是λ[] = δ[y]。 证明: 归纳法 显然λ[1] = δ[1] = 0 假设当前将 移动到X 中,并且在y 之前移动到X 中的任何一个顶点c,都有λ[c] =δ [c]。由于λ[y] 是有限的,也就是说必定存在一条从1 到y 路径,长度为λ[ y](我们需要来证明λ[ y] =δ[ y])。 那么这条路径总可以写作: 1→[ ]→[ ]→…→[ ]→[ ]→[ ]→y 在上述序列中,我们总是可以找到一个顶点,不妨称之为xx∈ X), 使得x 之后的顶点均属于Y。 所以有以下两种情形: π:1→[ ]→[ ]→…→[ ]→[x]→y (A) 或 π1→[ ]→[ ]→…→[x ]→[ ]…→y (B) 对于情形(A), λy] ≤λ[x]+length[x, y] //算法要求=δ[x]+length(x, y) //归纳假设 =δ[y] π是最短路径 对于情形(B),我们将x之后的顶点不妨称之为w∈Y),即: 1→[ ]→[ ]→…→[x ]→[]…→y (B) 于是有: λ[ y] ≤ λ[w] 由于y在w之前离开Y ≤ λ[x] + length(x,w) 算法要求 =δ[x] + length(x,w) //归纳假

文档评论(0)

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

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

1亿VIP精品文档

相关文档