不绕弯子,直接说了。
数据结构和算法非常重要!尤其是在字节跳动公司(美团,百度,爱奇艺也是一样的)。我说字节跳动就是靠算法发家致富的,没人反对吧。
算法为魂
现在做底层产品,已经不是技术世界的唯一出路了,业务场景变得越来越重要。大多数同学所面临的任务,不是做PhotoShop,不是做游戏引擎,不是做操作系统或者编译软件;不是做数据库或者底层框架;而是应用他们打造具体的业务。
制作一个数据库,或者一个框架,需要学习很多算法,但是使用这些框架和数据库,打造一个网站,一个软件,一个服务,不一定需要接触很多算法。算法已经被封装起来了,很多时候,我们不需要接触算法的原理,就能很好的完成业务需求。现在在计算机的世界中,如果不会算法,也完全可以有所作为。
于是,越来越多的人不再重视“算法”。但是我还是要说:算法为魂。
我现在的老大经常跟我说的就是“算法为魂”,他说他大一的时候,李开复老师的一篇文章对他影响很深,这篇文章就是《算法为魂》。甚至说这篇文章改变了他的人生选择。
因为这篇文章,他才开始有意识地去接触算法,学习算法,打算法比赛,直到现在还在关注最新的算法发展,这个习惯也让他受益匪浅。
算法是真的很重要。从产品的角度,我们需要有清晰的定位,提供稳定的性能和服务,满足用户的需求甚至超出他们的预期;从技术的角度,我们要有灵活的扩展性和安全性,可以高效满足业务场景的快速变化和各种意外。
很多同学问我,去大厂工作,一定要有算法比赛的成绩吗?
我的回答是:当然不是。
我认识太多大佬,没有参加过任何算法比赛,轻轻松松进大厂。有的大佬在面试时直接说:算法我不太懂,但是设计模式软件架构随便问;有的大佬则本科三年就做出一个简易的操作系统内核,面试时把面试官聊晕……
算法不是技术领域的唯一的核心竞争力,但无论是一个人,一个企业,还是做一份事业,都需要有核心竞争力。而算法,担得起“核心竞争力”之名。
可能对新工作的年轻人来说,算法算不得什么,但工作几年后还是要熟悉算法,不然工具太多,都不知道用什么好,而且学习新工具的用法也会觉得很困难!熟悉算法就是掌握了万变中的“不变”。
现在大厂也越来越重视算法,最浅显的就是技术面试中一定会有算法题。
众所周知,国内互联网面试的流程逐渐在向国外靠拢,像字节跳动、BAT 等大厂,手撕算法题
已经成为了必选动作,这个是考验一个程序员技术水平最快的方法,尤其是对应届生来说。听说字节跳动的技术岗甚至有算法题一票否决的情况。
但是,数据结构与算法这个知识点的准备需要的时间比较长,要尽早准备,多刷一些leetcode或是其他类似的题。我个人的算法能力一开始也很差,但是经过我自己安排的算法专项训练,效果还是十分显著的。下面我把自己的复习方法分享给大家。
算法的学习方法和算法面试经验
首先,大家都知道,编程技术岗,不管是哪种语言都要考算法的。算法的准备那是一定一定要刷题的,大概分为这样的步骤:
第一阶段: 对于某一个具体的算法,首先要搞清楚这个算法解决的问题是什么,可能是实现一个具体的功能,也可能是在某些方面,比如时间复杂度或者空间复杂度方面很卓越,总之搞清楚这个算
法被研究出来的目的是什么。
第二阶段: 然后就要弄清楚这个算法的生存环境了,也就是看看你此时研究的东西是不是对别的知识有依赖,应该先把底层依赖的知识理解并掌握。这些问题都解决之后,就进入到算法本身的学习。
理解一个算法是一件辛苦的事情,刚开始看必然会产生很多的困惑,比如经常会怀疑作者讲述的内容的重要性;这些内容和这个算法的联系;经常会有种摸不着头脑的感觉;其实作者做的铺垫都是为了建立起描述算法主要内容的基础,只有接受和理解这些基础,才能逐渐触碰到算法的精髓,所以耐心是很重要的。
第三阶段: 算法的主要过程看完之后,往往还是会感到困惑,主要是不知道这个过程好在哪,这就进入了下一个阶段,理解作者对这个过程在功能性或者效率卓越这件事上的解释和证明。这才真正触碰到算法最精髓的部分,也就是深度的理解算法的主要过程所带来的好处,这才是最锻炼人理解能力的地方。
第四阶段: 上面几点是算法学习阶段的过程了,接下来就是研究算法的代码实现,自己设计测试用例亲自跑一下代码,以及从代码运行时间的角度分析这个算法的优势,这也是加深对算法的理解的过程。
第五阶段: 最后是配合相应的题目练习,让自己通过题目练习的方式,会用、善用学习到的算法,并对这个算法产生一定的敏感程度,具体是指看到某些题目时,能够根据题目的特点,产生与该算法的对应,也就是具备举一反三的能力。
下面是数据结构和算法的面试核心知识点,大家可以参考学习,逐个击破。
- 栈与队列:先进先出、后进先出
- 线性链表
- 查找:顺序查找、二分查找
- 排序:交换类、插入类、选择类
- 树、二叉树、图:深度优先(DFS)、广度优先(BFS)
- 递归
- 分治
- 滑窗
- 三大牛逼算法:回溯、贪心、动态规划(DP)
在刷题之前我建议你看一些书:
《漫画算法之旅》
如果你之前没有任何算法基础,这边书很适合你,可以补充数据结构和算法的基础知识,像什么是时间复杂度空间复杂度、查找、排序等。
如果你有了一定基础了,建议你直接跳到最后面的算法实战部分。
《剑指 offer》
非常经典的一本书,学算法的人必刷。但是要注意了,这边书里面的题目是用 C++写的,如果你是 Java 开发人员可能会有点影响。但是要记住学习算法最关键的还是解题思路和方法,用什么语言实现是其次的,如果你时间比较多我是建议你用 Java 语言再实现一遍。
《labuladong的算法小抄》
非常推荐!这是一本很新的书,写书前作者在 Github 开源了一个项目,主要讲解 LeetCode 解题套路,Start 总数排名前40。在书的开头讲解了学习算法的基本思维和套路,建议看这边书的同时再配合 leetcode 刷题,疗效非常棒!
《算法导论》
要是不推荐这本书是不是显得我有点 low 了,这是一本科班出身的同学必看必学的经典大部头。国外大佬写的,国内翻译的经典之作,虽然是经典但是不建议刚入门算法的同学看,因为看了这本书你可能要放弃算法了,比较难看懂。建议有了一定基础再入手这边书。
如果你觉得看书比较枯燥,可以推荐你看一些极客时间的专栏,不过是收费,但是质量非常高。
《数据结构与算法之美》
这个专栏是文字+语音,作者是王争,前 Google 工程师。他采用最适合工程师的学习方式,不拘泥于某一特定编程语言,从实际开发场景出发,由浅入深教你学习数据结构与算法的方法,帮你搞懂基本概念和核心理论,深入理解算法精髓,帮你提升使用数据结构和算法思维解决问题的能力。
《算法面试通关40讲》
这个专栏是视频,作者是覃超,前Facebook工程师。作者会用白板带你一步一步解题,层层深入一环扣一环,每一题还会用多种解题方法。我基本看完了,收获颇多。
leetcode、书和极客专栏可以并行,学练结合,不要光看不练。
B站免费学习视频
最后
我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。
资源持续更新中,欢迎大家一起学习和探讨。