闲着没事?你可以这样学学算法

对于很多码农来说,算法总是显得有那么一点高深莫测,好像是一道难以跨越的坎。造成这种现象的原因,一是因为我们对算法的了解和对自己能力的了解不够,还没入门就被吓退了,另外一个原因是,大部分人实际工作中很少用到算法,很多算法都已经被封装到函数库或接口里面了,只需要调用就行,而为了能早点完成任务,我们一般都不会去想接口里面的算法如何实现,只管调用来完成任务,顺利交差就万事大吉了。

“不管用什么方法,能够完成任务就可以”,其实我觉得这种想法也是可以的,毕竟我们搞技术的都比较崇尚实用主义。但是如果我们懂得背后的原理,可能心里会舒坦一些,而且在使用别人接口达不到理想的性能要求时,可以分析是否是接口的实现有问题,从而懂得去选择其他实现版本或者自己动手写,而自己动手写,就必须懂算法了。此外,很多大公司在面试中,往往也会考你算法,很多很多人都倒在算法这个环节上,尸骨遍野。这就是作为码农,即使你的工作不是算法研究,也需要了解一些基础算法的原因。

基础算法,我觉得对于大部分程序员来说,通过一定时间的练习,是可以学会的。了解了这一点,我们才不至于很容易被算法吓退。如果你是个算法小白,现在要开始学习算法了,可是又不知道从何学起,那么我这里给你一些建议。

首先,去找大学的数据结构和算法教程来看。我为什么不推荐很多人都知道的大部头《算法导论》呢?我是怕这大部头又把你吓退了,所以还是先从简单一点的开始吧。数据结构和算法是分不开的,一般来说,每种算法都是为某种数据结构服务的,不同的数据结构,往往需要使用不同的算法。数据结构,可以理解为,我们存放一堆数据时,要以某种结构形式存放,而算法,就是要从这堆数据中寻找到你想要的那一小坨数据的方法,而衡量算法优劣的,是空间和时间复杂度,也就是如果你能使用更少的时间和更少的空间(比如计算时需要使用的内存)就能得到答案,那么这个算法就是更好的。

假设你已经学过教材了,练习过教材上的一些算法题目,那么现在你可以尝试去刷刷LeetCode上的题目了。LeetCode上有很多算法题,按难度分为初级、中级等,练习时可以从简单的到难一点的,这样容易让你练习的过程中保持信心。很多公司在面试算法题时,也是直接使用LeetCode上的题目。我本人曾经在远程面试一家不错的外企时,被要求线上完成3道算法题,因为当时已经有比较长时间不接触算法题目了,所以没能很好完成,也错失了一次机会。然后第二天,我就去LeetCode上看题目,恰巧看到了这家外企出的算法题目,我再尝试去解决,没想到顺利把这些题目完成了。如果我在刷这几道题目之后接受那家外企的线上算法题笔试,也许Offer早就收入囊中了。现在,你应该知道,想要获得好的机会,为什么刷刷算法题可能也是必要的原因了。

除了LeetCode,还有一个我推荐你学习算法的网站,这个网站叫做:GeeksForGeeks,随便搜下就找到了。这网站上面有不少巨头公司的算法题目,包括微软、谷歌、亚马逊、Facebook等等,并且给出了解法,同时有不少面试者分享他们去这些公司面试后的面经,你可以参考参考。我曾经在这个网站上呆蛮长一段时间,现在很久没上去看了,写这篇文章时,我再打开这个网站,已经很难打开了,貌似需要你会轻功才能顺畅访问,哎,我就不说得太直白了。

以上提到的那些学习资料或网站资源,在你学习时,可能也会觉得学是学了,可惜缺乏使用场景,还是无法感受到这些算法的威力所在。现在也有一些付费的算法专栏,号称根据使用场景带你学习算法,让你真正明白算法是如何在实际项目中使用的。因为我没有订阅这个专栏,目前也不想免费给他们做广告,因此还是先不提了,如果需要这种学习方式,可以自己去搜索了解下这些专栏,或者私信我,我会告诉你去哪里订阅。

作为程序员,如果你还有蛮多闲暇时间,除了打游戏不知道干嘛的,建议这样去学学算法吧。不过提醒一下,我这些建议主要是给没有算法基础或者算法基础薄弱的技术人,高手路过时,还望理解,如能笑纳,本人将倍感荣幸!

微信扫码,进入【技术人成长】社群逛逛。