贪心算法与动态规划的比较

合集下载

《数理精蕴》中对数造表的三种算法比较

《数理精蕴》中对数造表的三种算法比较

《数理精蕴》中对数造表的三种算法比较
数学是一门复杂的学科,随着科学技术的进步,伴随着数学在 Many Internet 上的使用,数理精蕴就出现了。

在数理精蕴中,数造表是其中重要的部分,其有三种算法,分别是动态规划、搜索算法和贪心算法。

在这里,我们将简单介绍下这三种算法及其之间的比较。

动态规划算法是一种用来求解最优化问题的数学方法,它的目的在于寻求最优解,即在所有可能的解中找最优解。

它的运算理论上是一种多阶段决策过程,从性能上,优势是速度较快且方法易于稳定。

但其缺点也是比较明显的,即如果搜索规模较大,容易打破计算机的空间限制,导致运算异常耗时长。

搜索算法是经典的穷举搜索算法,一般利用回溯、深度搜索等策略来求解最优解。

它的优势在于在性能上比较快,可以比较快速地找出所有可能的解,而且解更加准确。

但同时它也有很多缺点,其主要缺点是它的计算量大,搜索范围太广,穷尽所有可能解,导致运行效率太低。

最后介绍贪心算法。

它是一种在搜索复杂问题时常用的数学算法,其思想是在每次迭代中尽可能选择当前最优的解。

它的优点是运算速度较快,运算量也较低,无论状态空间是否爆炸,都可以很容易地估算出所求解的最优解。

但它存在的缺点也很明显,就是求解过程中不能保证得到一个最佳解,而且当状态空间复杂或巨大时,它会大大限制所得解的准确性。

从上述分析可以看出,动态规划算法、搜索算法和贪心算法,这三种数造表算法,各有其优势和缺点,根据实际应用情况灵活的进行选择,可以较好的满足各类需求。

贪心算法、分治算法、动态规划算法间的比较.doc

贪心算法、分治算法、动态规划算法间的比较.doc

题目:贪心算法、分治算法、动态规划算法间的比较贪心算法:贪心算法采用的是逐步构造最优解的方法。

在每个阶段,都在一定的标准下做出一个看上去最优的决策。

决策一旦做出,就不可能再更改。

做出这个局部最优决策所依照的标准称为贪心准则。

分治算法:分治法的思想是将一个难以直接解决大的问题分解成容易求解的子问题,以便各个击破、分而治之。

动态规划:将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。

在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。

依次解决各子问题,最后一个子问题就是初始问题的解。

二、算法间的关联与不同1、分治算法与动态规划分治法所能解决的问题一般具有以下几个特征:①该问题的规模缩小到一定程度就可以容易地解决。

②该问题可以分为若干个较小规模的相似的问题,即该问题具有最优子结构性质。

③利用该问题分解出的子问题的解可以合并为该问题的解。

④该问题所分解出的各个子问题是相互独立的且子问题即之间不包含公共的子问题。

上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是分治法应用的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划算法;第四条特征涉及到分治法的效率,如果各个子问题不是独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。

这类问题虽然可以用分治法解决,但用动态规划算法解决效率更高。

当问题满足第一、二、三条,而不满足第四条时,一般可以用动态规划法解决,可以说,动态规划法的实质是:分治算法思想+解决子问题冗余情况2、贪心算法与动态规划算法多阶段逐步解决问题的策略就是按一定顺序或一定的策略逐步解决问题的方法。

动态规划和贪心算法的时间复杂度分析比较两种算法的效率

动态规划和贪心算法的时间复杂度分析比较两种算法的效率

动态规划和贪心算法的时间复杂度分析比较两种算法的效率动态规划和贪心算法是常见的算法设计思想,它们在解决问题时具有高效性和灵活性。

但是,两者在时间复杂度上有所不同。

本文将对动态规划和贪心算法的时间复杂度进行详细分析,并比较这两种算法的效率。

一、动态规划算法的时间复杂度分析动态规划是一种通过将问题分解成子问题并保存子问题的解来求解的算法。

其时间复杂度主要取决于子问题的数量和每个子问题的求解时间。

1. 子问题数量动态规划算法通常使用一个二维数组来保存子问题的解,数组的大小与原问题规模相关。

假设原问题规模为N,每个子问题的规模为k,则子问题数量为N/k。

因此,子问题数量与原问题规模N的关系为O(N/k)。

2. 每个子问题的求解时间每个子问题的求解时间通常也与子问题的规模相关,假设每个子问题的求解时间为T(k),则整个动态规划算法的时间复杂度可以表示为O(T(k) * N/k)。

综上所述,动态规划算法的时间复杂度可以表示为O(T(k) * N/k),其中T(k)表示每个子问题的求解时间。

二、贪心算法的时间复杂度分析贪心算法是一种通过选择当前最优的解来求解问题的算法。

其时间复杂度主要取决于问题的规模和每个选择的求解时间。

1. 问题规模对于贪心算法来说,问题的规模通常是不断缩小的,因此可以假设问题规模为N。

2. 每个选择的求解时间每个选择的求解时间可以假设为O(1)。

贪心算法通常是基于问题的局部最优解进行选择,而不需要计算所有可能的选择。

因此,每个选择的求解时间可以认为是常数级别的。

综上所述,贪心算法的时间复杂度可以表示为O(N)。

三、动态规划和贪心算法的效率比较从时间复杂度的分析结果来看,动态规划算法的时间复杂度为O(T(k) * N/k),而贪心算法的时间复杂度为O(N)。

可以发现,在问题规模较大时,动态规划算法的时间复杂度更高。

原因在于动态规划算法需要保存所有子问题的解,在解决子问题时需要遍历所有可能的选择,因此时间复杂度较高。

greedysoup策略

greedysoup策略

greedysoup策略在计算机科学中,贪心算法(greedy algorithm)是一种通过每一步都选择当前最优解的策略来求解问题的方法。

与动态规划算法相比,贪心算法通常更加简单高效,但也存在一些问题不能通过贪心算法来解决。

贪心算法的基本思想是,每一步都选择当前最优解,不考虑对后续步骤的影响。

这种局部最优解的选择方式可以保证整体的最优解,从而达到求解问题的目的。

贪心算法通常适用于满足“最优子结构”和“贪心选择性质”的问题。

最优子结构是指问题的最优解可以通过子问题的最优解来构造。

贪心选择性质是指每一步都选择当前最优解,并且这个选择不依赖于后续步骤的选择。

这两个性质是贪心算法能够成功求解问题的关键。

贪心算法的应用非常广泛,常见的问题包括最小生成树、单源最短路径、背包问题等。

下面将通过几个例子来说明贪心算法的应用。

1. 最小生成树问题最小生成树问题是指在一个带权无向图中找到一棵包含所有顶点的生成树,使得树的权值之和最小。

贪心算法可以通过每次选择权值最小的边来构建最小生成树。

2. 单源最短路径问题单源最短路径问题是指在一个带权有向图中,求解从一个顶点到其他所有顶点的最短路径。

贪心算法可以通过每次选择当前距离最短的顶点来更新其他顶点的距离。

3. 背包问题背包问题是指给定一个固定大小的背包和一组物品,每个物品有自己的价值和重量,在背包中放入物品使得总价值最大。

贪心算法可以通过每次选择单位价值最高的物品来求解。

虽然贪心算法具有简单高效的特点,但并不是所有问题都适合使用贪心算法来求解。

贪心算法的局限性在于,它无法回退,一旦做出选择就无法撤销。

因此,在某些情况下,贪心算法求得的结果可能并不是全局最优解。

贪心算法是一种常用的求解问题的方法,通过每一步都选择当前最优解的策略,可以高效地求解一些问题。

然而,贪心算法并不适用于所有问题,需要根据具体情况进行选择。

在实际应用中,我们可以结合其他算法来进一步优化贪心算法的效果,以满足实际需求。

计算思维之常用算法设计

计算思维之常用算法设计

计算思维之常用算法设计算法是计算机解决问题的一种方法或者步骤。

在计算思维中,算法设计是非常重要的一部分,它涉及到如何将一个问题转化为计算机可以理解和处理的问题,通过编写算法来解决这些问题。

常用的算法设计方法有很多,下面将介绍一些常见的算法设计思路和方法。

1.贪心算法贪心算法是一种通过每一步的局部最优解来寻找全局最优解的方法。

贪心算法通常用于解决问题的最优解不一定是全局最优的情况,而是局部最优解可以推出全局最优解的问题。

贪心算法的核心思想是每一步只考虑局部最优解,并希望通过每一步的局部最优解能够得到全局最优解。

2.分治算法分治算法是一种将一个大问题分解成若干个小问题并逐个解决,最后将这些小问题的解合并成整个问题的解的方法。

分治算法通常用于解决大规模的问题,通过将问题分解为规模较小的子问题来解决,在解决子问题的过程中,可以使用递归或循环等方式。

3.动态规划算法动态规划算法是一种通过将问题分解成重叠子问题,并使用递推关系来解决子问题的方法。

动态规划算法通常用于解决最优化问题,通过定义状态和状态转移方程来描述问题,然后使用递推或迭代的方式来求解问题的最优解。

4.回溯算法回溯算法是一种通过尝试所有可能的解,并在尝试的过程中进行判断来寻找符合条件的解的方法。

回溯算法通常用于解决在问题空间中寻找满足约束条件的解的问题,通过在过程中进行剪枝和回溯的操作,可以有效地到符合条件的解。

5.分支界限算法分支界限算法是一种通过对问题的空间进行分支和界限的方式来寻找满足约束条件的解的方法。

分支界限算法通常用于解决优化问题,通过对问题的空间进行分支和剪枝的操作,可以有效地到最优解或近似最优解。

除了以上几种常见的算法设计方法外,还有一些其他的算法设计思路和方法,如模拟退火算法、遗传算法、神经网络等。

不同的问题需要使用不同的算法设计思路和方法来解决,因此在实际应用中需要根据问题的特点选择合适的算法设计方法。

总的来说,算法设计是计算思维中的重要内容,它涉及到如何将问题转化为计算机可以理解和处理的问题,通过编写算法来解决这些问题。

常见八种算法详解 -回复

常见八种算法详解 -回复

常见八种算法详解-回复“常见八种算法详解”算法是计算机科学中的重要概念,是解决问题的方法和步骤的描述。

常见八种算法是指八种常用的计算机算法,包括贪心算法、动态规划算法、分治算法、回溯算法、递归算法、穷举算法、分支限界算法和排序算法。

下面将逐一详细介绍这八种算法的原理和应用。

一、贪心算法贪心算法是一种寻找局部最优解的方法,在每一步选择中都采取在当前状态下最好或最优的选择,从而希望最后得到的结果是全局最好或最优的。

贪心算法的核心思想是利用局部最优解构建全局最优解。

其典型应用包括霍夫曼编码、最小生成树算法和最短路径算法等。

二、动态规划算法动态规划算法是一种将问题分解成相互重叠的子问题并解决子问题的优化问题。

动态规划算法的核心思想是通过存储已计算结果来避免重复计算,以达到减少计算时间的目的。

其典型应用包括背包问题、最长公共子序列和矩阵连乘等。

三、分治算法分治算法是一种将问题分解成相互独立且同样类型的子问题,然后递归地解决这些子问题的方法。

分治算法的核心思想是将原问题分解成多个相似的子问题,然后将子问题的解合并成原问题的解。

其典型应用包括归并排序、快速排序和二分查找等。

四、回溯算法回溯算法是一种通过穷举所有可能的解来求解问题的方法。

回溯算法的核心思想是在每一步都尝试所有可能的选项,并根据问题的约束条件和限制条件进行搜索和剪枝,以找到问题的解。

其典型应用包括八皇后问题、0-1背包问题和图的着色问题等。

五、递归算法递归算法是一种通过调用自身来解决问题的方法。

递归算法的核心思想是将大问题转化为相同类型的小问题,然后逐层向下求解小问题,直到达到问题的结束条件。

其典型应用包括计算斐波那契数列、求解阶乘和合并排序等。

六、穷举算法穷举算法是一种通过列举所有可能的解来求解问题的方法。

穷举算法的核心思想是遍历问题的解空间,找到符合问题要求的解。

穷举算法通常适用于问题的解空间较小的情况。

其典型应用包括全排列问题、子集和问题和图的哈密顿回路问题等。

动态规划算法的优缺点及其应用场景

动态规划算法的优缺点及其应用场景

动态规划算法的优缺点及其应用场景动态规划算法是一种重要的算法思想,广泛应用于计算机科学、数学等领域。

动态规划算法以其高效的运行效率和优秀的求解能力被广泛应用于各种领域,如计算机视觉、自然语言处理、医学数据分析等。

在本文中,我们将讨论动态规划算法的优缺点及其应用场景。

动态规划算法的优点1.高效性:动态规划算法的时间和空间复杂度都相对较低。

与暴力搜索和贪心算法相比,动态规划算法避免了重复计算,可以大大提高效率。

2.适用性:动态规划算法可以解决许多问题,如最长公共子序列问题、最大子段和问题、背包问题等。

在求解这些问题时,动态规划算法可以有效地优化计算时间和空间。

3.求解能力:动态规划算法可以求解最优策略问题。

在某些场景下,贪心算法无法求解最优策略,而动态规划算法可以。

动态规划算法的缺点1.设计复杂:动态规划算法的设计较为复杂,需要对问题进行深入分析,并根据问题特点设计出适合的状态转移方程。

这对于不熟练的程序员来说可能会存在一定的难度。

2.空间占用:在求解某些问题时,动态规划算法可能需要占用较多的内存空间,导致程序运行速度变慢。

3.无法扩展:有些问题直接使用动态规划算法无法求解。

在这种情况下,就需要使用其他算法思想,如回溯算法、分治算法等。

动态规划算法的应用场景1.医学数据分析:在医学领域中,动态规划算法被广泛应用。

例如,它可以用于研究基因序列的匹配和编辑距离问题。

2.计算机视觉:在计算机视觉领域中,动态规划算法被广泛应用于图像处理和目标识别。

例如,它可以用于检测图像的边缘和角点等。

3.自然语言处理:在自然语言处理领域中,动态规划算法可以用于句法分析和语义分析等。

4.图形学:在图形学中,动态规划算法可以用于绘制曲线和曲面。

展望随着技术的不断发展,动态规划算法被广泛应用于各个领域。

未来,我们可以期待动态规划算法的进一步发展,例如在计算机安全、智能交通等领域中的应用。

同时,我们也需要不断探索算法思想和算法模型,提高算法效率和求解能力。

动态规划算法和贪心算法比较和分析

动态规划算法和贪心算法比较和分析

动态规划算法和贪心算法的比较与分析1、最优化原理根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。

解决这类问题的最优化原理:一个过程的最优决策具有这样的性质,即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略。

简而言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。

2、动态规划2.1 动态规划算法动态规划是运筹学的一个分支,与其说它是一种算法,不如说它是一种思维方法更贴切。

因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。

许多隐式图上的算法,例如求单源最短路径的Dijkstra算法、广度优先搜索算法,都渗透着动态规划的思想。

还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。

因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用。

它必须对具体问题进行具体分析、处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。

动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

值得注意的是,用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。

最优化原理是动态规划的基础。

任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。

能采用动态规划求解的问题都要满足两个条件:①问题中的状态必须满足最优化原理;②问题中的状态必须满足无后效性。

所谓无后效性是指下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结。

2.2 动态规划算法的基本要素(1)最优子结构。

设计动态规划算法的第一步通常是刻画最优解的结构。

当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

贪心算法与动态规划的比较【摘要】介绍了计算机算法设计的两种常用算法思想:贪心算法与动态规划算法。

通过介绍两种算法思想的基本原理,比较两种算法的联系和区别。

通过背包问题对比了两种算法的使用特点和使用范围。

【关键字】动态规划;贪心算法;背包问题1、引言为了满足人们对大数据量信息处理的渴望,为解决各种实际问题,计算机算法学得到了飞速的发展,线性规划、动态规划、贪心策略等一系列运筹学模型纷纷运用到计算机算法学中,产生了解决各种现实问题的有效算法。

虽然设计一个好的求解算法更像是一门艺术而不像是技术,但仍然存在一些行之有效的、能够用于解决许多问题的算法设计方法,你可以使用这些方法来设计算法,并观察这些算法是如何工作的。

一般情况下,为了获得较好的性能,必须对算法进行细致的调整。

但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。

本文针对部分背包问题和0/ 1 背包问题进行分析,介绍贪心算法和动态规划算法的区别。

2、背包问题的提出给定n种物品( 每种物品仅有一件) 和一个背包。

物品i的重量是w i,其价值为p i,背包的容量为M。

问应如何选择物品装入背包,使得装入背包中的物品的总价值最大,每件物品i的装入情况为x i,得到的效益是p i*x i。

⑴部分背包问题。

在选择物品时,可以将物品分割为部分装入背包,即0≤x i≤1 ( 贪心算法)。

⑵0/ 1背包问题。

和部分背包问题相似,但是在选择物品装入时要么不装,要么全装入,即x i = 1或0。

( 动态规划算法) 。

3、贪心算法3.1 贪心算法的基本要素能够使用贪心算法的许多例子都是最优化问题,每个最优化问题都包含一组限制条件和一个优化函数,符合限制条件的问题求解方案称为可行解;使优化函数取得最佳值的可行解称为最优解。

此类所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到(这是贪心算法与动态规划的主要区别) 。

3.2贪心策略的定义贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值( 或较优解) 的一种解题方法。

贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该问题运用贪心策略可以得到最优解或较优解。

(注:贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解。

但其解必然是最优解的很好近似解。

)采用自顶向下的、以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。

对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。

通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。

然后用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。

3、3贪心算法的实际应用例子⑴贪心法的基本思路。

从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快地求得更好的解。

当达到某算法中的某一步不能再继续前进时,算法停止。

⑵该算法存在的问题。

① 不能保证求得的最后解是最佳的;② 不能用来求最大或最小解问题;只能求满足某些约束条件的可行解的范围。

⑶实现该算法的过程。

从问题的某一初始解出发;当能朝给定总目标前进一步时,求出可行解的一个解元素;由所有解元素组合成问题的一个可行解。

⑷背包问题分析实例(部分背包问题)。

有一个背包,容量是M = 150,有7个物品,物品可以分割成任意大小,要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

其重量和价值如下。

物品 A B C D E F G重量 35 30 60 50 40 10 25价值 10 40 30 50 35 40 30其中目标函i p ∑最大。

约束条件是装入的物品总重量不超过背包容量:i w ∑< M (M=150)根据贪心的策略,每次选取单位容量价值最大的物品,成为解本题的策略。

可以证明得到最优解为x = [ 0,1,0,1,7/ 8,1,1]总价值为:190. 6。

3、4 贪心算法不适于解0/ 1 背包问题0/ 1 背包问题有好几种贪婪策略,每种贪婪策略都要多个步骤来完成,每一步都利用贪婪准则选择一个物品装入背包。

一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。

这种策略不能保证得到最优解。

例如,考虑n= 2, w = [ 100,10,10] , p = [ 20,15,15] ,c = 105。

当利用价值贪婪准则时,获得的解为x =[ 1,0,0] ,这种方案的总价值为20。

而最优解为[ 0,1,1] ,其总价值为30。

另一种方案是重量贪婪准则: 从剩下的物品中选择可装入背包的重量最小的物品。

虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。

考虑n =2,w =[ 10,20] ,p = [ 5,100] ,c = 25。

当利用重量贪婪策略时,获得的解为x = [ 1,0] ,比最优解[ 0,1] 要差。

还可以利用另一方案,价值密度p i / w i 贪婪算法,这种选择准则为:从剩余物品中选择可装入包的p i / w i 值最大的物品,这种策略也不能保证得到最优解。

4、动态规划4、1 动态规划的定义动态规划是运筹学的一个分支,与其说它是一种算法,不如说它是一种思维方法更贴切。

因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。

许多隐式图上的算法,例如求单源最短路径的Dijkstra 算法、广度优先搜索算法,都渗透着动态规划的思想。

还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。

因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用。

它必须对具体问题进行具体分析、处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。

4、2 动态规划适于解决的问题适用动态规划的问题必须满足最优化原理和无后效性。

⑴状态必须满足最优化原理。

作为整个过程的最优策略具有如下性质:无论过去的状态和决策如何,对前面的决策所形成的当前状态而言,余下的诸决策必须构成最优策略。

可以通俗地理解为子问题的局部最优将导致整个问题的全局最优,即问题具有最优子结构的性质,也就是说一个问题的最优解只取决于其子问题的最优解,非最优解对问题的求解没有影响。

⑵状态必须满足无后效性。

所谓无后效性是指:过去的决策只能通过当前状态影响未来的发展,当前的状态是对以往决策的总结。

它说明动态规划适于解决当前决策和过去状态无关的问题。

状态出现在策略的任何一个位置,它的地位都是相同的,都可以实施同样的决策,这就是无后效性的内涵。

4、3动态规划问题的特征动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。

① 最优子结构。

当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

② 重叠子问题。

在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。

动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

4、4设计动态规划法的步骤⑴找出最优解的性质,并刻画其结构特征;⑵递归地定义最优值( 写出动态规划方程) ;⑶ 以自底向上的方式计算出最优值;⑷根据计算最优值时得到的信息,构造一个最优解。

步骤1- 3 是动态规划算法的基本步骤。

在只需求出最优值的情形下,步骤4 可以省略,步骤3 中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3 中记录的信息必须足够多,以便构造最优解。

4、5动态规划算法[ 0/ 1 背包问题] 在该问题中需要决定n x x ,......,1 的值。

假设按i=1,2,......,n 的次序来确定x i 的值。

如果置x 1= 0,则问题转变为相对于其余物品(即物品2,3,......,n ),背包容量仍为c 的背包问题。

若置x 1=1,问题就变为关于最大背包容量为c-w 1的问题。

现设r& Icirc ;{c-w 1}为剩余的背包容量。

在第一次决策之后,剩下的问题便是考虑背包容量为r 时的决策。

不管x i 是0 或是1,[x 2,......,x n ] 必须是第一次决策之后的一个最优方案,如果不是,则会有一个更好的方案[y 2,......,y n ],因而[x 1,y 2,......,y n ] 是一个更好的方案。

假设n=3,w=[ 100,14,10] ,p=[ 20,18,15],c=116 。

若设x 1==1 ,则在本次决策之后,可用的背包容量为r =116- 100= 16。

[ x2,x3]= [ 0,1] 符合容量限制的条件,所得值为15,但因为[ x2,x3] = [ 1,0] 同样符合容量条件且所得值为18,因此[ x2,x3] = [ 0,1] 并非最优策略。

即x=[ 1,0,1] 可改进为x = [ 1,1,0] 。

若设x1=0,则对于剩下的两种物品而言,容量限制条件为116。

总之,如果子问题的结果[x2,x3] 不是剩余情况下的一个最优解,则[ x1,x2,x3] 也不会是总体的最优解。

5、小结和贪心算法一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。

不同的是,在贪婪算法中,每用一次贪心准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。

当一个问题具有最优子结构时,我们会想到用动态规划法去解它,但是有些问题存在着更简单、有效的方法,只要我们总是做出当前看来最好的选择就可以了。

贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,这使得算法在编码和执行的过程中都有着一定的速度优势。

如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。

但是贪心算法并不是对所有的问题都能得到整体最优解或最理想的近似解,与回溯法等比较,它的适用区域相对狭窄许多,因此正确地判断它的应用时机十分重要。

参考文献:[1]余祥宣,崔国华,邹海明.计算机算法基础( 第二版)[M].华中科技大学出版社,1998[2]苏德富,钟诚.计算机算法设计与分析[M].电子工业出版社,2001:[3]M.H.A LSU WAI YEL 算法设计技巧与分析[M].电子工业出版社(影印版)[4]朱洪.算法设计和分析[M].上海科学技术文献出版社,1989:[5]余祥宣,崔国华,邹海明.计算机算法基础(第二版)[M].华中科技大学出版社,1998。

相关文档
最新文档