javascript基本算法思想:递归+分治+动态规划+贪心+回溯+分支限界个人文章

下面针对一些基本的算法思想,给出大致的说明和用例。

把一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同,递归的解这些子问题,然后把各个子问题的解合并得到原问题的解。

【题目】

使用快速排序方法排列一个一维数组。

【思路】

对于输入的子数组a[p:r],按照一下3个步骤进行排序:1)分解divide:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],其中a[q]不小于a[p:q-1]中的任何元素且不大于a[q+1:r]中的任何元素,下标q在划分中确定。2)递归求解conquer:通过递归调用排序,分别对a[p:q-1]和a[q+1:r]进行排序。3)合并merge:合并a[p:q-1],a[q]和a[q+1:r]返回为最终结果。

【代码实现】

和分治法基本思想有共同的地方,不同的是子问题往往不是独立的,有事母问题要借助子问题的解来判断,因此把已经计算好的问题记录在表格中,后续如果需要查询一下,可以避免重复计算,这是动态规划的基本思想。

不过动态规划具体实现起来多种多样,不过都具有相同的填表格式,通常按照下面步骤设计算法:1)找出最优解的性质,并刻画其结构特征;2)递归的定义最优值;3)以自底向上的方式计算出最优值;4)通过计算最优值时刻意记录的判断结果来构造最优解。

可以使用该算法思想设计算法的问题一般会具有二个决定性的性质:1)最优子结构性质;2)子问题重叠性质。

和上面的算法思想差不多,不同的是备忘录为每个解过的子问题建立备忘录以备需要的时候查看,避免了相同的问题计算多次。

一般来说,当一个问题的所有子问题都至少要解一次时,用动态规划比备忘录要好,因为不会有任务暂存且没有多余的计算;当子问题空间中部分问题不必解时,用备忘录比较好。

不过上面不是绝对的,这样说只是想区别一下二个思想的不同,具体的时候还是要根据业务场景来在保证可行的前提下选择更好的方法。

给定n个矩形{A1,A2,...,An},其中Ai与Ai+1是可乘的,由于矩阵满足结合律,不同的加括号方法计算次数不一样,求最优的加括号方法。

分别计算有1,2,3,...,n个矩阵的最优解,计算i个时候,全部的i-1的最优解已经记录下来了,保证计算不重复。

算法思想很简单,和字面意思一样,每次都选择对自己最有利的,不过这是有条件的,只有在满足条件下每次选择最有利自己的才可以获取最优解。

贪心选择性质和最优子结构性质是该思想最重要的性质:1)贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择达到。2)最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有此性质。

有一批集装箱要装上一艘载重为c的轮船,其中集装箱i的重量为wi,要求在装货体积不受限制的条件下尽力多装集装箱的解。

先排序,然后选择从最轻的开始装货物。

这里就不提供具体代码了,因为感觉没有什么意义,最重要的是要先确定问题满足贪心选择性质,这样在很多时候,可以更容易的解决问题,这点很重要。

说的直白点就是深度优先方式系统搜索问题的算法。

有一批共n个集装箱要装上两艘载重方别为c1和c2的轮船上,其中集装箱i的重量为wi,且全部集装箱重量不大于两艘载重之和,问是否有一个装载方案完成装载。

对第一艘船,构造一个0/1树,0代表不选择,1代表选择,然后分别去从根节点试图爬到叶节点,去一一记录下来可行的,选择最小的为解,余下的判断第二艘船是否装的下即可。

对比回溯法就很容易思考,用广度优先的办法,不断扩大当前节点的孩子为当前节点,主要是求解一个最优解,算法相比回溯法要简单些。

借助队列,一层层来检查,找到最优解。

我还惊讶地意识到,在我生命中有很多时刻,每当我遇到一个遥不可及、令人害怕的情境,并感到惊慌失措时,我都能够应付——因为我回想起了很久以前自己上过的那一课。

THE END
1.《贪心算法详解》求解活动安排问题贪心法(一)基本概念 贪心算法是一种基于局部最优选择的算法设计策略。在每一步决策中,贪心算法总是选择当前状态下看起来最优的选项,而不考虑整体的最优解。这种局部最优选择的策略在某些情况下可以得到全局最优解,但在其他情况下可能会得到次优解甚至是错误的解。 https://blog.csdn.net/weixin_47266126/article/details/144418709
2.朴素贪心算法入门:轻松掌握贪心算法基础本文介绍了朴素贪心算法的基本概念和特点,解释了其与动态规划的区别,并通过活动选择问题、最小生成树和零钱找零问题等案例来说明朴素贪心算法的应用。文章还探讨了如何证明贪心算法的正确性,并列举了贪心算法在实际生活和计算机科学中的应用场景。 贪心算法简介 贪心算法的基本概念 贪心算法是一种在每个步骤中都采取当前https://www.imooc.com/article/357919
3.贪心法(一):贪心法的基本思想51CTO博客贪心法(一):贪心法的基本思想,在实际问题中,经常会遇到求一个问题的可行解和最优解的问题,这就是所谓的最优化问题。每个最优化问题都包含一组限制条件和一个优化函数,符合条件的解决方案称为可行解,使优化函数取得最佳值的可行解称为最优解。贪心法是求解这类问题的https://blog.51cto.com/u_15127681/4529569
4.1.问题求解算法通过实例掌握动态规划的基本思想与算法设计方法●引导要点:以空间换时间的关键是存储效率; 动态规划与指数时间的有效降低 论题2-13:贪心算法 ●学习目的: 掌握利用贪心策略设计算法的思路与方法; 掌握用分摊进行算法分析的思想与方法●引导要点:贪心算法的正确性证明 论题2-14:用于动态等价关系的数据结构 ●学习目的:https://cs.nju.edu.cn/jxcgj/kctxsf.html
5.Python高级算法——贪心算法(GreedyAlgorithm)贪心算法是一种优化问题的解决方法,它每步选择当前状态下的最优解,最终希望通过局部最优的选择得到全局最优解。在本文中,我们将深入讲解Python中的贪心算法,包括基本概念、算法思想、具体应用场景,并使用代码示例演示贪心算法在实际问题中的应用。 基本概念 https://cloud.tencent.com/developer/article/2369179
6.python常用的算法——贪心算法(又称贪婪算法),你知道吗?贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解。 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。贪心算法和其他算法比较有明显的区https://zhuanlan.zhihu.com/p/99057907
7.八大算法思想(五)贪心算法在从零开始学动态规划中我们已经谈过三种最基本的背包问题:零一背包,部分背包,完全背包。很容易证明,背包问题不能使用贪心算法。然而我们考虑这样一种背包问题:在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。这时便可以使用贪心算法求解了。计算每种物品的单位重量价值作为贪心选择的依据指标,选择https://www.jianshu.com/p/e05d46015648
8.Awesome? Kahn 算法实际上用的是贪心算法思想。? 定义数据结构的时候,如果 s 需要先于 t 执行,那就添加一条 s 指向 t 的边。所以,如果某个顶点入度为 0, 也就表示,没有任何顶点必须先于这个顶点执行,那么这个顶点就可以执行了。? 我们先从图中,找出一个入度为 0 的顶点,将其输https://github.com/Ty-Chen/Awesome-Backend/blob/5ad253a0f2e82d9b83892a60e01a1e0a855d70b3/Data%20Structure%20and%20Algorithm.md
9.贪心算法基本思想和典型例题(转)贪心算法基本思想和典型例题(转)贪?算法基本思想和典型例题(转)贪?算法 ?、算法思想 贪?法的基本思路:——从问题的某?个初始解出发逐步逼近给定的?标,以尽可能快的地求得更好的解。当达到某算法中的某?步不能再继续前进时,算法停?。该算法存在问题:1. 不能保证求得的最后解是https://wenku.baidu.com/view/b353a645deccda38376baf1ffc4ffe473368fdc7.html
10.贪心算法机器之心贪心法,又称贪心算法、贪婪算法、或称贪婪法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 思想 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根https://www.jiqizhixin.com/graph/technologies/d939b81d-166f-4a73-974f-a44976c15148