首先先来说说为啥要学习数据结构和算法
1、大公司要考察算法
很多大公司,比如 BAT、Google、Facebook,面试的时候都喜欢考算法、有些还会让人现场写代码(可能是白板,也可能是纸上)。
为什么这些大公司都喜欢考算法呢?
校招的时候,参加面试的学生通常没有实际项目经验,公司只能考察你的基础知识是否牢固。(当然,如果你有不错的实际的项目经验,也是可以加分的)
社招的话,还是会考察你的数据结构和算法能力。因为大公司更看重你的长期潜力
2、更容易弄懂框架/技术背后的原理
比如,我们常用的 Key-Value 数据库 Redis 中,
里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?
比如JDK8中的HashMap为啥会使用红黑树,而不是用普通的链表呢?
掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。
3、这是一个通用的能力
其实计算机语言大同小异,当你算法能力比较突出的时候,学习其他语言,上手速度会很快
我觉得吧,数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到(如果你一直在小公司的话),也感受不到它的好。但是一旦掌握,你就会常常被它的强大威力所折服。比如对于区块链来说,背后其实就是(链表+hash+树)
之前你可能需要费很大劲儿来优化的代码,可能用了某些数据结构和算法以后,可能很快就解决了
说完为啥要学以后,接着来说说 我们要学习那些东西
相信大家都在大学学习过数据结构和算法这门课,应该是难度不小的,是否还一度怀疑自己很笨?
其实不是的,数据结构和算法本身确实很抽象,相对晦涩难懂,
但是只要掌握正确的学习方法,有的放矢,学习起来并没有那么难的。
先来看看我们都会学习那些重点知识?
可能大家都会在网上看到一个算法的知识图谱,列出超级多的知识
这次我就不列了哈,直接说我们要掌握的知识,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。
所以,结合我自己的学习心得,还有这些年的开发经验,
总结了下面20个最常用的、最基础的数据结构与算法,
其中包含 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
10 个算法:递归、排序(各种排序)、二分查找、搜索(dfs,bfs)、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再根据自己的工作/发展需要去学更加复杂的数据结构和算法,都相对容易得多
最后分享一些学习方法和注意事项,让大家更加高效的学习
1、边学边练
课上举的经典例子,要学习要消化,并且课后的相关算法练习也要及时完成。
不要光看不练(不然很可能会发生,以为自己都会了,但是还是写不出代码的困境)
有些同学可能会问,那我还需要专门去刷题吗?
我的建议是 可以先学习完这一系列的知识,然后根据自己的需要去刷题,但一定不要浪费太多时间在刷题上。你只要把这一系列的知识学好,学扎实,常见的公司面试是没啥问题的。
2、多问、多思考
学习最好的方法是,几个同学一起学习,在一块儿讨论切磋,有问题及时寻求老师答疑。
所以,大家有问题可以及时在群里和大家一起探讨。
3、奖励学习法
学习的过程中,我们碰到最大的问题就是,坚持不下来。
是的,很多基础课程学起来都非常枯燥,很容易放弃
可是大家为啥能够能玩游戏玩很久还乐此不疲?
其实就是有一个及时反馈给你,当你玩了一段时间,你的经验会增加,你的装备会更好
都在实时反馈给你,但是学习的反馈周期相对比较长,所以你可以在完成了某次学习后,给自己一些小奖励(看会电视,去吃好吃的等),或者可以写自己的学习心得,然后发到群里 (大家可能会给你点赞,分享等)这样子你可能会让你更容易坚持下来
在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。
如果碰到“拦路虎”,你可以和老师交流,也可以先沉淀一下,过几天再重新学一遍。所谓,书读百遍其义自见,我觉得是很有道理的
我讲的这几个方法,不光适用于咋们数据结构和算法的学习,也适用于其他任何知识的学习过程,你可以在实践以后,总结出最适合自己的学习方法。
最后,数据结构和算法是一个学习的坎,相对可能会困难点,但是无论怎么样,我们都要跨过去,因为这个技术 你现在不学,将来找工作也要学!
既然都要学,还不如早点学习呢!