14天阅读挑战赛
《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法
《趣学算法(第2版)》读书笔记 Part 2 :算法入门
《趣学算法(第2版)》读书笔记 Part 3 :贪心算法基础(理论)
《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)
对应图书前言部分及挑战赛开营直播
任何时候都不要等待,先迈出第一步。
Step by Step.
希望整本书坚持读完再回头看笔记时,我能庆幸自己不仅仅是参与过、努力过,而是真正学有所获。
直播流水账不能水,是小白最后的倔强。
这竟然是我在 CSDN 写的第一篇博文…(战战兢兢,如履薄冰)…阅读挑战赛开营的前夜还在捣腾着学Markdown和HTML基础语法…
学识尚浅,笔记难免会有错漏和不足,欢迎评论指出。随着后续的学习,只要有时间,前期的博文也会仔细做增补、修改。
希望这些笔记对正在学习算法的你也有所帮助,一起学习,一起进步。
The real purpose of books is to trap the mind into doing its own thinking.书籍的真正目的在于诱导头脑自己去思考。
—— Christopher Morley 克里斯托弗·莫利
还在直播间探讨有没有签名时,购买的纸质图书就已寄出…好吧,我决定打印一张签名截图固定在图书扉页里。这里附上作者老师的亲笔签名:
相比预告的11月30日出版时间,能提早拿到纸质图书,还是要感谢出版社的老师们。阅读时如果能在实体书里勾画、标注,感觉更有利于学习、理解。
直播时间:2022.10.17 20:00
直播主题:如何高效学习算法
直播平台:
异步社区(微信视频号)
CSDN(微信视频号)
直播简介:
直播全程由作者老师 陈小玉 主讲。
主要结合图书前言部分介绍新版《趣学算法(第2版)》的特点和建议阅读方法、对算法学习和面试的建议、直播答疑等。
更多直播细节可参考微信视频号的 直播回放 。
直播回放地址:
错过直播的同学可以打开微信视频号,右上角搜索用户异步社区或CSDN关注。
然后,在对应视频号的 直播回放 里可找到此次直播的完整回放视频。
如今小学四年级学生就开始学算法了,为什么大家都在学习算法?
冲击高薪、算法是程序设计的基本内功、提升核心竞争力
思维清晰、学习力强、视野开阔、心智成熟
N.Wirth教授:数据结构+算法=程序。
从基础算法学起,宽基础,精技术。
本书涉及三个方面的算法:①经典算法②实用算法③面试算法
先系统的学习数据结构与算法基础知识,然后进行刷题实战,循序渐进。
看书学完一种算法之后就去找相关的简单题目开始刷题,注意从易到难。
刷题时,先在编译系统中编译通过、测试用例通过,检查无误后再提交。因为比赛中,多次提交会罚时。
使用在线测试系统OJ(Online Judge)刷题,推荐的刷题网站:
推荐用Vjudge,注册一个帐号即可使用三十多个OJ网站题目资源。
Vjudge
Virtual Judge,集成了32个OJ(Online Judge系统,即在线判题系统)网站的门户平台。
地址 <https://vjudge.net/>
vjudge使用指南 <https://blog.csdn.net/weixin_52341477/article/details/122063233>
Virtual Judge使用介绍 <https://blog.csdn.net/fymx203/article/details/89343782>
POJ
Peking University Online Judge 北京大学程序在线评测系统
地址 <http://www.poj.openjudge.cn/>
官方简介(链接) <https://center.pku.edu.cn/zxts/pojxt/index.htm>
百度百科简介 <https://baike.baidu.com/item/POJ/3812218?fr=aladdin>
HDU
Hangzhou Dianzi University Online Judge 杭州电子科技大学在线评测系统
地址 <http://acm.hdu.edu.cn/> (经测试,该地址已404)
HDU杭电ACMOJ训练指南 <https://blog.csdn.net/weixin_45333934/article/details/108814279>
Code Forces
简称CF,是一家为计算机编程爱好者提供在线评测系统的俄罗斯刷题网站。由萨拉托夫国立大学的一个团体创立并负责运营。
地址 <https://codeforces.com/problemset>
Codeforces的使用 <https://blog.csdn.net/weixin_43715214/article/details/89142596>
全世界最强的算法平台codeforces究竟有什么魅力? <https://blog.csdn.net/TechFlow/article/details/108842133>
codeforces 刷题指南 <https://blog.csdn.net/cmershen/article/details/83996514>
Codeforces科学刷题指南 <https://blog.csdn.net/qq_16964363/article/details/79224776>
最新codeforces的rating评级 <https://blog.csdn.net/weixin_45529716/article/details/105913804>
Codeforces游玩攻略(入门)<https://www.sohu.com/a/245025892_100201031>
Codeforces快速精通(进阶)<https://www.luogu.org/blog/ezoixx130/codeforces-advanced-tutorial>
VSCODE codeforces 插件 <https://blog.csdn.net/CQUWEL/article/details/117710216>
洛谷
洛谷Online Judge,是基于网页形式的信息学在线评测系统。
官方简介 <https://www.luogu.com.cn/blog/luogu/about-luogu>
知乎简介 <https://zhidao.baidu.com/question/1436293475539527979.html>
(入门系列)洛谷功能全解 <https://blog.csdn.net/rrc12345/article/details/122500057>
洛谷百科全书(一) <https://blog.csdn.net/Y_bluefat/article/details/115592598>
洛谷-各个评测状态 <https://blog.csdn.net/mengdicfm/article/details/82963581/>
LeetCode
力扣,是一个为用户提供编程训练的OJ网站。源自美国硅谷,致力于为全球程序员提供专业的IT技术职业化提升平台。
地址 <https://leetcode.cn/>
官方简介 <https://leetcode.cn/brand/?utm_source=main-footer&utm_medium=footer-link>
LeetCode Cookbook(LeetCode中文刷题手册) <https://github.com/halfrost/LeetCode-Go>
程序员专用刷题网站大全 <https://blog.csdn.net/python2021_/article/details/124400768>
超好用的ACM刷题网站 <https://blog.csdn.net/qq_43929617/article/details/105917026>
ACM团队队员常用训练网站 <http://coi.hzau.edu.cn/info/1183/4730.htm>
简称 | 全称 | 中文释义 | Action | 备注 |
---|---|---|---|---|
AC | Accepted | 通过 | 常见 | |
WA | Wrong Answer | 答案错误 | 冷静分析算法逻辑,易错点,特殊情况判断等。 | 较常见。 |
TLE | Time Limit Exceed | 超时 | 选择的数据结构和算法是否合适,是否有死循环 | 较常见,指代码运行时间超过限制。 |
MLE | Memory Limit Exceed | 超内存 | 很少见。 | |
OLE | Output Limit Exceed | 超过输出限制 | ||
RE | Runtime Error | 运行时错误 | ||
PE | Presentation Error | 输出格式错误 | ||
CE | Compile Error | 编译错误 |
测试用例通过了,但提交不通过是很正常的,因为测试用例仅仅是一两组数据,而后台有大量测试数据。遇到提交不通过,要冷静的根据错误类型分析原因。
看题目时要看数据规模、时间限制和空间限制,设计算法时是否超时超限,心中有数。
如果限制时间为1s,则问题规模和时间复杂度之间的关系为:
问题规模 | 时间复杂度 |
---|---|
n<=11 | O(n!) |
n<=25 | O(2n) |
n<=5000 | O(n2) |
n<=106 | O(nlogn) |
n<=107 | O(n) |
n>108 | O(logn) |
在刷题的过程中,将坑点记录下来,避免下次踩坑。把常犯、易犯的错误都用笔记的形式记录下来,类似错题本。
下面是一些例子(基于C++语言):
int a[1000];//静态数组
memset(a,0,sizeof(a)); //清零 memset(a,-1,sizeof(a));//初始化-1
memset(a,0x3f,sizeof(a)); //无穷大0x3f3f3f3f
动态数组不可以直接用sizeof测量空间:
const int maxn=10000;
int *a = new int[maxn]; //动态数组
memset(a,0x3f,maxn*sizeof(int));//无穷大
fill(a,a+maxn, 0x3f3f3f3f);//使用fill函数
问:没有数据结构和算法基础可以学《趣学算法(第2版)》吗?
答:可以,先开始看《趣学算法(第2版)》,遇到有需要数据结构知识的部分再去查阅视频、博文、书籍等相关资料。
因为本书在讲解算法过程时,大多是使用图解的方式展示。另有配套视频和作者在线答疑支持学习。
问:比赛刷题和面试刷题有什么区别?
答:有很大的区别。
比赛刷题主要考察你解决复杂问题的能力,取算法最优解。算法比赛含金量较高,不管是什么层次、类型的比赛,尽可能去拿金牌,保证含金量。
面试刷题则相对简单,主要考察你的算法复杂性,即同样问题下你能不能给出更好的算法。
参考文献资料:
《费曼学习法》:世界公认最好的高效学习方法
If you can’t explain it simply, you don’t understand it well enough. 如果你不能简单说清楚,那就是你没完全明白。
—— Albert Einstein 阿尔伯特·爱因斯坦(1879-1955)
传统的学习方法,是死记硬背的输入模式,通过机械背诵,让大脑在短时间内被动记忆新的知识点。容易忘、效率低、比较难转化为自己的知识体系。
费曼主张的以教代学输出模式,是用最简洁、直白的语言去阐述知识点,此时大脑会从记忆库中自动提取那些熟悉的信息,让新旧知识主动产生关联,从而使新知识容易得到大脑彻底的理解。
1965年,美国物理学家理查德·费曼获诺贝尔物理学奖。费曼写有一本自传《别闹,费曼先生》,正是在这本书中,他总结出了 “费曼学习法”。
费曼学习法 “以教促学”:把你学到的,讲给别人听,最好是完全不懂的人。
目标
为了通过学习建立自己行之有效的思维框架,并运用知识解决生活和工作中的实际问题。必须要有清晰的目标,有高效能的学习计划,带着强烈的兴趣去思考,还要遵循一些必要的原则。
理解
首先是“学习的方法论”,其次才是学习的具体技能。
方法论的核心是系统化,即对要学习的知识点进行归类对比,系统理解这些内容,建立筛选和学习的原则。
建立思维导图,复盘一次思路,加深对学习内容的理解。
输出
从学习方式与内容留存率分析可以看出,输出是最强的学习力,这种“以教代学”模式是费曼学习法的核心。输出,是一个强化提升的过程。当要输出这些知识时,才清楚自己究竟掌握了多少,发现那些还需要强化和加深理解的内容。
回顾
回顾是一个查漏补缺、消除盲维的纠错过程。就像海中冰山隐藏在海面以下的部分。
回顾的过程,是主动地查找与总结、反思和修正。
简化
学习要尽可能地简化,只学习需要的、重要的、知识之中“最核心的知识”。
“费曼学习法”四个步骤:
第一步,确定一个要学习的概念,然后尽可能多的搜集阅读与其相关的资料,并在此过程中做好笔记。
第二步,尝试把这个概念教给他人。把你学到的东西通俗易懂的讲出来。
第三步:发现教学过程中的缺陷并解决它,重新教给他人,直到零基础的听众也能轻松理解。 在第二步中,你不可避免地会卡壳,忘记重点、无法合理解释、无法将重要的概念联系起来。此时,就再回过头去阅读和理解那些资料,搞清楚问题所在并解决它。
第四步:去掉专业术语,将语言条理化并简化,让5岁的小朋友也能马上理解你所讲述的概念。
当这四步完成之后,你就真正吃透了所学的概念。
实际运用中,也可使用文字语言把所学的知识点写清楚。
使用“费曼学习法”需把握的几个要点:
子曰:三人行,必有我师焉。