在知乎的一个回答。
如何掌握数据结构与算法呢,可以看懂就是不会应用到具体的问题中好痛苦一个月了编程水平还停留在初级阶段?
看到这个问题其实挺感慨的,简单的说一下自己的看法吧。
我大三刚开始学习编程的时候,还没有接触过数据结构和算法的内容,那个时候就是写一点简单的CRUD,对于算法我总是望而生畏,想学习却又害怕智商不够学不会。心想,对于一个文科生来说,这可能是我永远都迈不过去的坎。
后来工作了,我鼓起勇气去尝试学习一下算法,然后在网上买专栏,自己也买了一本《算法》这本书。后来发现对于一些基础的数据结构和算法,比如数组、链表、栈、队列、排序、二分查找、二叉树,其实并不算难,自己对着书上的代码,就能够慢慢的写出来了。对于一些比较稍微困难的算法,比如跳表、BM、KMP、红黑树,虽说手写代码有点困难,但是也能够基本理解它的原理,应用场景等等。
由于在目前的工作当中,我还是写业务代码,有时候会感觉得到,如果只是单纯的写业务,那么就算不掌握数据结构和算法,其实也没有什么大碍,因为在大多数场景下用不到。
但是,这么多人崇尚学习数据结构和算法,大学也将这门课程作为必修课,学习它的意义在哪呢?
我认为有两点:
第一是在大数据量下,数据结构的选择对性能的影响非常关键。我们都知道,算法的时间复杂度有:
常数阶O(1)
对数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n2)
立方阶O(n3)
K次方阶O(n^k)
在数据量较小的情况下,各种复杂度的量级差距就会小。如果你的业务中,数据量就那么几十几百条,那么你选择ArrayList还是LinkedList其实看不出来有什么影响。但是在数据量庞大的时候,不同的数据结构就会表现得千差万别,这也是为什么,一些用户流量较大的大厂在面试的时候,将数据结构和算法做为重点来考察。
第二,如果从业务代码往下走,涉及到中间件、操作系统、网络、数据库等,你其实就会发现,数据结构和算法几乎无处不在。比如Redis使用到了链表、哈希表、跳表,Mysql使用B+树作为索引模型,HBase使用到了LSM树,操作系统中的I/O多路复用的epoll使用到了红黑树。
如果你不甘于写业务代码,想要深入到底层开发的话,那么数据结构和算法一定是逃不过的。所以学习算法,能够拔高你职业发展的天花板。
最后,再说说学习算法的一些感悟吧。其实刚开始的时候,我始终认为,把一个对应的算法,或者数据结构的代码手写出来了,我就算掌握了。但是没过多久肯定就又忘记了,然后在手写的时候,就会不熟悉甚至就写不出来了。
后来我学习的时间越长,其实就发现,对于一个数据结构或者算法,并一定一定要把它手写出来才算是掌握了,了解它的由来、解决了什么问题、时间空间复杂度、应用场景、优点及缺陷等,其实才是更加重要的。这就是所谓的算法思维,学习的目的是解决实际的问题,在遇到问题的时候,我们可以借助这种思维来解决对应的问题,这才是学习算法和数据结构的真正意义。
当然了,在初学的时候,手写对应的代码还是很有必要的,这算是一种编码训练,也是一种思维训练,写得多了,想得多了,很多事情就慢慢清晰了。
roseduan我也喜欢你呀!