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.回溯回溯 进度 0/130 已解答 0% 通过率 击败用户 0% 击败用户 0% 击败用户 0% 0尝试中 0次提交 0尝试中 0尝试中 0尝试中 简单 0/4 中等 0/90 困难 0/36 52. N 皇后 II 困难 77. 组合 中等 78. 子集 中等 79. 单词搜索 中等 89. 格雷编码https://leetcode-cn.com/tag/backtracking/
2.回溯性建构(retroactiveconstruction)回溯性建构和小客体有很大关系,确切来说,小客体(作为实证客体的小客体)本身就是回溯性建构起来的客体。这就是说,小客体是在回溯性建构的活动当中才被确立的,才给出了它的存在;在那之前,小客体就是普普通通的东西。就像原材料要被加工才能做成制成品,鲜橙要被榨出来才能称为橙汁,不经历这个榨的过程,你能指着鲜https://www.bilibili.com/read/cv17903071/
3.01背包问题——回溯法回溯法的基本思想 ?“通用的解题法”,尤其适合求解一些组合数较大的问题。 ?它在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树。 ?算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向https://www.jianshu.com/p/5fb5dca10bb0
4.Python回溯法(Backtracking)的具体使用python回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常应用于组合问题、排列问题、子集问题等。在本文中,我们将深入讲解Python中的回溯法,包括基本概念、算法思想、具体应用场景,并使用代码示例演示回溯法在实际问题中的应用。基本概念回溯法的定义回溯https://www.jb51.net/python/30752564r.htm
5.软件设计师考点七:数据结构与算法基础软件设计师10、快速排序采用的是分治法,其基本思想是将原问题分解成若干个规模更小但结构与原问题相似的子问题。通过递归地解决这些子问题,然后再将这些子问题的解组合成原问题的解。 快速排序通常包括两个步骤: 第一步,在待排序的n个记录中任取一个记录,以该记录的排序码为准,将所有记录都分成两组,第1组都小于该数,https://www.educity.cn/rk/1970488.html
6.学好算法,你就可以轻轻松松解数独啦腾讯云开发者社区3. 回溯算法的基本思想与一般步骤 通过上面迷宫的例子,我们可以看出来,所谓的回溯算法实际上就是沿着图的深度优先搜索的策略进行遍历,从一个节点到达另一个节点,而在每个节点,都需要一个方法来判断当前是否是有效结果,这个判断函数就是“剪枝函数”也叫“约束函数”。 回溯算法的一般步骤就是: https://cloud.tencent.com/developer/article/2031645
7.01背包回溯法java实现01背包问题回溯法java资源用c++实现的 0-1背包回溯法 浏览:64 4星 · 用户满意度95% 算法框架: a.. 问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。 b.回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这https://download.csdn.net/download/z228135494/4949737
8.五大常用算法之四:回溯法回溯法思想简单描述:把问题的解空间转化为图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历过程中记录和寻找可行解或者最优解。基本思想类似二叉树的后序遍历。 回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(https://www.imooc.com/article/27990
9.数学逻辑AI智能与世界自然语言是人类最主要的沟通工具之一,包括各种语言如英语、汉语、西班牙语等,这些语言用于描述和表达思想、情感、观点等,涵盖了广泛的主题和领域。物理学是研究自然界基本规律的科学,通过数学模型和物理定律来描述和解释物质、能量、力量、运动等各种现象和实验结果。化学通过化学https://mp.weixin.qq.com/s?__biz=MzA4OTYwNzk0NA==&mid=2649726619&idx=1&sn=d93a8c1135f06002850aa71c9284efbd&chksm=892d59cc033fde690315a6f83106fdf9fc3490d40ed1364a8554c1e19bd9107395d5a67cdf61&scene=27
10.操作系统课程设计(银行家算法的模拟实现)6篇(全文)一.银行家算法的基本概念 1、死锁概念。 在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前https://www.99xueshu.com/w/filedvxsl9m3.html
11.5.算法设计与分析回溯算法51CTO博客1.2 回溯法的基本思想 在生成解空间树时,定义以下几个相关概念: 活结点:如果已生成一个结点而它的所有儿子结点还没有全部生成,则这个结点叫做活结点。 扩展结点:当前正在生成其儿子结点的活结点叫扩展结点(正扩展的结点)。 死结点:不再进一步扩展或者其儿子结点已全部生成的结点就是死结点。 https://blog.51cto.com/u_14682436/5703000
12.人类命运共同体理念“天下观”与“和文化”的思想精髓人类命运共同体理念___“天下观”与“和文化”的思想精髓,将攸关中国前途命运的中国梦与攸关世界各国前途命运的世界梦紧密连接在一起,让世界各国___中国智慧、中国经验,既让世界发展成为中国的机遇,又让中国发展成为世界的机遇。填入画横线部分最恰当的一项是: A. 借鉴 发扬 B. 凝聚 了解 C. 吸取 认可 Dhttps://www.shuashuati.com/ti/b7ae3416f5a54349a251b6c4f8f813f5.html
13.回溯分析法的特点是什么–PingCode二、回溯法基本思想 在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。树根为初始状态,这样的状态集合称为状态空间树。 https://docs.pingcode.com/ask/13636.html