耗时两周,我整理了一套数据结构与算法的学习路线,大厂面试必备

对于我们程序员来说,数据结构和算法是必须要掌握的内功。网络上有很多人整理过编程学习的路线图,但是有关数据结构和算法的却并不多。

为了能够帮助到更多的程序员小伙伴,小灰花了整整两周时间,整理了一份数据结构和算法的学习路线图。

这份路线图包含了115项重要的知识点,可以说是非常的全面,而且大部分知识点都附上了详细的讲解,这些讲解都是我最近五年以来陆陆续续写的原创内容。

耗时两周,我整理了一套数据结构与算法的学习路线,大厂面试必备


这份路线图包含了四大部分,分别是数据结构基础算法基础常见面试题,以及各种学习工具。由于这张路线图比较复杂,乍一看可能会感到懵逼,因此小灰特意带着大家来导读一下:

1.数据结构基础

数据结构当中最基本也是最常用的一类,是线性数据结构,其中包括大家最熟悉的数组链表。通过这两种基础数据结构,又可以实现出列。这几种数据结构的特性和原理,大家一定要掌握,最好是能自己用代码实现出它们的基本功能,面试常考。

除了线性数据结构以外,也是比较常用的数据结构,其中最核心的是二叉树。手写二叉树的遍历,常常在面试中被考察,其中深度遍历比较简单,写个递归就行,层序遍历稍微复杂一些,实现的时候需要懂一些脑筋。

二叉树根据不同功能,又分成了很多具体的数据结构,最基础的是二叉查找树,可以方便元素的查找和排序。AVL树红黑树,是二叉查找树的特殊形式,可以在多次插入删除节点之后,仍然保持树的平衡。

二叉堆也是一种特殊的二叉树,分为大顶堆和小顶堆,可以始终保证堆顶的元素是最大或者最小的一个,堆排序算法优先级队列都用到了这个数据结构。

还有一种很有趣的二叉树,叫做哈夫曼树。它的功能是把通信报文的字符转化成哈夫曼编码,从而压缩通信报文的总长度。

除了二叉树之外,我们工作中也会用到一些非二叉树,最常用的就是B-树B+树。我们电脑上文件系统的索引,很多就是用B-树实现的,而我们常用的关系型数据库,默认索引就是用B+树实现。

此外,还有一种叫做前缀树的结构,可以通过单词的前缀来快速匹配到我们想要查找的单词。

说完了树结构,我们再来说一说。图这种数据结构,相对来说不算是很常用,我们对它有一个基本的了解就可以。

首先我们要知道,图可以按照两个维度来划分,有向图无向图带权图无权图

其次,图的遍历有两种方式,广度优先遍历深度优先遍历

图结构会使用到一类重要的算法:最短路径算法。其中Dijkstra算法可以求出某顶点到另一个顶点的最短路径,也就是单源最短路径;Floyd算法可以求出所有顶点到某一顶点的最短路径,也就是多源最短路径。

另外,最小生成树大家也可以了解一下,它是图的一部分,保证所有顶点都连通的情况下,总成本最小。

除了上面讲的这些数据结构以外,还有一些复合数据结构也很重要。

比如大家最熟悉的哈希表,是数组与链表的结合,大家需要了解哈希表的基本原理,以及如何解决哈希冲突。这个大厂面试必考。

除了哈希表以外,哈希链表也很常用。我们Redis数据库当中用到的LRU算法,背后就用到了哈希链表。

还有两种复合数据结构可能知道的人不多,一个是跳表,它在链表的基础上增加了很多层级,主要为了提升链表的查询效率。另一个是线段树,他是数组和二叉树的结合,方便在局部范围内对数组进行操作。

2.算法基础

数据结构基础就说到这里,接下来我们说一说算法基础。要学习算法,首先要弄懂算法到底是什么,同时也要理解衡量算法好坏的重要指标:时间复杂度空间复杂度

排序算法,可以说是程序员最常用的一类算法。

排序算法同样可以按照不同的维度进行分类,以相等元素的位置是否改变作为条件,可以分成稳定排序不稳定排序;以排序过程是否在内存中完成为条件,可以分成内部排序外部排序。

以时间复杂度为条件,又可以划分为更多的类型,时间复杂度O(n^2)的排序,包括冒泡排序选择排序插入排序;O(nlogn)的排序,包括快速排序归并排序堆排序锦标赛排序;线性时间复杂度的排序,包括计数排序桶排序基数排序。至于希尔排序的时间复杂度比较特殊,取决于每一轮分组的方式。最后,还有一些排序算法没有什么实用性,纯粹是用来搞笑的,比如猴子排序睡眠排序,以及珠排序

除了排序算法以外,查找算法也非常常用。想要在一个数组当中查找到某个元素,我们可以使用二分查找。同时,二分查找也可以有进一步的优化,未必每一次查找都要选择中间位置。

那么,想要在链表当中查找元素怎么办呢?刚才讲数据结构的时候说过,可以使用跳表来解决。

还有一个很常见的场景,就是在一段文本当中查找某个关键词,这就需要用到字符串匹配算法。比较高效的字符串匹配算法有RK算法BM算法KMP算法,这些算法只要有基本了解即可,正常的面试官不太可能让你手写出来。

还有一类算法,可以为复杂的问题提供最优的解决方案。在某些场景下,比如针对部分背包问题,我们可以用贪心算法这样简单粗暴的算法来求解;但是贪心算法有它的局限性,有些场景下我们不得不使用动态规划算法来求解。动态规划是算法领域的难点和重点,已有一定算法基础的小伙伴,最好能把这个知识点给搞明白。

此外,还有一类算法比较常用,那就是网络安全算法。其中包括AES算法RSA算法这样的加密算法,也包括MD5算法SHA算法这样的哈希算法。很多人以为MD5算法以及SHA算法是加密算法,这个认知是错误的。

另外,我们每天访问网络都会用到的HTTPS协议,是对众多加密算法与哈希算法的综合运用。

3.面试题与学习工具

说完了数据结构基础,我们再来说一说面试题。在这里,我总结出了21道大厂常见的算法面试题,其中大部分面试题出自LeetCode网站,我这里也标注了对应的LeetCode题号。

面试题按照难度,分成了简单中等、困难三个级别。每一道题后面都附带了我的原创讲解。大家可以从简单题开始入手,后面再逐渐加大难度。

最后,我也介绍一些比较好的数据结构和算法学习工具。首先一个重要的学习工具,就是图书。路线图里列出了几本比较畅销的算法图书,有国内的也有国外的,对于入门的小伙伴,推荐看看小灰自己出的书,《漫画算法》系列。

其次,网上也有很多讲解算法视频课程,其中比较推荐极客时间王争老师的算法课,以及左程云老师的课程,讲得都比较深入浅出。

此外还有一些比较好的算法学习和训练网站。最有名的就是LeetCode,上面有上千道算法题可以去刷,还可以看到别人的各种解法。还有一个网站叫VisuAlgo,上面有很多算法与数据结构的可视化演示,非常的形象生动,可以加深理解。

好了,关于数据结构与算法的学习路线图,我就为大家介绍到这里。 点击此处 ,获取更加完整清晰的路线图。


全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
04-17 18:32
门头沟学院 Java
野猪不是猪🐗:他跟你一个学校,你要是进来之后待遇比他好,他受得了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务