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

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

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


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


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



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


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

相关文章
|
3月前
|
C# 开发者
这件事情我整整坚持了一年零一个月!
这件事情我整整坚持了一年零一个月!
|
4月前
|
设计模式 算法 安全
2023下半年软件设计师 关于我用了半个月过了软件设计师这件事
这篇文章分享了作者在仅用半个月的业余时间备考并通过2023下半年软件设计师考试的经历,包括备考策略、所用资料和个人建议,同时提供了相关备考资料的获取方式。
|
7月前
|
存储 人工智能
近期复盘 | 想多了都是问题,想开了都是答案
近期复盘 | 想多了都是问题,想开了都是答案
|
7月前
|
缓存 架构师 Java
Java开发三年,花费半年时间学完这些技术栈,面试定级阿里P7
现在 Java 相关岗位薪资越来越高、涨幅越来越大。 通过职友集数据可以查看,以北京 Java 相关岗位为例,其中 【20k-30k】 薪酬的 Java 工程师,占到了整体从业者的 30.8%!
|
程序员
程序员成长第十四篇:把时间用在最重要的事情上
程序员成长第十四篇:把时间用在最重要的事情上
107 0
|
缓存 算法 前端开发
👨‍💻面试官:工作两年了,这么简单的算法题你都不会?
工友们,看到题目,先别愤怒,第一小节,咱们先铺垫讲一个 “面试问题应该从问【是什么】到问【为什么】” 的逻辑。
|
消息中间件 监控 架构师
公司花50k挖了一个BAT架构师,写代码上线直接内存溢出,被开除了!
公司花50k挖了一个BAT架构师,写代码上线直接内存溢出,被开除了!
|
算法 Java
一个多月的时间,终于把这件事做完了!
一个多月的时间,终于把这件事做完了!
125 0
一个多月的时间,终于把这件事做完了!
|
XML IDE Java
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(1)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
121 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(1)
|
Web App开发 机器学习/深度学习 搜索推荐
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(2)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
108 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(2)