花了整整两周,小灰肝出一份算法路线图!

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

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


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


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

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


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,上面有很多算法与数据结构的可视化演示,非常的形象生动,可以加深理解。



好了,关于数据结构与算法的学习路线图,我就为大家介绍到这里。大家可以在程序员小灰的公众号后台回复关键词“算法学习”,获取更加完整清晰的路线图。


如果觉得这套学习路线图对你稍微有点帮助的话,希望可以点个赞点个我是程序员小灰,祝大家在新的一年里更上一层楼,感谢大家!

相关文章
|
21天前
|
C# 开发者
这件事情我整整坚持了一年零一个月!
这件事情我整整坚持了一年零一个月!
|
4月前
|
缓存 架构师 Java
Java开发三年,花费半年时间学完这些技术栈,面试定级阿里P7
现在 Java 相关岗位薪资越来越高、涨幅越来越大。 通过职友集数据可以查看,以北京 Java 相关岗位为例,其中 【20k-30k】 薪酬的 Java 工程师,占到了整体从业者的 30.8%!
|
程序员
程序员成长第十四篇:把时间用在最重要的事情上
程序员成长第十四篇:把时间用在最重要的事情上
99 0
|
缓存 算法 前端开发
👨‍💻面试官:工作两年了,这么简单的算法题你都不会?
工友们,看到题目,先别愤怒,第一小节,咱们先铺垫讲一个 “面试问题应该从问【是什么】到问【为什么】” 的逻辑。
|
SQL 分布式计算 算法
干了三年的程序员花了一年时间才拿下头条offer,原因竟然是这个!
下面整理的一些面试题以及面试答案并不是针对字节跳动这个公司的,因为我我是二本院校非科班的,从简历被拒,到拿下头条面试,我花了一年的时间,所以答案本身是针对所有想要找工作的,想进大厂工作的同学,同时适用于研究生和本科生,我将谈一下自己关于面试大厂的体会和如何打造一个足够漂亮的简历,还离找工作比较远的同学也可以看一下如何早点开始准备。
178 0
|
算法 Java
一个多月的时间,终于把这件事做完了!
一个多月的时间,终于把这件事做完了!
116 0
一个多月的时间,终于把这件事做完了!
|
XML IDE Java
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(1)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
118 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(1)
|
NoSQL 架构师 Java
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(3)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
178 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(3)
|
Web App开发 机器学习/深度学习 搜索推荐
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(2)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
102 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(2)
工作半年遇到最奇葩的问题
工作半年遇到最奇葩的问题 背景 公司最近买了一套项目,在启动的时候出现了一系列奇怪的问题,对方的技术栈要求是Tomcat7启动,但是由于我们公司出于安全的考虑所以是要求用Tomcat9进行启动的。 问题描述 下面情况都是相同war包相同Tomcat情况下 系统 Tomcat版本 能否启动 Windows Tomcat7 能 Windows Tomcat9 能 macOS Tomcat7 能 macOS Tomcat9 不能 Linux Tomcat7 能 Linux Tomcat9 不能 由于对于项目的不熟悉,导致找了很久才找出来原因。
943 0