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

基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。
技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等,当然还有数据结构和算法

  • 数据结构和算法如何应用到实际的编码中?
  • 为什么需要这种数据结构和算法?
  • 捋清它们背后的设计思想,培养你举一反三的能力。

一位原来腾讯 T4 的技术大牛。在区块链大潮之前,他在腾讯工作了 10 多年,长期负责手机 QQ 后台整体建设。他经历了手机 QQ 从诞生到亿级用户在线的整个过程。后来他去了微众银行,有一天老板让他去做区块链。他用了不到半年时间,就把区块链的整个技术脉络摸清楚了。 现在,他是微众银行的区块链负责人,微众科技创新产品部的老总。你说厉害不?你可以花半年时间就能精通一个新的领域吗?为什么他就可以做到?
我觉得这其中最重要的就是基础足够扎实。他曾经跟我说,像区块链、人工智能这些看似很新的技术,其实一点儿都不“新”。最初学编程的时候,他就把那些基础的知识都学透了。当面临行业变动、新技术更迭的时候,他不断发现,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。掌握了这个“规律”之后,他学任何东西都很快,任何新技术都能快速迎头赶上。这就是他快速学习并且获得成功的秘诀。

从四个阶段学习:

  1. 时间、空间复杂度分析是数据结构和算法中非常重要的知识点,贯穿整个学习过程。但同时也是比较难掌握的,需要真正能掌握复杂度分析,为后面的学习铺路。掌握时间、空间复杂度的概念,大 O 表示法的由来,各种复杂度分析技巧,以及最好、最坏、平均、均摊复杂度分析方法。之后,面对任何代码的复杂度分析,你都能游刃有余、毫不畏惧!
  2. 最基础、最常用的数据结构和算法,这个也需要重点掌握。针对每种数据结构和算法,结合具体的软件开发实例运用;比如递归,为什么递归代码比较难写?如何避免堆栈溢出?如何避免递归冗余计算?如何将递归代码转化为非递归代码?
  3. 学习一些不是那么常用的数据结构和算法。虽然不常用,但是这些内容你也需要知道。设置这一部分的目的,是为了让你开拓视野,强化训练算法思维、逻辑思维。如果说学完基础部分可以考 80 分,那掌握这一部分就能让你成为尖子生!
  4. 数据结构和算法在具体软件实践中的应用,拿一些开源项目、框架或者系统设计问题,剖析它们背后的数据结构和算法,对于我们技术人来说,更是这样。既然数据结构和算法这个坎,我们总归是要跨过去;

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

数据结构和算法,跟操作系统、计算机网络等基础知识,在实际开发中非常重要,对于我们分析问题解决问题、学习框架、实现需求非常重要。
不容易掌握的知识,就是你区别于其他普通程序员的能力,工作中、简历上要看到能力的提升和成长,年龄不是限制从业,而是能力限制了你!

想要通关大厂面试,千万别让数据结构和算法拖了后腿

面试的时候都喜欢考算法、让人现场写代码。有些人虽然技术不错,但每次去面试都会“跪”在算法上,很是可惜。那你有没有想过,为什么这些大公司都喜欢考算法呢?
校招的时候,参加面试的学生通常没有实际项目经验,公司只能考察他们的基础知识是否牢固。社招就更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。
你可能要说了,我不懂数据结构与算法,照样找到了好工作啊。那我是不是就不用学数据结构和算法呢?当然不是,你别忘了,我们学任何知识都是为了“用”的,是为了解决实际工作问题的,学习数据结构和算法自然也不例外。

业务开发工程师,你真的愿意做一辈子 CRUD boy 吗?

如果你是一名业务开发工程师,你可能要说,我整天就是做数据库 CRUD(增删改查),哪里用得到数据结构和算法啊?
是的,对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。
如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?存储某个业务数据的时候,你如何知道应该用 ArrayList,还是 Linked List 呢?调用了某个函数之后,你又该如何评估代码的性能和资源的消耗呢?
作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想
比如,我们常用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?

之所以采用跳表实现,主要是因为它可以实现快速的查找数据,其数据查找的时间复杂度为O(logn)。此时可以对比一般的链表查询,时间复杂度O(n),当数据规模n越大时跳表的查询效率优势就会越明显

如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。
在平时的工作中,数据结构和算法的应用到处可见。我来举一个你非常熟悉的例子:如何实时地统计业务接口的 99% 响应时间?
你可能最先想到,每次查询时,从小到大排序所有的响应时间,如果总共有 1200 个数据,那第 1188 个数据就是 99% 的响应时间。很显然,每次用这个方法查询的话都要排序,效率是非常低的。但是,如果你知道“堆”这个数据结构,用两个堆可以非常高效地解决这个问题。

堆排序的话,极值在堆顶 本题可以利用欲求解99%响应时间,即查询由小到大99%N的响应时间,也即由大到小1%N的响应时间,无论怎么说都是求第N大的时间 求第N大一般利用堆排序,堆排序堆顶元素是极值(子堆亦然) 由题意可知,我把最小的N个都放进堆里面,然后堆顶放最大的元素就可以了 即:所求为最大堆,每次入堆比堆顶元素小,就去掉堆顶,然后将该元素入堆

基础架构研发工程师,写出达到开源水平的框架才是你的目标!

不同的公司、不同的人做出的 RPC 框架,架构设计思路都差不多,最后实现的功能也都差不多。但是有的人做出来的框架,Bug 很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面用一下。而有的人做的框架可以开源到 GitHub 上给很多人用,甚至被 Apache 收录。为什么会有这么大的差距呢?
高手之间的竞争其实就在细节。这些细节包括:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。这些累积起来,决定了一个框架是不是优秀。所以,如果你还不懂数据结构和算法,没听说过大 O 复杂度分析,不知道怎么分析代码的时间复杂度和空间复杂度,那肯定说不过去了,赶紧来补一补吧!

对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码!

何为编程能力强?是代码的可读性好、健壮?还是扩展性好?我觉得没法列,也列不全。但是,在我看来,性能好坏起码是其中一个非常重要的评判标准。但是,如果你连代码的时间复杂度、空间复杂度都不知道怎么分析,怎么写出高性能的代码呢?
你可能会说,我在小公司工作,用户量很少,需要处理的数据量也很少,开发中不需要考虑那么多性能的问题,完成功能就可以,用什么数据结构和算法,差别根本不大。但是你真的想“十年如一日”地做一样的工作吗?
经常有人说,程序员 35 岁之后很容易陷入瓶颈,被行业淘汰,我觉得原因其实就在此。有的人写代码的时候,从来都不考虑非功能性的需求,只是完成功能,凑合能用就好;做事情的时候,也从来没有长远规划,只把眼前事情做好就满足了。不是社会淘汰你,是你的能力淘汰了你自己

工作年限不是衡量能力的标准,要有难度递进,要有能力提升:
我曾经面试过很多大龄候选人,简历能写十几页,经历的项目有几十个,但是细看下来,每个项目都是重复地堆砌业务逻辑而已,完全没有难度递进,看不出有能力提升。久而久之,十年的积累可能跟一年的积累没有任何区别。这样的人,怎么不会被行业淘汰呢?

如果你在一家成熟的公司,或者 BAT 这样的大公司,面对的是千万级甚至亿级的用户,开发的是 TB、PB 级别数据的处理系统。性能几乎是开发过程中时刻都要考虑的问题。一个简单的 ArrayList、Linked List 的选择问题,就可能会产生成千上万倍的性能差别。这个时候,数据结构和算法的意义就完全凸显出来了。
技能就像一个工具,你只有先学会了,才会想到它能用到哪里。不会这个技能的人,时想象不到那些会的人时怎么活的
数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到,也感受不到它的好。但是一旦掌握,你就会常常被它的强大威力所折服。之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设计的架构,用了数据结构和算法之后,很容易就可以解决了。
我们学习数据结构和算法,并不是为了死记硬背几个知识点。我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。

所以,不管你是业务开发工程师,还是基础架构工程师;不管你是初入职场的初级工程师,还是工作多年的资深架构师,又或者是想转人工智能、区块链这些热门领域的程序员,数据结构与算法作为计算机的基础知识、核心知识,都是必须要掌握的。

掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。因为这样的你,就像是站在巨人的肩膀上,拿着生存利器行走世界。数据结构与算法,会为你的编程之路,甚至人生之路打开一扇通往新世界的大门。

你为什么要学习数据结构和算法呢?在过去的软件开发中,数据结构和算法在哪些地方帮到了你?
让自己的编程能力更强,能解决更多的实际问题。
1.直接好处是能够有写出性能更优的代码。
2.算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。
3.长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。

其实问题的所在就是现在有很多现成的框架,器又大活又好,拿来就用,还不用太担心性能的问题。就好像那些建楼的工程师不需要懂砖瓦的构成,也能盖楼。司机不需要懂汽车引擎的原理,也能当顺风车司机载美女兜风。
遇到不会的上 Google,懒了就上 GitHub 找框架。所以写了这么多年代码,一直是个菜鸟。
或许是时候修炼自己的内功了。一直 CURD 有意思么?把设计模式,网络原理,数据结构和算法捡起来,或许就没那么容易菜鸟了。怼人也更加自信了。跳槽也不用畏畏缩缩的了。

posted @ 2023-04-12 07:33  Jimmyhus  阅读(278)  评论(1编辑  收藏  举报