当前课程知识点:算法设计与分析 > 6 Dynamic Programming > 6.1 Weighted Interval Scheduling > Weighted Interval Scheduling
在这一章里
我们一起来学习动态规划
我们已经学习了几种
算法设计与分析的思路
在贪婪算法中
我们把原问题分解为多个阶段
每阶段按照一个准则去求解局部的最优
然后逐步构建出原问题的解
在分治算法中
我们把原问题划分为若干个子问题
比如两个子问题
然后独立地递归求解子问题
再把它们的解组合为原问题的解
在这一章要学习的动态规划算法中
我们还是把问题划分为一系列的子问题
但它们相互关联
求解问题的规模由小到大
最后得到原问题的解
Bellman被认为是动态规划的创始人
他在50年代系统地研究了动态规划
动态规划从提出至今
在科学和工程的各个领域
都有广泛的应用
比如在生物信息学 控制理论
信息论 运筹学
以及计算机科学的各个方面
有很多以动态规划为基础的经典算法
比如隐式马尔可夫模型的Viterbi算法
Unix中的比较两个文件的diff命令
以及稍后我们将要学习的序列比对算法
最短路算法等等
我们用几个例子来展示动态规划算法
先来看一下加权区间排序问题
之前我们讲过排序问题
给定n个工件
工件j开始时间是s_j 结束时间是f_j
在这里 我们增加一个新的参数
每个工件有一个权重v_j
两个工件是相容的
如果它们的加工时间上没有重叠的部分
我们的目标是安排相容的工件进行加工
使得它们的权重之和最大
在之前学习的区间排序问题中
相当于所有的权重为1
我们的贪婪算法
把工件按照结束时间升序排列
然后依次把不冲突的工件
安排在机器上加工
但是我们发现
贪婪算法对于加权版本的区间排序问题
不是最优的
比如看下面的例子
有两个工件
工件a的长度为3 权重是1
工件b 长度10 权重999
贪婪算法
选择工件a来加工
但是显然这个问题的最优解是加工工价b
为了求解加权区间排序问题
我们先做一些准备工作
工件的结束时间
仍然是我们需要参考的重要指标
把它们升序排列
定义p(j)是在j之前
并与j相容工件的最大序号
比如下例中
对于工件8来说
在它之前并且相容的最大的序号的工件是5
因此p(8)=5
类似地 p(7)=3, p(2)=0
定义OPT(j)是有j个工件的时候的最优解
我们的原问题就是j=n时的情况
我们讨论最优解所有可能发生的情形
第一种情况
OPT选择了工件j
我们已经定义了p(j)是在j之前
并与j相容工件的最大序号
那么 因为选择了工件j
那么就不能够选取p(j)+1到j-1的这些工件
因为它是一个最优解
一定在从1,2一直到p(j)这些工件中
也做出了最优的选择
第二种情况
OPT没有选择工件j
它一定是从1一直到j-1这些工件中
做出了最优的选择
由以上两种情况
我们可以给出OPT(j) 的表达式
当j=0的时候
显然OPT(j)=0
一般情况
OPT(j)的值是刚才所说的两种情况中
最优的一种选择
第一种情况对应的目标值为
选取工件j获得的收益v_j
加上OPT(p(j))
另一种情况对应的目标值是OPT(j-1)
OPT(j)等于两种情况取大
这样的方程我们称为动态规划基本方程
下面我们给出动态规划算法的伪代码
输入n个工件的开始时间
结束时间 权重
把工件按照结束时间升序排列
然后按照之前的定义
计算p(1),p(2)…p(n)
算法Compute-Opt(j)
先给出边界条件
如果j=0
那么就是返回0
否则 就按刚才所给出的动态规划基本方程
递归地去求解
算法很简洁
看起来也很优美
但是很快我们发现
它却很难执行
因为在算法的执行过程中
需要调用大量的子问题
这是一个指数时间的算法
比如看下面的例子
有5个工件
加工时间都为3
开始时间依次间隔两个单位
可以计算出来p(1)=0,p(j)=j-2
为了计算opt(5)
我们需要计算opt(4)和opt(3)
依次展开
我们会看到
这是一个二叉的结构
所需要求解子问题的数量
是指数级别增长的
为了克服这个困难
我们可以把算法加以改进
存储算法中间运算中
所求解出的子问题的解
在需要的时候可以直接调用
算法的输入和之前一样
我们对于每个工件j定义M(j)
初始的时候为空
令M(0)=0
然后运行主程序
当M(j)是空的时候
我们调用动态规划基本方程
计算M(j)
带记忆版本的动态规划算法
把执行的时间改进到O(nlogn)
初始的时候
按照工件的结束时间进行排序
需要O(nlogn)的时间
因为工件已经按照结束时间进行升序排列
我们可以用两分搜索
在O(logn)的时间得到p(j)
总计用时就是O(nlogn)
主程序中的计算
主要是动态规划基本方程的运算
每次需要O(1)的时间
每次调用时
或者返回已经存在的一个M[j]的值
或者得到一个新的M[j]的值
并且两次的递归调用算法
我们用势函数的方法
来对总共调用算法的次数进行估计
定义φ等于非空的M[j]的数量
初始时φ=0
算法过程中φ单调增加并且φ≤n
而增加φ一个单位至多两次调用程序
因此总共调用程序的次数不超过2n次
所以主程序被调用的次数是O(n)的
这也就得到了我们所需的结论
动态规划算法给出了
加权区间排序问题的最优值
如何得到最优解呢
我们可以进行一些后期的处理
初始条件如果j=0
那么我们就是返回0
我们已经得到了M[j]的值
可以逐步的去比较v(j)+M(p(j))与M(j-1)的大小
以决定是否加入工件j
如果前者大的话 那么就加入j
否则就放弃工件j
最后输出的工件集合即为所求的最优解
这个算法共n次循环
每次运算时间都是O(1)的
因此算法的运行时间是O(n)的
刚才的算法中
我们是从后往前分析的
用递归的形式给出了算法
实际上对于这个问题
以及很多的动态规划算法
我们还可以从前向后地分析
我们给出相应的算法
预处理阶段和之前一样
把工件按照结束时间升序排列
计算p(j)的值
初始时M(0)=0
然后 j=1到n
按照动态规划基本方程去计算M(j)
可以很清楚的看出
这个算法的运行时间也是O(nlogn)
-1.1 Introduction
-1.2 A First Problem: Stable Matching
--A First Problem: Stable Matching
-1.3 Gale-Shapley Algorithm
-1.4 Understanding Gale-Shapley Algorithm
--Understanding Gale-Shapley Algorithm
-Homework1
-Lecture note 1
--Lecture note 1 Introduction of Algorithm
-2.1 Computational Tractability
-2.2 Asymptotic Order of Growth
-2.3 A Survey of Common Running Times
--A Survey of Common Running Times
-Homework2
-Lecture note 2
--Lecture note 2 Basics of Algorithm Analysis
-3.1 Basic Definitions and Applications
--Basic Definitions and Applications
-3.2 Graph Traversal
-3.3 Testing Bipartiteness
-3.4 Connectivity in Directed Graphs
--Connectivity in Directed Graphs
-3.5 DAG and Topological Ordering
--DAG and Topological Ordering
-Homework3
-Lecture note 3
-4.1 Coin Changing
-4.2 Interval Scheduling
-4.3 Interval Partitioning
-4.4 Scheduling to Minimize Lateness
--Scheduling to Minimize Lateness
-4.5 Optimal Caching
-4.6 Shortest Paths in a Graph
-4.7 Minimum Spanning Tree
-4.8 Correctness of Algorithms
-4.9 Clustering
-Homework4
-Lecture note 4
--Lecture note 4 Greedy Algorithms
-5.1 Mergesort
-5.2 Counting Inversions
-5.3 Closest Pair of Points
-5.4 Integer Multiplication
-5.5 Matrix Multiplication
--Video
-5.6 Convolution and FFT
-5.7 FFT
--FFT
-5.8 Inverse DFT
-Homework5
-Lecture note 5
--Lecture note 5 Divide and Conquer
-6.1 Weighted Interval Scheduling
--Weighted Interval Scheduling
-6.2 Segmented Least Squares
-6.3 Knapsack Problem
-6.4 RNA Secondary Structure
-6.5 Sequence Alignment
-6.6 Shortest Paths
-Homework6
-Lecture note 6
--Lecture note 6 Dynamic Programming
-7.1 Flows and Cuts
-7.2 Minimum Cut and Maximum Flow
--Minimum Cut and Maximum Flow
-7.3 Ford-Fulkerson Algorithm
-7.4 Choosing Good Augmenting Paths
--Choosing Good Augmenting Paths
-7.5 Bipartite Matching
-Homework7
-Lecture note 7
-8.1 Polynomial-Time Reductions
-8.2 Basic Reduction Strategies I
--Basic Reduction Strategies I
-8.3 Basic Reduction Strategies II
--Basic Reduction Strategies II
-8.4 Definition of NP
-8.5 Problems in NP
-8.6 NP-Completeness
-8.7 Sequencing Problems
-8.8 Numerical Problems
-8.9 co-NP and the Asymmetry of NP
--co-NP and the Asymmetry of NP
-Homework8
-Lecture note 8
--Lecture note 8 NP and Computational Intractability
-9.1 Load Balancing
-9.2 Center Selection
-9.3 The Pricing Method: Vertex Cover
--The Pricing Method: Vertex Cover
-9.4 LP Rounding: Vertex Cover
-9.5 Knapsack Problem
-Homework9
-Lecture note 9
--Lecture note 9 Approximation Algorithms
-10.1 Landscape of an Optimization Problem
--Landscape of an Optimization Problem
-10.2 Maximum Cut
-10.3 Nash Equilibria
-10.4 Price of Stability
-Homework10
-Lecture note 10
--Lecture note 10 Local Search
-11.1 Contention Resolution
-11.2 Linearity of Expectation
-11.3 MAX 3-SAT
-11.4 Chernoff Bounds
-Homework11
-Lecture note 11
--Lecture note 11 Randomized Algorithms
-Exam