最简单易懂的10堂算法入门课

听起来高大上的“算法”,其实一点也不难!

算法思想就是解题思路,是算法程序的提纲,常见的算法思想就4种:

贪心算法(GreedyAlgorithm)

分治算法(DivideandConquer)

动态规划(DynamicProgramming)

穷举搜索(ExhaustiveSearching)

可以说90%以上的算法,都来自这4种基本思想。

前面2节课,我们讲解了贪心算法和分治算法。

而分治算法是将原问题的规模减小,变成更容易解决的问题,有时允许反复分治减规模减到很小,问题的最优解甚至达到一目了然的状态。

今天要讲的动态规划,简直是集上述两种思想之大成,又克服二者的缺点。

动态规划,英文是DynamicProgramming(DP),擅长解决“多阶段决策问题”,利用各个阶段之间的递推关系,逐个确定每个阶段的最优决策,并最终得到原问题最优决策。

理解动态规划,可以先从名字入手。

“动态”,是指“变化的状态”,我们将怎样做决策这样的抽象问题,使用数据来定义为一个一个的状态,而这些状态是随着问题的规模而变化的。这里比较类似于分治法,问题的规模是变化的。

“规划”,英文是programming,其实不是“编程”的意思,更易于理解的翻译应该是“表格”,也就是说,上面所说的那些“变化的状态”放在一些,成为一个表格,随着问题的推进,表格会不断地更新。

动态规划往往使用表格来存储中间结果

这就是动态规划。

动态规划是基础算法中最不好理解的,咱们先从一个最简单的小问题慢慢讲解。

问题:一个10级的台阶,每次只能上1级或2级,问题共有几种上法?

读者可以先自己思考一下,这其实就是一类最简单的多阶段决策问题。

每一步上几级台阶,都是一个决策

其实,我们可以先把问题倒着想一下:

最后一次决策,也就是完成10级台阶的最后一步,要么是从第8级迈2级上来,要么就是从第9级迈1级上来的,所以也就是说,有多少种办法上8级,再加上有多少种办法上9级,就是完成10级台阶的方法总和。

如果用F(n)表示上n级台阶共有多少种方法,那么上面的推理表示为:

F(10)=F(9)+F(8)

说到这里,我们发现:

1将求F(10)这个问题,完美的分解成了F(9)和F(8),找到了局部的最优解,与贪心算法有点像;

2既然F(10)=F(9)+F(8),那么F(9)=F(8)+F(7),依此类推,最终问题被逐渐降低了规模,越来越简单,这又是分治的思想;

到这里我想大家对这个问题已经知道大概怎么做了,我们借助这个问题总结一下:

F(10)=F(9)+F(8),就是F(10)问题的最优子问题,局部的贪心完美的将问题分解,如果得到的F(9)和F(8)都是最优解,那么F(10)一定是最优解。

分解到最后,一定是变成了规模最简单的问题,即F(1)和F(2),这两个问题不能再分解了,不过没关系,他们很简单,心算就搞定了。

本问题的状态转移方程为:F(n)=F(n-1)+F(n-2),这是解决问题的核心,是状态能够“动态”起来的原因。

一个典型的二叉树结构

不过仔细一看,就会发现,有好多中间结果是重复的!

相同颜色的部分其实是相同的结果

这就好办了,把计算过的中间结果都存起来呗,如果再次遇到计算过的问题,就直接去查询!

这个存储中间结果的的表,叫做——

备忘录。

上面的算法很不错了,不过并不完全是动态规划的思路,我们需要将思路再倒过来:

从初始的边界条件F(1)和F(2)开始,使用状态转移方程,不就能更快地推导出结果么!

就是这么简单!

每一个格子,其实就是一个状态,随着阶段的进行,这个状态格会不断更新,这就是动态规划。

上面的例子,看起来有点像分治法啊,那么它们之间的区别在哪里?

其实,动态规划最大的特点,在于状态转换方程中,子问题是“有重叠的”,这也是动态规划的意义所在,如果没有重叠,也就不存在上面所说的减小计算量的优势了,那么就退化成分治法了。

重复计算要努力避免

所以说,状态转换方程(DP方程)就是算法的核心,那么设计DP方程,有什么要注意的?

从上面的算法三要素中,可以看出,DP方程是从最优子问题中归纳而来的。

那么,什么才算“最优子问题”呢?

就是说,不管之前决策是否是最优决策,都必须保证从现在开始的决策是在之前的基础上最优。具体的说,我们默认F(8)和F(9)就是最优的,在此基础上,得到最优的F(10)。

THE END
1.算法基础——入门级——八大排序算法总结入门排序算法假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 2、来~手写一个快排/堆排。。。 https://blog.csdn.net/xiaochulei/article/details/90245666
2.算法入门基础知识算法入门 - 基础知识 算法定义 算法是解决特定问题求解步骤的描述 , 在计算机中表现为指令的有限序列 , 并且每条指令表示一个或多个操作 算法的特性 算法具有五个基本特性 : 输入 输出 有穷性 确定性 可行性 输入输出 输入输出特性比较容易理解 算法具有零个或多个输入 对于绝大多数算法来说 输入参数是有必要https://www.jianshu.com/p/2283d8f93a18
3.史上最全面的C语言(算法入门篇)史上最全面的C语言(算法入门篇)的学习目录(更新) 一、程序的灵魂—算法 1算法的概念 2 简单算法举例 3 算法的特性 4、怎样表示一个算法 4.1 用自然语言表示算法 4.2 用流程图表示算法 4.3 三种基本结构和改进的流程图 4.4 用N-S流程图表示算法 https://zhuanlan.zhihu.com/p/389860359
4.初学者必学的算法基础教程本文介绍了算法的基本概念和重要性,涵盖了算法的组成部分和不同类型,如搜索算法、排序算法和图算法。文章还解释了算法的时间复杂度和空间复杂度,并提供了示例代码和学习资源,帮助读者更好地理解和应用算法。 算法基础知识简介 什么是算法 算法是一种用于解决特定问题的有序步骤集合。这些步骤必须是明确的、可执行的https://www.imooc.com/article/362340
5.算法学习攻略总结:入门至进阶,通关之路指南51CTO博客其中,递归是最重要的算法思想之一,你必须要入门。而动态规划、回溯等可以后面刷题遇到时再学。枚举和贪心相对比较简单。 3.3. 如何刷题 掌握了基础的数据结构和算法思想之后,你就可以开始刷题了。 3.3.1. 了解互联网算法笔 在刷题之前,我想先说一说笔试。如果笔试不考算法,面试也不考算法,那么我可能在学习算法https://blog.51cto.com/u_16542656/12047317
6.牛客算法基础入门班通过率只有10%,其中算法编程刷人最多 80% 算法优异的学生,有机会直接 进入到面试环节竞争力提升80% 要想找到好工作,算法这关必须过! 课程学习目标 掌握简单数据结构基础知识 详细讲解简单数据结构基本原理,并提供相关学习资料 熟悉入门算法解题思路 深入讲解入门算法典型例题解题思路,并提供最优解和代码 https://www.nowcoder.com/courses/semester/2020algorithm-base
7.算法入门基础沐雨橙风~~算法入门基础 排序分类: 内部排序:把数据加载到内存中进行排序,适用于数据量小的情况。 外部排序:借助外部的文件等,数据量大,无法加载到内存。 常见分类如图: 算法复杂度 算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的https://www.cnblogs.com/coding-996/p/12267857.html
8.算法竞赛入门第1阶段 - 基础知识储备 1-1 算法与竞赛(第1章) - 入门指南 实验数 4 1-2 算法与竞赛(第2章) - C++与算法基础一 实验数 3 1-3 算法与竞赛(第3章) - C++与算法基础二 实验数 4 1-4 算法与竞赛(第4章) - C++与算法基础三 实验数 5 https://www.educoder.net/paths/nfly825j
9.算法竞赛入门经典PDF扫描版电子书下载本书是一本算法竞赛的入门教材,把C/C++语言、算法和解题有机地结合在了一起,淡化理论,注重学习方法和实践技巧。全书内容分为11章,包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归、基础题目选解、数据结构基础、暴力求解法、高效算法设计、动态规划初步、数学概念与方法、图论模型与算法,覆盖了算法竞赛https://www.jb51.net/books/155734.html
10.码农的数学和算法入门腾讯云开发者社区按照这样的讲解路线,既能让程序员读者巩固基础的概念和知识,同时又能让他们明白这些基础性的内容,对计算机编程和算法究竟意味着什么。 总而言之,这本书的内容从概念到应用,再到本质,层层深入,不但注重培养读者养成良好的数学思维,而且努力使读者的编程技术实现进阶,非常适合希望从本质上提升编程质量的中级程序员阅读和https://cloud.tencent.com/developer/article/1821198
11.零基础学编程:零基础学算法第1章基础算法思想 1.1编程的灵魂:数据结构+算法 1.2算法的作用:猜价格游戏 1.2.1算法的作用 1.2.2实例:看商品猜价格 1.3枚举(穷举)算法思想 1.3.1算法思路 1.3.2实例:填数游戏 1.3.3实例:填运算符 1.4递推算法思想 1.4.1算法思路 1.4.2顺推实例:斐波那契数列 1.4.3逆推实例:该https://baike.baidu.com/item/%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%BC%96%E7%A8%8B%EF%BC%9A%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%AE%97%E6%B3%95/16370841
12.算法竞赛入门到进阶(豆瓣)喜欢读"算法竞赛入门到进阶"的人也喜欢· ··· 算法竞赛进阶指南9.7 趣学算法8.0 高级算法和数据结构9.2 C++ 程序设计语言(第 4 部分:标8.7 计算机体系结构:量化研究方法(第9.5 操作系统设计与实现(上册)9.1 算法详解(卷1)——算法基础9.0 Java核心https://book.douban.com/subject/34465629/
13.零基础入门推荐系统新闻推荐学习赛天池大赛组委会将审核并剔除只靠人工标注而没有算法贡献或无法通过天池实验室复现最优成绩的队伍,获奖空缺名额后补。 大家可以使用手机钉钉扫下方二维码加入“零基础入门系列学习赛官方交流群” 参赛报名 大赛面向全社会开放,参赛对象不限,要求以个人形式参与比赛,并确保报名信息准确有效; 报名方式:用淘宝或阿里云账号登入天池官网https://tianchi.aliyun.com/competition/entrance/531842/introduction
14.由浅至深推荐进阶java书籍(附PDF下载)一、入门基础类 1、Head First Java 第2版·中文版 如果你没有学过其他语言亦或是转行到计算机行业,可以先看看《Head First Java》这本书,此书是根据学习理论所设计的,非常适合零基础的小白, 读起来轻松搞笑,让你可以从程序语言的基础开始一直学习到包括线程、网络与分布式程序等项目。最重要的是,你将学会如何像https://www.w3cschool.cn/java/java-book.html
15.算法学习与应用从入门到精通2.2.1 递推算法基础 12 2.2.2 实践演练—解决 “斐波那契数列”问题 12 2.2.3 实践演练—解决 “银行存款”问题 14 2.3 递归算法思想 15 2.3.1 递归算法基础 15 2.3.2 实践演练—解决“汉诺塔” 问题16 2.3.3 实践演练—解决“阶乘” 问题18 2.4 分治算法思想 19 2.4.1 分治算法基础 19 2.4.2 实践演http://reader.hnlib.com/Book/Detail/377965
16.计算机算法基础(第三版).pdf文档全文预览计算机算法基础(第三版):计算机算法基础(第三版)余祥宣PDF扫描版[12MB],计算机科学技术导论是一本学习计算机专业知识的入门教材,系统地介绍了计算机科学技术的基础知识、基本下载前务必先预览,自己验证一下是不是你要下载的文档! 收藏 分享赏 0 内容提供方:max https://max.book118.com/html/2019/0401/7034121022002016.shtm
17.首页洛谷网校 - 算法竞赛学习 学校编程训练辅助工具 协办企业院校在线编程比赛 近期比赛 东北大学秦皇岛分校第十二届“图灵杯”… 团队公开赛 ICPC未开始7时43分后 NEUQ-ACM 出题组12-22 13:30 12-22 18:30 【LGR-212-Div.2】洛谷 12 月月赛 II …Rated https://www.luogu.com.cn/
18.《算法训练营:海量图解+竞赛刷题(入门篇)》(陈小玉)简介算法入门,以海量图解的形式,详解常用的数据结构与算法,融入大量竞赛实例和解题技巧,轻松入门算法 作者:陈小玉出版社:电子工业出版社出版时间:2021年07月 折扣:折扣指在图书定价基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。 异常问题:如您发现活动商品销售价或促销信息有异常,请立即http://product.dangdang.com/29267036.html