算法设计分析:解剖动态规划

    使用动态规划这种技术的算法,不是递归调用自身,但是问题的基础解通常是用递归函数的形式来说明的。
    分治算法是采用自上而下的方式求值,导致了不止一次的递归调用;而动态规划法是采取自下向上的方式递推求值,并把中间结果存储起来以便用于后续计算。
    利用这种技术可以设计出特别有效算法来解决许多组合最优化问题,也可以用来改善蛮力搜索算法的时间复杂性,从而解决一些有NP难度的问题

    这种技术把一个问题的解决方案视为一系列决策的结果,还要考察每个决策序列中是否包含一个最优子序列。


例子:

最长公共子序列问题

 在字母表∑上,分别给出长度为n和m的字符串A和B,确定在A和B中最长公共子序列的长度。


穷举法
    可使用穷举法求解字符串A和B的最长公共子序列长度,算法描述如下:
    列举字符串A的除空串之外的所有子序列,设A的长度为n,A共有2n-1个子序列。
    例A="abcd",可能的24-1=15个子序列为:              
 a、b、c、d、(4个)
 ab、ac、ad、bc、bd、cd、(6个)
 abc、abd、acd、bcd、 (4个)
 abcd(1个)


设字符串B的长度为m,对于A的每一个子序列可在O(m)时间内确定它是否是B的子序列。显然,穷举法的时间复杂性为O(m2n)。若采用动态规划法,它的时间复杂性仅为Θ(mn)。


动态规划法
    设A=a1a2...an、 B=b1b2...bm,L[i,j]表示a1a2...ai和b1b2...bj的最长公共子序列长度。设1≤i≤n、1≤j≤m,很容易证明下面的观察结论:

 设i>0且j>0,那么
若ai=bj,L[i,j]=L[i-1,j-1]+1;
若ai≠bj,L[i,j]=max(L[i,j-1],L[i-1,j])。

①若ai=bj,计算a1a2...ai和b1b2...bj的最长公共子序列的长度,相当于在计算a1a2...ai-1和b1b2...bj-1最长公共子序列长度的基础上加1。
②若ai≠bj,计算a1a2...ai和b1b2...bj的最长公共子序列的长度,相当于分别计算a1a2...ai-1和b1b2...bj(j不变、i-1)、a1a2...ai(i不变、j-1)和b1b2...bj-1最长公共子序列长度,然后选取二者的大者。


讨论:

①在许多组合优化问题中,问题的解经常可用递推式来表示。若直接求解,将导致许多子实例被不止一次地计算。在动态规划法中,子问题的解以表项的形式被存储,避免了重复计算。
②在动态规划法中,对于原问题的每个子问题,算法都计算了一个最优解。例公共子序列问题中的L[i,j],它是在L[i-1,j]、 L[i,j-1]、 L[i-1,j-1]的基础上计算而得,这三者本身是问题的最优子解。

最优化原理:
    给出一个最优决策序列,每个子序列自身必须是最优的决策序列。


背包问题定义如下,设U={u1,u2,...,un}是一个准备放入背包中的n个物品的集合,si和vi分别为物品ui的体积和价值(1≤i≤n),背包的容量为C,si、vi和C均为正整数。要解决的问题是:从U中取出一些物品装入背包,装入物品的体积之和不超过C,要求使得背包中的物品总价值为最大。
㈡穷举法
    对于某一物品而言,或者装入或者不装入,所以背包问题又称为0/1背包问题。n个物品相当于一个具有n位的二进制数,共有2n个装入方案。可从2n个方案中找出最佳值,故穷举法的时间复杂性为Θ(2n)。若采用动态规划法,可在Θ(Cn)时间内得到最优解。


动态规划法
    设Ui是物品集U的子集,它由U的前i项{u1,u2,...ui}构成。从Ui取出若干个物品装入体积为j的背包中,所形成的物品最大价值用V[i,j]表示,其中0≤i≤n、0≤j≤C。显然解用V[n,C]表示。
V[0,j]=0 直观意义为背包中无任何物品
V[i,0]=0 直观意义为背包的容量为0


当i>0且j>0,V[i,j]是下面二个量的最大值:
V[i-1,j]:从物品子集Ui-1中取出若干物品装入体积为j的背包中所形成的价值最大值(即不装入物品ui)。
V[i-1,j-si]+vi:从物品子集Ui-1中取出若干物品装入容量为j-si的背包中所形成的价值最大值。在此基础上,再加上物品ui的价值vi,显然j≥si (即装入物品ui)。

由于计算表的每一项需要Θ(1)时间,所以算法的时间复杂性恰好是表的大小Θ(nC)。
只要对算法Knapsack作简单的修改,就可输出装在背包中的物品。
由于计算当前行时仅需要上一行的值,因此只要对算法稍作修改,可以使算法的空间复杂性为Θ(C)。


背包问题和最长公共子序列问题都是采用自上而下、自左至右的方法逐步求解。
对于背包问题的求解,自上而下表现为:可选择的物品逐个增加;自左至右表现为:在可选择物品确定的情况下,背包容量按单位体积增加,由此逐个求出对应的最优子解。
设字符串A为横坐标、字符串B为纵坐标。对于最长公共子序列问题的求解,自上而下表现为:B的子序列逐字符增加;自左至右表现为:在字符串B的子序列确定的情况下,字符串A的子序列逐字符增加,由此逐个求出对应的最优子解。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值