动态规划-背包及最优二叉树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(7,7) (6,6) (4,5) (5,3) (3,2) (0, 0) (2, 1)
m(1,x)
(9,8)
x
x
x
10
算法改进
•函数m(i,j)是由函数m(i+1,j)与函数m(i+1,j-wi)+vi作max运 算得到的。因此,函数m(i,j)的全部跳跃点包含于函数m(i+1, j)的跳跃点集p[i+1]与函数m(i+1,j-wi)+vi的跳跃点集q[i+1] 的并集中。易知,(s,t)q[i+1]当且仅当wisc且(s-wi,tvi)p[i+1]。因此,容易由p[i+1]确定跳跃点集q[i+1]如下 q[i+1]=p[i+1](wi,vi)={(j+wi,m(i,j)+vi)|(j,m(i,j))p[i+1]} •另一方面,设(a,b)和(c,d)是p[i+1]q[i+1]中的2个跳跃 点,则当ca且d<b时,(c,d)受控于(a,b),从而(c,d)不是 p[i]中的跳跃点。除受控跳跃点外,p[i+1]q[i+1]中的其它跳 跃点均为p[i]中的跳跃点。 •由此可见,在递归地由表p[i+1]计算表p[i]时,可先由p[i+1] 计算出q[i+1],然后合并表p[i+1]和表q[i+1],并清除其中的 受控跳跃点得到表p[i]。
算法复杂度分析
上述算法的主要计算量在于计算跳跃点集 p[i](1≤i≤n)。由于q[i+1]=p[i+1](wi,vi),故计 算q[i+1]需要O(|p[i+1]|)计算时间。合并p[i+1]和 q[i+1]并清除受控跳跃点也需要O(|p[i+1]|)计算时 间。从跳跃点集p[i]的定义可以看出,p[i]中的跳跃 点相应于xi,…,xn的0/1赋值。因此,p[i]中跳跃点个 数不超过2n-i+1。由此可见,算法计算跳跃点集p[i] 所花费的计算时间为 O | p[i 1] | O 2 nO2 从而,改进后算法的计算时间复杂性为 O(2 )。当所 给物品的重量wi(1≤i≤n)是整数时,|p[i]|≤c+1, (1≤i≤n)。在这种情况下,改进后算法的计算时间复 杂性为O(min{nc,2n})。
首先,准备一个标号为0到4共5行和标号从0起到9共10列的空的 矩形表,接着用值0初始化0列和0行的元素
列号
按如下办法直接填行1的值:m[1,j]=3(第一种物品的价值), 当且仅当j≥2(第一种物品的体积)。 第二行中的每项m[2,j]有两种可能性,第一种可能性是置 m[2,j]=m[1,j]这相当于把第一种物品放入背包,2号物品放不下;第 二种可能性是置m[2,j]=m[1,j-3]+4,它相当于加上第二种物品,使 它或者仅包含第二种物品,或者同时包含第一种和第二种物品。当然, 仅当j≥3时,才有可能加上第二种物品。继续这种方法,填入第3行 和第4行,得到如图所示的表。
for (int m=2;m<=n;m++) for (i=0;i<=n-m;i++) { int j=i+m; w[i][j]=w[i][j-1]+p[j]+q[j]; int k = Find(i,j,r,c); c[i][j] = w[i][j] + c[i][k-1] + c[k][j]; r[i][j] = k; }
构造最优二叉搜索树 int Find(int i,int j,int **r,float**c) { float min=INFTY; int k; for (int m=i+1;m<=j;m++) if ((c[i][m-1]+c[m][j])<min) { min=c[i][m-1]+c[m][j];k=m; } return k; }
n n n i n i 2 i 2
13
查找 插入 删除
设 有 元 素 集 合 S={x1,x2,…,xn} , 其 中 , x1<x2<…<xn 。表示有序集 S 的二叉搜索树利用 二叉树的结点来存储有序集中的元素。 二叉搜索树的叶子结点是形如( xi,xi+1 )的开区 间。 在表示 S的二叉搜索树中搜索一个元素 x ,返回的 结果有两种情形: (1)在二叉搜索树的内结点中找到x=xi (2)在二叉搜索树的叶子结点中确定x属于 ( xi,xi+1 )
void CreateOBST(float* p,float* q, float **c,int **r,float**w,int n) { for (int i=0;i<=n-1;i++) { w[i][i]=q[i];c[i][i]=0.0;r[i][i]=0; w[i][i+1]=q[i]+q[i+1]+p[i+1]; c[i][i+1]=q[i]+q[i+1]+p[i+1]; r[i][i+1]=i+1; } w[n][n]=q[n];c[n][n]=0.0;r[n][n]=0;
体 积 为
行列号
0 0 0 0 0 0
1 0 0 0 0 0 图
2 0 3 3 3 3
3 0 3 4 4 4
4 0 3 4 4 5
5 0 3 7 7 7
6 0 3 7 8 8
7 0 3 7 9 10
8 0 3 7 9 11
9 0 3 7 12 12
容量为9 的背包
, , 和 3 4 5
的 物 品 , 价 值 分 别 为
c(i, j) min
i 1 k j
i 1 k j
{w(i, j) c(i, k 1) c(k, j) }
min { c(i, k 1) c(k, j) } w(i,j)
例 设 n = 4 且( a1,a2,a3,a4 ) =(Mon,Thu,Tue,Wed) 。又设 p(1:4)=(3,3,1,1) 和 q(0:4) = (2,3,1,1,1) 。这里 p 和 q 都已 乘了16。
0-1背包问题
所谓0/1背包问题是指在物品不能分割,只能整件装入背包或 不装入的情况下,求一种最佳装载方案使得总收益最大. 给定n种物品和一背包,物品编号从1到n。物品i的重量是wi,其 价值为vi,背包的容量为C。问应如何选择装入背包的物品,使 得装入背包中物品的总价值最大. 0-1背包问题是一个特殊的整数规划问题。
11
一个例子
n=5,c=10,w={2,2,6,5,4},v={6,3,5,4,6}。 初始时p[6]={(0,0)},(w5,v5)=(4,6)。因此, q[6]=p[6](w5,v5)={(4,6)}。 p[5]={(0,0),(4,6)}。 q[5]=p[5](w4,v4)={(5,4),(9,10)}。从跳跃点集p[5]与q[5]的 并集p[5]q[5]={(0,0),(4,6),(5,4),(9,10)}中看到跳跃点(5,4) 受控于跳跃点(4,6)。将受控跳跃点(5,4)清除后,得到 p[4]={(0,0),(4,6),(9,10)} q[4]=p[4](6,5)={(6,5),(10,11)} p[3]={(0,0),(4,6),(9,10),(10,11)} q[3]=p[3](2,3)={(2,3),(6,9)} p[2]={(0,0),(2,3),(4,6),(6,9),(9,10),(10,11)} q[2]=p[2](2,6)={(2,6),(4,9),(6,12),(8,15)} p[1]={(0,0),(2,6),(4,9),(6,12),(8,15)} p[1]的最后的那个跳跃点(8,15)给出所求的最优值为 m(1,c)=15。 12
设 c(0,n) 是由元素值集合{a1,…,an}所构造的最优 二叉搜索树的代价,则
c(0, n) min { w(0, n) c(0, k 1) c(k, n) }
1 k n
wenku.baidu.com
min { c(0, k 1) c(k, n) } w(0, n)
1 k n
一般地,c(i,j) ,ij 是元素值集合{ai+1,…,aj}所构造的 最优二叉搜索树的代价,设 r(i,j)=k 为该树的根,要 求结点k满足
0 1 2 3 4
, , 和
。
2 3 4 5 7
背包问题算法的一个例子 每种物品只一件
第 9 列的第i项,也就是V[i,9],包含通过用前i个物品来装背包可 以得到的最大价值,这样,在最后一列的最后一项找到最优解 ,通过装物 品 3 和 4 达到。还存在着装物品 1,2 和 3 的另一个最优解,这个解对 应于表中的 m[3,9],它是在考虑第 4 种物品前的最优解。
最优二叉搜索树
45
二叉搜索树
3
12 37 24
53
100
(1)若它的左子树不空,则左子树上所有 节点的值均小于它的根节点的值; (2)若它的右子树不空,则右子树上所有 节点的值均大于它的根节点的值; (3 它的左、右子树也分别为二叉排序树
61 90 78
在随机的情况下,二叉查找树的平均查找长度 和 log n是等数量级的
max{ m(i 1,j ), m(i 1,j w i ) v i } j w i ,i 0 j wi m(i 1,j ) m(i ,j ) 0 i 0或j 0
4
假如有容量为9的背包,要装入4种体积为2,3,4和5的物品, 价值分别为3,4,5和7。 要在不超出背包容量的前提下,用某种方法尽可能多地在背包内 装入物品,使总价值最大,
对每一个确定的i(1≤i≤n),用一个表p[i]存储函数m(i,j)的全 部跳跃点。表p[i]可依计算m(i,j)的递归式递归地由表p[i+1] 计算,初始时p[n+1]={(0,0)}。
9
一个例子
n=3,c=6,w={4,3,2},v={5,2,1}。
m(4,x) (0,0)
m(4,x-2)+1 (2,1)
作业 设有 0/1 背包问题 n=3 ,( w1,w2,w3 ) = ( 2,3,4 ), (v1,v2,v3)=(1,2,4)和C=6。
Knapsack有两个较明显的缺点:
1.算法要求所给物品的重量w是整数
2.当背包容量c很大时,算法需要的计 算时间比较多。
算法改进
由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的 i(1≤i≤n),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳 跃点是这一类函数的描述特征。在一般情况下,函数m(i,j)由 其全部跳跃点唯一确定。如图所示。
m(3,x) (2,1) (0,0)
x
m(3,x-3)+2 (3,2)
x
m(2,x) (5,3) (3,2) (2,1) (5,3)
x
m(3,x) (2,1) (0,0)
x
x
(0,0)
x
(9,8)
m(2,x)
(0,0)
(3,2) (2,1)
(5,3)
m(2,x-4)+5 (7,7) (6,6) (4,5)
max vi xi
i 1
n
n wi xi C i 1 xi {0,1},1 i n
2
最优子结构 0/1背包的最优解具有最优子结构特性。 设 (x1, x2,… , xn),xi{0,1}是0/1背包的最优解, 那么,(x1 ,x2,… , xn-1) 必然是0/1背包子问题的 最优解:背包载重Cwnxn,共有n-1件物品,第i 件物品的重量为 wi,效益Vi,wi>0,vi>0, 1i<n。
22
p(i) 是在集合中成功查找xi 的概率,1i n, q(i)是待查元素x值满足 xi<x<xi+1的概率,0i n (假定x0= , xn+1=+)。
p(i ) q(i ) 1 i i
1 0
n
n
最优二叉搜索树问题是指设法构造一棵具有最 小平均搜索时间的二叉搜索树。
0-1背包问题
设所给0-1背包问题的子问题
max v k x k
k i
n wk x k j k i x k {0,1}, i k n
n
的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为1, 2,…,i时0-1背包问题的最优值。由0-1背包问题的最优子结 构性质,可以建立计算m(i,j)的递归式如下。