数据结构和算法还是值得学习

最近半个月看了两本关于数据结构和算法的书,其实本来这不在我的计划之内,因为总觉得操作系统和计算机网络的基础学习更重要,优先级更高。另外工作这么久了,好像不会数据结构和算法也能开发(和我缺少相对底层开发有关),再加上我原来总认为算法可能对数学的要求比较高,而数学对我来说是个难点,所以一直逃避去学习。

不过最近想法有了些改变,简单整理下我的一些思路,数据结构和算法可能是一门内功,如果不去学,可能体会不到它的重要性,如果在温水久了,就会坐井观天,人最大的毛病就是看不到自己的问题。

我期初是这么想的,没有大量的时间去学习,所以初步的目标是了解下数据结构和算法的一些基础知识,简单有个概念,不求通解,大概了解有哪些数据结构和算法,它们能解决什么问题,它们为什么能解决特定问题。其实学好算法肯定是要去实践,而我目前不可能这么去做,学习的目标决定了学习方式。

我也相信只要出发点正确,快速去学习,多少会有收获的。我选了两本书去学习,因为知道算法非常难学,如果看一些按部就班的书,太晦涩的书,开始如果不顺利,后面就打退堂鼓了。

我看的两本书都非常不错,分别是《小灰的算法之旅》和极客时间的专栏《数据结构与算法之美》,客观的说小灰名气很大,但如果进行比较,《数据结构与算法之美》写的更好,全面,而且做到了深入浅出,每个算法描述它存在的原因以及解决的问题。

《数据结构与算法之美》说的很好,从实际场景出发,告诉你“是什么”,“为什么”,遇到类似问题后“怎么做”。

算法为什么重要呢?比如某个技术栈你不了解,没啥丢人的,可如果算法一窍不通确实说不过去,所以很多公司用数据结构和算法来衡量水平,一定程度上是合适的。

另外就我现在的感受,我做Web开发太久了,如果要进一步深造,比如理解一些分布式中间件或做一些相对底层的开发,那么确实需要了解算法。比如在学习Redis的时候,它为什么集成了那么多基础的数据类型?它为什么快速?看完《数据结构与算法之美》后,我从算法的角度再去看Reids的时候,感觉更透彻了。

数据结构和算法确实是内功,掌握的透彻,思考方式可能也不一样,解决问题的思路可能更广阔,工匠为啥是工匠,他一开始就站的更高,那么解决方案也会更好。可见算法和操作系统、计算机网络一样都是基础知识,基础打牢了,可能才能更好的搭建房屋。

我也知道算法不可能一蹴而就,后续我想每周至少有两小时去学习它,细水长流,不断的体会,不断的实践,可能效果会更好,也不容易遗忘。学好算法的一个标志就是举一反三,举重若轻,希望有一天也能达到。

原来没学习之前,我总是将数据结构和算法分开来说,比如说算法我可以慢慢学,但数据结构必须掌握,其实每一门语言中也有数据结构,也有很多的容器,正因为容器的存在,让我们模糊了数据结构的概念。《数据结构与算法之美》中说的很好,“数据结构是一组数据的存储结构,算法是操作数据的一组方法”,“数据结构是为算法服务的,算法要作用在特定的数据结构之上”。

了解数据结构和算法之后,要学会复杂度的分析,不管是通用的算法,还是自创的算法,都要学会评估算法的优良,就要用到时间复杂度和空间复杂度的分析,要么是时间执行长度,要么是内存使用大小,感觉这个一定要掌握。

另外不管是《小灰的算法之旅》还是《数据结构与算法之美》,都提到了递归的重要性,递归好像不是一种算法,只是很多算法可以用递归实现,递归是分解子问题,子问题之间有相同的解决之道,找到递归结束条件,《数据结构与算法之美》中讲的确实非常好。

《数据结构与算法之美》前几节说的特别好,我觉得源于作者对算法的理解,对于我来说,不可能重复别人的话,但会问下自己为什么要学习算法?对算法理解的误区是什么?学习算法的前提条件是什么?学习算法的技巧或方式是什么?如何活学活用?重要知识点在哪儿?

这一篇也是我最近的学习总结,没啥技术内容,只是想表明算法的重要性,以便提醒每个人,如果大家想购买《数据结构与算法之美》专栏,可以扫描下面的二维码,这样大家都能返现。