为什么要学习数据结构和算法?

是不是觉得数据结构和算法,跟os、计网一样,属于脱离实际工作的屠龙术?

除了面试,其实这辈子也用不着?


尽管计算机专业同学在大学都学过这些课程,甚至很多培训机构也会培训,但很多程序员对数据结构和算法依旧一窍不通。绝大多数人只听说过数组、链表、快排这些最简单的数据结构和算法,稍微复杂一点的就完全没概念。


很多人说实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。

事实真的是这样吗?

想要通关大厂面试,数据结构和算法是开胃菜

BAT字节、Google、微软,面试都喜欢考算法、手写代码并运行。有些人虽然技术八股文不错,但每次去面试都会“跪”在算法上,很可惜。

那你可曾想过,为何这些大公司喜欢考察算法?

校招时,学生一般都没有实际项目经验,公司只能考察他们的基础知识是否牢固。

社招更不用说,越注重技术的公司,越会重点考察数据结构与算法这类基础知识。

因为相比短期能力,他们更看中候选人的长期潜力。

我不懂算法,照样找到了高薪大厂工作啊。我是不是就不用研究算法了?

要以发展的眼光看待,我们学任何知识都是为了解决实际问题,学习算法自然有用处。难道你真愿意一直做个crud boy?

可我整天工作就是crud 啊,哪里用到过算法?

诚然,大部分业务开发都是利用封装好的API堆砌、转译业务逻辑,几乎无需自行实现算法。

但不需要自己实现≠什么都不需要了解

若不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?

存储某业务数据时,你如何知道应该用ArrayList,还是LinkedList?

调用某方法后,你如何评估代码的性能和资源消耗?


业务开发用到的各种框架、中间件和底层系统,如MySQL、Spring、MQ和Redis等。这些基础组件中,其实都内置了很多基础算法思想。

如Redis中,有序集合用什么数据结构实现?为什么要用跳表?为什么不用二叉树?


若能清晰这些底层原理,就能更好利用它们。即便出现问题,也方便定位。


实际工作中的算法应用到处可见,如何实时地统计业务接口的99%响应时间?


你可能想,每次查询时,从小到大排序所有的响应时间,若总共有1200个数据,那第1188个数据就是99%的响应时间。

每次用这个方法查询的话都要排序,效率太低。但若你知道“堆”数据结构,用两个堆即可高效解决。


现在开源的技术文章、架构、项目很多,照猫画虎做一套基础框架并不难。我就拿RPC框架举例。


不同人做出的RPC框架,架构设计思路其实都差不多,所实现的功能也相差无几。但就是有人做的框架,Bug很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面玩一下。

而有人的框架就能开源到GitHub,甚至被Apache收录。

为什么会有这么大差距?

编程高手竞争就在细节:算法是不是足够优化,数据存取的效率是不是足够高,内存是不是够节省等等。

所以细节决定成败!

对编程还有追求?不想被35优化?那就不要只会写只是能run的代码!

何为编程高手?不同人可能观点不同。但在我看来,性能好坏至少算一项关键指标。若你连代码时间复杂度、空间复杂度都会分析,怎么可能写出高性能代码?

我在小公司工作的呀,非互联网,用户量少,处理数据量也小,qps几乎0,开发不需要考虑那些性能问题,完成功能就下班了,用不用数据结构和算法,无足轻重。

那你就甘愿“十年如一日”重复 crud 了吗?

大家都知道这行35岁后容易被行业淘汰,原因其实就在此。有人写代码,从不考虑非功能性需求,只是完成功能,能run就行;做事情的时候,也从无长远规划,只顾眼前三分利。

这样即使十年业务积累,跟应届生一年积累没有本质区别。怎么不会被淘汰呢?


大公司里性能几乎是时刻都要考虑的。一个简单的ArrayList、Linked List的选择问题,就可能会产生成千上万倍的性能差别。

数据结构和算法的意义就彰显了。


数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到,也感受不到它的好。但一旦掌握,你就会常常被它的强大威力所折服。

之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设计的架构,用了数据结构和算法之后,很容易就能解决。

总结

学习数据结构和算法,并非为了死记硬背几个知识点。而是为建立时间复杂度、空间复杂度意识,写出高质量代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。


掌握数据结构与算法,看待问题的深度,解决问题的角度就会完全不同。


上一篇:云上数据安全实践:使用 KMS 一键保护 ECS 工作负载


下一篇:html表单样式, table隔行高亮, 长字符串自动换行