本文主要是介绍算法基本思想(结尾附上记忆口诀),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
算法基本思想(结尾附上记忆口诀)
- 贪心
- 分治
- 枚举
- 动态
- 回溯
- 递归(兄弟思想-递推)
这篇文章说的这些思想网上一大堆,可以不看。直接关注结尾自创口诀,希望给你提供一点帮助。
递归
概述
在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法
特点
- 边界条件
- 规模递减
能解决的问题
- 数据的定义是按递归定义的。如Fibonacci函数。
- 问题解法按递归算法实现。如Hanoi问题。
- 数据的结构形式是按递归定义的。如二叉树、广义表等
递归解题的基本套路
- 明确这个函数的功能
- 递推公式 自上而下的分析
- 补充到步骤1中定义的函数中
- 时间复杂度的计算
参考文献
一文看懂什么递归(算法小结)
https://zhuanlan.zhihu.com/p/94748605
https://juejin.im/post/6844904008595816462
分治
概述
在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并
步骤
分解(将原问题分解成一系列子问题)
求解(递归的求解各子问题,若子问题足够小,则直接求解)
合并(将子问题的解合并成原问题的解)
适用情况
如排序算法(归并排序、快速排序)、傅立叶变换(快速傅立叶变换)
贪心
概述
又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。[1]比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
贪心算法的基本思路
- 根据问题来建立数学模型,一般面试题会定义一个简单模型;
- 把待求解问题划分成若干个子问题,对每个子问题进行求解,得到子问题的局部最优解;
- 把子问题的局部最优解进行合并,得到最后基于局部最优解的一个解,即原问题的答案。
具有以下性质可以使用贪心算法
最优子结构
贪心选择性质
适用情况
贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson’s Paradox),不一定出现最优的解。
贪心算法在Data Science领域都被资泛应用,特别是金融工程。其中一个贪心算法例子就是Ensemble method
实例
最小生成树、求哈夫曼编码、活动选择问题
回溯
概述
回溯法:有"通用的解题法"之称,可以系统地搜索一个问题的所有解或任一解。在包含问题的所有解的解空间树时,按照深度优先的策略,从根节点触发搜索解空间树。搜索至任一结点时,总是先判断该结点是否肯定不包含问题的解,如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先的策略进行搜索。
可以理解为先进行深度优先搜索,一直向下探测,当此路不通时,返回上一层探索另外的分支,重复此步骤,这就是回溯,意为先一直探测,当不成功时再返回上一层。
适用情况
实例
八皇后问题、迷宫类问题
枚举
概述
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。
解题思路
确定枚举对象、枚举范围和判定条件。
逐一列举可能的解,验证每个解是否是问题的解。
动态
概述
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
适用情况
- 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
- 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
- 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率,降低了时间复杂度。
实例
0-1背包问题、最长公共子序列
记忆口诀
贪心小蔡,
分治湾湾,
枚人行动,
湾湾回归。
(关注:鲁班曰)
这篇关于算法基本思想(结尾附上记忆口诀)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!