动态规划——带权区间调度

问题描述

  • 任务 j j j开始时间为 s j s_j sj,完成时间为 f j f_j fj,权重为 w j > 0 w_j > 0 wj>0
  • 两个任务如果执行时间没有覆盖,则两个任务是兼容的
  • 目标:找到一个彼此兼容且权重最大的任务子集
    -在这里插入图片描述

动态规划求解思路( n l o g n nlogn nlogn

将任务按照结束时间升序排列: f 1 ≤ f 2 ≤ ⋯ ≤ f n f_1 \leq f_2 \leq\dots\leq f_n f1f2fn
p ( j ) p(j) p(j)是与任务 j j j相容的最大下标的任务,如: p ( 8 ) = 1 , p ( 7 ) = 3 , p ( 2 ) = 0 p(8)=1,p(7) = 3, p(2)=0 p(8)=1,p(7)=3,p(2)=0 (通过二分搜索计算)
在这里插入图片描述

O P T ( j ) OPT(j) OPT(j)为对于只含有 1 , 2 , … , j 1,2,\dots,j 1,2,,j(前 j j j个任务)的可相互兼容子集最大权重
目标:找到一个彼此兼容且权重最大的任务子集
O P T ( j ) OPT(j) OPT(j)不选择任务 j j j,那么它一定是前 j − 1 j-1 j1个任务的最优解,即 O P T ( j − 1 ) OPT(j-1) OPT(j1)
O P T ( j ) OPT(j) OPT(j)若选择了任务 j j j,那么它一定是前 p ( j ) p(j) p(j)个任务的最优解+ w j w_j wj,即 O P T ( p ( j ) ) + w j OPT(p(j))+w_j OPT(p(j))+wj

综上递推式如下:
在这里插入图片描述

时间复杂度分析

  • 自顶而下的递归算法是指数时间的,因为会重复计算子问题,不带记忆性,最坏计算 O P T ( j ) OPT(j) OPT(j)复杂度为 1.61 8 n 1.618^n 1.618n(介于 2 n \sqrt{2}^n 2 n~ 2 n 2^n 2n之间)
    ①最慢规模减少策略考虑, p ( j ) p(j) p(j)每次减少2,即 p ( j ) = j − 2 p(j) = j-2 p(j)=j2,如果每次 p ( j ) p(j) p(j)只减少1,则 p ( j ) = j − 1 p(j) = j-1 p(j)=j1,则 O P T ( j − 1 ) = O P T ( p ( j ) ) OPT(j-1) = OPT(p(j)) OPT(j1)=OPT(p(j)),那么一定有 O P T ( p ( j ) ) + w j ≥ O P T ( j − 1 ) OPT(p(j))+w_j\geq OPT(j-1) OPT(p(j))+wjOPT(j1),这样一半的分支就不用继续递归下去了,会减掉一半的计算量,两个分支将变成1个分支,反而规模减少更快。
    ②因此最坏情况是按规模1步长减少(不变形式分支)和按规模2步长减少(可变形式分支)的混合结果,因此是两种满二叉树的中间值,即介于 2 n \sqrt{2}^n 2 n~ 2 n 2^n 2n,两个满二叉树的层数不同(一个层数为 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n,一个层数为 n n n),由于规模减少速度的不同。
  • 自底向上带记忆性的算法时间复杂度为 n l o g n nlogn nlogn
    在这里插入图片描述
    ①根据完成时间排序所需时间:归并排序 O ( n l o g n ) O(nlogn) O(nlogn)
    ②对于每个 j j j计算 p [ j ] p[j] p[j]:二分查找 O ( n l o g n ) O(nlogn) O(nlogn)
    ③计算 O P T ( j ) OPT(j) OPT(j):每次计算得到一个值,一共n个, O ( n ) O(n) O(n)
  • 最终找最优方案,伪代码:
    在这里插入图片描述
    最多调用 n 次 n次 n,因此复杂度为 O ( n ) O(n) O(n)

例题说明

在这里插入图片描述
求解最优值表格如下:
在这里插入图片描述
求解最优方案:
看是否选了当前任务 j j j(根据递推式),若选了,则跳到 O P T ( p ( j ) ) OPT(p(j)) OPT(p(j)),继续查找方案;若没选,则跳到 O P T ( j − 1 ) OPT(j-1) OPT(j1),继续查找方案。

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值