学习数据结构和算法前瞻

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/salmon_zhang/article/details/84770602

我并非计算机科班出身,以前只对C、java、Matlab、Python语言有粗略的了解,以前写代码的时候只会考虑功能能实现就行了,并不考虑性能方面的问题,对数据结构与算法从未学习过,更不了解什么时间复杂度、空间复杂度。写代码的时候从不考虑这些。而这一次我想修炼下编程的内功—好好学习下数据结构与算法。

1. 以前对数据结构与算法的困惑

我们以前对数据结构与算法一般都会有如下几点困惑,我简单罗列下:

(1) 在学校中觉得数据结构与算法很难、然后一直也没认真学。错过了最佳学习时光

(2) 工作后,遇到数据结构的坑时,我们一般都是嗤之以鼻,绕过去。功能实现了就行

(3) 面试时,当面试官问数据结构算法的问题时,总是一脸懵逼,各种被吊打

(4) 研究开源源码时,有时候跟不上别人的节奏,甚至都看不懂,各种泪流满面

…等等…

上面的几点困惑,或许大多数IT同胞都遇到过吧。所以好好学习下数据结构与算法还是很有必要的。

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

或许有很多人认为,在实际工作中很少用到数据结构和算法,只要知道API的调用,能熟练的用开源框架,代码照样可以写的很6,是不是就不用系统性的去学习数据结构和算法呢?其实不是这样的,下面我就说几点要学好数据结构和算法的理由。

2.1 大厂面试必备

很多大公司,比如Google、Facebook、BAT、头条等。在面试的时候喜欢叫你现场写代码、考算法。有的人技术很牛,但最终在算法那关没通过,很是可惜。

刚毕业时,参加校招时,由于学生大多都没啥实际项目经验,所以公司比较喜欢考学生的基础知识,问的最多的就是数据结构和算法。

2.2 高效的阅读源码

平时我们在研究一些优秀的开源代码时,如果你能弄清楚它的底层原理,你就能更好的使用它,即使出现了问题,也能快速的定位。因此学好数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是很有用的。

2.3 写出开源代码

同样的功能,每个程序员可能写出来的代码都不一样,但有的人能在Github上开源出来,作为轮子让很多人使用,但有的人却在不停的bug中挣扎。开源出来的代码,一般都具有可读性好、扩展性好、数据存取效率高、节省内存、性能好等特点。这就是编程内功不同导致的。

2.4 不被轻易淘汰

或许这点说的有点大,但程序员35岁或许真的容易陷入瓶颈期(暂时我还没法亲自体验,毕竟我还算年轻,哈哈。。。)。从我公司里的一些老程序员,我也能感觉到。在我周边的老程序员,有点真的很优秀,能cover住很多项目上的疑难杂症,但也有一些老程序员基本不coding了,就干一些无关紧要的活。看到这些,有时我真的有点慌。。。所以只能持续的学习了。

我认为内功强的人,不管是做当前的编程工作还是以后跨领域干其他行业,我认为应该都会做的很好,从而不会轻易被行业淘汰。

学好数据结构和算法,看待问题的深度,解决问题的角度会完全不一样的。就相当于张无忌学会了九阳神功后,然后再去学乾坤大挪移就会快很多。站在巨人的肩膀上,行走江湖,所向披靡。。。

…and so on …

3. 如何系统高效地学习数据结构与算法

3.1 数据结构和算法的定义:

广义上的定义:

数据结构:一组数据的存储结构。

算法:操作数据的一组方法。

比如:图书馆中的书籍一般都会按照一定规律进行“存储”,这可以理解为是书籍这种数据的存储结构。当我们去图书馆借书的时候如何找到自己想借的书呢?方法有多种:你可以一本一本的查找;也可以按照书籍类别进行定位查找。这些查找的方法都是算法。

狭义上的定义:

通过前人的智慧结晶,已经规范定义好的数据结构和算法,也就是我们即将要学习的数据结构和算法。

比如:堆、栈、队列、二分查找、动态规划等。这些都是前人从实际工作场景中实践总结出来的,可以高效地帮我们解决很多实际开发中的问题。

3.2 数据结构和算法的关系

其实数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构上。

比如:数组具有随机访问的特点,常用的二分查找法需要用数组来存储数据。但如果我们使用的是链表这种数据结构,那么就不能使用二分法进行查找了,因为链表不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构是没有任何意义的。

3.3 数据结构和算法的核心概念—复杂度分析

想要学好数据结构和算法,必须要深刻的理解“复杂度分析”这个概念

数据结构和算法的根本目的就是解决如何更省、更快地存储和处理数据的问题。因此我们需要一个衡量效率和资源消耗的方法,而这个方法就是复杂度分析方法!!!复杂度分析就相当于武侠小说中的内功心法。

3.4 数据结构和算法的知识图谱

下面是一张比较全面的数据结构和算法的知识图谱:

数据结构和算法图谱

当然学习数据结构和算法并不需要掌握图谱上的所有知识点,我们只需要学习里面的10个数据结构:数组、链表、堆、栈、队列、图、散列表、二叉树、Tire树、跳表。10个算法:二分查找、搜索、递归、排序、贪心算法、哈希算法、回溯算法、分治算法、动态规划、字符串匹配算法。掌握了这些基础的数据结构和算法,然后再去学其他更复杂的数据结构和算法就会容易很多。

3.5 学习数据结构和算法的几点建议

(1) 边学边练、适当的刷题

学习大多数知识,我们一般都要遵循input—>thinking—>output的步骤。所以建议先学习、再思考、最后总结。

(2) 多想、多问、多交流

学习也讲究知其然知其所以然,学习算法要多思考,最好能与厉害的人交流

(3) 青铜到王者的升级心态

学习数据结构和算法时,我们要摆正心态,遇到问题时,先思考,后百度、Google。一下子成不了王者,争取每天都增加自己的经验值、战斗力。在枯燥的学习过程中,我们要一点点的升级,要不然很难坚持下来。

以上就是我在修炼编程内功—数据结构和算法之前的一点感想和总结。希望今后与大家共同进步!

猜你喜欢

转载自blog.csdn.net/salmon_zhang/article/details/84770602