14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
系列博客: 趣味算法-01-跟着作者读《趣味算法(第2版)》上
趣味算法-02-跟着作者读《趣味算法(第2版)》下
趣味算法-03-跟着作者读《趣味算法(第2版)》-算法之美
趣味算法-04-跟着作者读《趣味算法(第2版)》-贪心算法
本文是系列博客的第2篇,是听了陈老师的报告后的记录,主要包括如何学习算法。
1.如何高效学习算法 1.1初学者如何学习算法 如何想高效的学习算法,是一个问题,因为算法的内容的很多,很多人对深度学习,推荐系统,这些更感兴趣,基于框架,仿佛容易做出效果。如果上来就接触这些算法,很多人都会陷入顶层应用调参,如果想在这里提出一个创新,就很不好下手。
对此,陈老师给出的建议是:初学者需要先从基础算法学习,宽基础,精技术 。同时学好数据数据结构和算法基础知识,这点是非常重要,很多工作想提升的人,也需要重新开始学习算法。
在计算机专业领域,数据结构与算法无处不在。数据结构与算法是各大名企的面试题。同时数据结构与算法是计算机的基本内功,学好数据结构与算法,不仅具有较强的分析问题、解决问题的能力,思维能力,还可以快速学习各种新技术,拥有超强学习力。数据结构与算法这些基本功很重要,尤其是大学生,一定要重视这门课,学的时候就学扎实 。
1.2 学习算法的三种层次 如何衡量算法学习情况呢,可以分为如下三个层次:
1.会数据结构的基本操作和经典算法
2.会利用数据结构与算法,解决实际问题
3.熟练使用和改进数据结构,优化算法
这里的算法可以分为经典算法 ,实用算法 ,面试算法 。
一些朋友通过学习,可以基于算法完成应用开发,但由于对数据结构和算法不够了解,如果想深入一些,就很困难了。如果对于想要进入大厂的同学,建议达到熟练使用和改进数据结构,优化算法的阶段 ,否则竞争力不够强。
1.3 如何高效学习算法 如何才能达到第3个层次呢,陈老师给出如下方案:
针对陈老师的讲义和汇报,这里复述下:
首先看书+看视频 :看书要看图解较多的入门书 ,要易懂,太多公式推导堆积的书,未必适合大部分算法爱好者。如果看书可以明白,就可以动手操作了。否则可以结合视频,因为视频有解题过程,并能展现问题分析过程,还能对关键算法进行理解 。同时非常重要的先分析,再动手 ,不要上来就写,算法的分析很重要。另外书中还有具有源代码,只有伪代码的方式其实很难有直观的讲解。总结下,就是学经典,多理解 。 其次是解题+刷题 :在基本入门之后,可以进行专项练习 ,比如动态规划,把这个领域的算法掌握好了,就可以,贪多嚼不烂,要不停的反思总结,分析最优算法 。 最后是刷题+总结 :另外很重要的问题是,通过专项刷题,总结常用的算法模板(是总结,而不是靠背题),然后要灵活运用,举一反三,因为不同问题的实现算法都是不同的,不断的练习,达到快速bugfree的地步(还是很难的) 。 2.如何进行刷题 在对算法有基础的掌握后,刷题就很重要了,如何刷题呢,方法如下:
什么时候开始刷题 :在一类算法学完后就可以刷这类的题 了,如果不理解,就看书,如果书中不理解,就看题解,避免ctrl+cv大法。然后对相关题目进行刷题,比如学完贪心,就做贪心算法 的题。另外需要注意的是,要先本地编译通过,然后测试用例通过再提交,避免在线多次提交,影响成绩 。在哪里刷题。 :老师提供的刷题网站如下:
打比赛:Vjudge,POJ,HDU,Code Forces,洛谷
找工作:LeetCode 牛客网
在线测试系统OJ(Online Judge)
https://vjudge.net 提交结果类型:
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编译错误
通过的不同的错误,可以辅助定位刷题时遇到的代码问题提交不通过怎么办:
提交不通过是很常见的,即使测试用例通过,提交不通过是很正常的,因为测试用例仅仅是一两组数据,而后台有大量测试数据。遇到提交不通过,首先冷静,根据错误类型分析原因。
WA答案错:冷静分析算法逻辑,易错点,特殊情况判断等 。
TLE超时:选择的数据结构和算法是否合适?是否有死循环? 如何判断是否超时:
看题目时要看数据规模 、时间限制 和空间限制 ,设计算法时是否超时超限,心中有数。如果限制时间为1s,则问题规模和时间复杂度之间的关系为:n<=11 时 O\left( n!\right) n<=25 时 O\left( 2^{n}\right) n<=5000 时 O\left( n^{2}\right) n<=10^{6}时 O\left(n\log n\right) n<=10^{7}时 O\left(n\right) n>10^{8}时 O\left(\log n\right) 十分实用的对应关系,做算法分析与设计阶段可以特别考虑。
记录坑点:
这个坑点每个人遇到的都不一样,可以根据自己的刷题过程,进行整理记录。3. 如何准备算法面试 如何准备算法面试:
首先这个过程是个持久战,需要1-2年的时间来积累数据结构和算法,这个时候,如果ACM铜牌之类的,就可以进大厂 。如果没有竞赛,就需要现场可以快速的敲代码解决问题,想实现快速解决问题,需要1-2的积累 ,没有快速的办法。语言关比较快,成年人1-2月尽可入门,然后去做数据结构,做数据结构的过程中,就在用语言了。 如果有基础了,就可以进行面试准备了,花费1-3个月在leetcode进行刷题 。 然后就可以模拟面试 了,根据经验来说,大部分的面试往往都是简单的 。 最后从技巧的角度来说,如果去某厂面试,还是有必要去针对这个企业,进行面试问题收集与模拟的 ,这样增加企业的面试通过几率。