到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comexpert.blogjava.net无关,不对该信息负责.通过http://www.blogjava.net/zellux/archive/2007/10/15/153028.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
CLRS 习题 16.2-6 部分背包问题的O(n)算法
作者:ZelluX 来源:expert.blogjava.net  发布时间:2007-10-15 19:33:47.69

开始用Word 2007发布日志

发现书上很多加了星号的题目我都得看Instructor's Manual才会做  =_=

Problem: Show how to solve the fractional knapsack problem in O(n) time. Assume that you have a solution to Problem 9-2.

Problem 9-2就是在最差情况下也能在O(n)时间内求出第k大元素的算法。

解答:

使用线性算法找出Vi / Wi的中位数
将物体分成三个集合,G = { i : Vi / Wi > m }    E = { i : Vi / Wi = m}   L : { i : Vi / Wi < m},同样能在线性时间内完成
计算WG = Sigma(Wi), i ∈ G; WE = Sigma(Wi), i E

  1. 如果WG > W,则不在G中取出任何物体,而是继续递归分解G
  2. 如果WG < W,取出中G所有物体,并尽可能多得取出E中物体
  3. 如果WG + WE >= W,也就是说步骤2以后背包已经放满,则问题解决
  4. 否则如果尚未放满,则继续在L上递归调用查找W – WG - WG的方案


以上所有调用都在线性时间内完成,每次递归调用都能减少一半的数据规模
因此运行时间的递归式为
T(n) <= T(n/2) + Omega(n)
有Master Theorem可得
T(n) = O(n)



ZelluX 2007-10-15 17:12 发表评论

 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读