Python进阶学习(1)—如何高效的学习数据结构及算法

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

你是不是觉得数据结构和算法,跟操作系统、计算机网络一样,是脱离实际工作的知识?可能除了面试,这辈子 也用不着?
尽管计算机相关专业的同学在大学都学过这门课程,但是据我了解,很多程序员对数据结构和算法依旧一窍不 通。还有一些人也只听说过数组、链表、快排这些最最基本的数据结构和算法,稍微复杂一点的就完全没概念。
当然,也有很多同学说,自己实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要代码、开 发框架用得熟练,照样可以把代码写得’飞’起来。事实真的是这样吗?
今天我们就来详细聊一聊,为什么要学习数据结构和算法。
想要通关大厂面试,千万别让数据结构和算法拖了后腿 很多大公司,比如BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。有些人虽然技术不 错,但每次去面试都会’跪’在算法上,很是可惜。那你有没有想过,为什么这些大公司都喜欢考算法呢?
校招的时候,参加面试的学生通常没有实际项目经验,公司只能考察他们的基础知识是否牢固。社招就更不用说 了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力, 他们更看中你的长期潜力。
你可能要说了,我不懂数据结构与算法,照样找到了好工作啊。那我是不是就不用学数据结构和算法呢?当然不 是,你别忘了,我们学任何知识都是为了“用”的,是为了解决实际工作问题的,学习数据结构和算法自然也不 例外。
业务开发工程师,你真的愿意做一辈子 CRUD boy 吗? 如果你是一名业务开发工程师,你可能要说,我整天就是做数据库 CRUD(增删改查),哪里用得到数据结构和 算法啊?

是的,对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务 逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。
如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?存储某个业务数据 的时候,你如何知道应该用 ArrayList,还是 Linked List 呢?调用了某个函数之后,你又该如何评估代码的性能 和资源的消耗呢?
作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。 在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。
比如,我们常用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表 来实现呢?为什么不用二叉树呢?
如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结 构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。
在平时的工作中,数据结构和算法的应用到处可见。我来举一个你非常熟悉的例子:如何实时地统计业务接口的 99% 响应时间? 你可能最先想到,每次查询时,从小到大排序所有的响应时间,如果总共有 1200 个数据,那第1188 个数据就 是 99% 的响应时间。很显然,每次用这个方法查询的话都要排序,效率是非常低的。但是,如果你知 道“堆”这个数据结构,用两个堆可以非常高效地解决这个问题。
基础架构研发工程师,写出达到开源水平的框架才是你的目标! 现在互联网上的技术文章、架构分享、开源项目满天飞,照猫画虎做一套基础框架并不难。我就拿RPC框架举例。
不同的公司、不同的人做出的 RPC框架,架构设计思路都差不多,最后实现的功能也都差不多。但是有的人做出 来的框架,Bug 很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面用一下。而有的人做的框 架可以开源到 GitHub 上给很多人用,甚至被 Apache 收录。为什么会有这么大的差距呢?
我觉得,高手之间的竞争其实就在细节。这些细节包括:你用的算法是不是够优化,数据存取的效率是不是够 高,内存是不是够节省等等。这些累积起来,决定了一个框架是不是优秀。所以,如果你还不懂数据结构和算 法,没听说过大 O 复杂度分析,不知道怎么分析代码的时间复杂度和空间复杂度,那肯定说不过去了,赶紧来补 一补吧!

对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码! 何为编程能力强?是代码的可读性好、健壮?还是扩展性好?我觉得没法列,也列不全。但是,在我看来,性能 好坏起码是其中一个非常重要的评判标准。但是,如果你连代码的时间复杂度、空间复杂度都不知道怎么分析, 怎么写出高性能的代码呢?
你可能会说,我在小公司工作,用户量很少,需要处理的数据量也很少,开发中不需要考虑那么多性能的问题, 完成功能就可以,用什么数据结构和算法,差别根本不大。但是你真的想“十年如一 日”地做一样的工作吗? 经常有人说,程序员 35 岁之后很容易陷入瓶颈,被行业淘汰,我觉得原因其实就在此。有的人写代码的时候, 从来都不考虑非功能性的需求,只是完成功能,凑合能用就好;做事情的时候,也从来没有长远规划,只把眼前 事情做好就满足了。
我曾经面试过很多大龄候选人,简历能写十几页,经历的项目有几十个,但是细看下来,每个项目都是重复地堆 砌业务逻辑而已,完全没有难度递进,看不出有能力提升。久而久之,十年的积累可能跟一年的积累没有任何区 别。这样的人,怎么不会被行业淘汰呢?
如果你在一家成熟的公司,或者 BAT 这样的大公司,面对的是千万级甚至亿级的用户,开发的是TB、PB 级别数 据的处理系统。性能几乎是开发过程中时刻都要考虑的问题。一个简单的ArrayList、Linked List 的选择问题,就 可能会产生成千上万倍的性能差别。这个时候,数据结构和算法的意义就完全凸显出来了。
其实,我觉得,数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到,也感受不到它的好。但是 一旦掌握,你就会常常被它的强大威力所折服。之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设 计的架构,用了数据结构和算法之后,很容易就可以解决了。

2 接下来说说如何抓住重点,系统高效地学习数据结构与算 法?

你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课 时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门 课望而却步。
我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东 西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。

什么是数据结构?什么是算法?

大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这 两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所 以,概念背得再牢,不会用也就没什么用。
虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。 下面我就从广义和狭义两个层面,来帮你 理解数据结构与算法这两个概念。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律 编号,就是书籍这种“数据”的存储结构。
那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人 文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。

**那数据结构和算法有什么关系呢?**为什么大部分书都把这两个东西放到一块儿来讲呢?
这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。 因 此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。
比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数 据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就 是没用的。
下面我们来看看,究竟该怎么学数据结构与算法。

学习这个需要什么基础?
看到数据结构和算法里的“算法”两个字,很多人就会联想到“数学”,觉得算法会涉及到很多深奥的数学知 识。那我数学基础不是很好,学起来会不会很吃力啊?
数据结构和算法课程确实会涉及一些数学方面的推理、证明,尤其是在分析某个算法的时间、空间复杂度的时 候,但是这个你完全不需要担心。
接下来的学习我会由浅入深,从概念到应用,一点一点给你解释清楚。你只要有高中数学水平,就完全可以学习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值