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