常考的算法是从8.3章节的分治法开始往后。
分治法:
分治法书上说的比较简单,也没有大段的好像找不到逻辑规律的文字描述,就说了分三步:
1、分解 2、求解 3、合并
特点也用一句很简洁的话说出来了:“这些子问题互相独立且与原问题相同。分治法产生的子问题往往是原问题的较小模式,这就为递归技术提供了方便。”。
---
分治法的典型实例也说了两个:第一个就是题目中所说的归并排序,明显就是这三步,完美符合分治法的特点。
第二个是最大子段和问题。也就是给一组数,问哪一段连续的数值加起来最大?和归并差不多都需要划分为最小子段,不过在比较的时候,需要考虑三种情况,1种是和整段(或分段)的前半段相同,2种是和后半段相同,3种是横跨前后两段。划分的每一段都需要进行这三种情况进行比较。
-----------------------------------
动态规划法:另一个常考的算法
说了4步:1、找到【最优解】的结构性质,2、递归定义最优解,3、计算出最优解,4、构造出最优解
算法需要的问题特点:1、有最优子结构(贪心法也可能适用),2、重复子问题,“即当一个递归算法不断地调用同一个问题时”。问题的解需要相同。
---
典型实例:
01背包问题:就是一个背包不能超过它的最大重量w,有多个物品(个数n),物品有价值vi,和重量wi。问怎么才能让装进去的东西总价值最大?
01的意思就是要么放1个,要么不放,不能再拆分。书上的解释在428页,大段的可能不好理解的逻辑(代码形式的文字描述,而不是通常易理解的形式),直接搞代码了。如果看代码理解快的请自行查看它的详细策略。
考点:在2013、2016年的题目考过它的详细01背包问题的求解。2010、2019考过01背包的特点从属关系。
最长公共子序列:就是给两个序列,找出它们里面最长相同的相连的是哪一段。同样是利用的它的4步。
矩阵链乘问题(书上667页)。
-----------------------------------
贪心法:直接看原文吧,非常好理解:“和动态规划法一样,贪心法也经常用于解决最优化问题。与动态规划法不同的是,贪心法在解决问题的策略上是仅根据当前己有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,【这个选择都不会改变】。换而言之,贪心法并【不是从整体最优】考虑,它所做出的选择只是在某种意义上的【局部最优】。这种局部最优选择【并不能保证总能获得全局最优解】,但通常能得到较好的近似最优解。”。
“如果只有面值分别为1、5和11单位的硬币,而希望找回总额为15单位的硬币,按贪心算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币。但最优的解答应是3个5单位面值的硬币。”
它的适用性同样有最优子结构,另一个是贪心选择性质。贪心法先要确定有一个原则,按什么最大或者最小或者最近或者最远来规划。重点是一开始的选择最怎么怎么样。
例子:同样举了两个例子,1个是活动选择问题(具体请自行查找),1个是背包问题。这个背包问题也叫部分背包问题,和上面的01背包问题不同,部分背包问题的物品还可以拆分,比如一包瓜子,可以抓一把放到背包里。这个就适合用贪心法。这个就可以按总价值最大来装,或者也可以按最小重量来装,两种不同的贪心。
另外两个算法可以看题: https://www.z21.org/question/100
书上举的例子里面,回溯法的实例也有01背包问题,另外还有一个以前可能是2019年上半年在应用题的算法中考过的n皇后问题,并且问它是什么算法,其实是回溯法。(深度优先)。
分支界限法,它的实例仍然有01背包问题。而且只举了这个实例。(广度优先)。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!