花了整整两周,小灰肝出一份算法路线图!腾讯云开发者社区

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

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

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

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

THE END
0.[DataStructure&Algorithm]选择排序+锦标赛排序+堆排序树形选择排序(锦标赛排序) 基本思想 第一轮排序,把所有记录作为树的最后一层,两两分组(如果共有奇数个记录,则最后补上∞),取其中较小的记录作为倒数第二层 依次类推,最终得到的根结点即为这一轮中的最小值 第二轮排序,将上一轮中的最小值用∞表示,重新构造树,新的根结点即为这一轮的最小值 jvzquC41yy}/ewgnqiy/exr1dtkbm6icypt0r8>:959467mvon
1.外排序相关算法(插入排序锦标赛排序归并排序)Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序) 目录 一、内排序 1、插入排序 2、锦标赛排序 3、归并排序 二、外排序 1、过程 一、内排序 1、插入排序 2、锦标赛排序 3、归并排序 4、堆排序是利用堆的性质进行的一种选择排序 jvzquC41{wtzcwnw0drpi7hufp4og}4ctvodnn4fgvgjn|4:35?68?8
2.C语言选择排序和堆排序C语言---选择排序和堆排序 前言 堆排序是选择排序的一种,今天我们讲解一下堆排序和简单选择排序 一、简单选择排序 1.简介 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:767:86
3.常见排序算法(二)(选择排序)选择排序包括什么类型选择排序分为三种,直接选择排序、树形选择排序(锦标赛排序)、堆排序(大根堆、小根堆)。直接选择排序和堆排序是不稳定排序,树形选择排序是稳定排序。 直接选择排序 通过设置哨位,将哨位位置的数与哨位之后(包括哨位)的序列中最小的数进行交换,然后哨位递增,直到哨位到达数组中最后一个数为止。 jvzquC41dnuh0lxfp0tfv8x{uwqfjjs1ctzjeuj1fgzbkux174<73?=3
4.Java编程实现数组排序——(三)选择排序树形选择排序又称为锦标赛排序,它首先对n个记录的关键字进行两两比较,然后在其中n/2个较小者当中再进行两两比较,反复进行,直到选出最小的关键字为止。树形选择排序存在着需要辅助存储空间较多以及多余比较的缺点,其时间复杂度为O(nlogn) 。三、堆排序jvzquC41dnuh0lxfp0tfv8yjktzfgwdujkybp8ftvkimg8igvcomu8:4;5=83B
5.选择排序腾讯云开发者社区分类:选择排序(选择排序,堆排序,平滑排序,笛卡尔树排序,锦标赛排序,圈排序)思想: 1、从左至右遍历,找到最小(大)的元素,然后与第一个元素交换。 2、从剩余未排序元素中继续寻找最小(大)元素,然后与第二个元素进行交换。 3、以此类推,直到所有元素均排序完毕jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03:6496;
6.数据结构堆排序+TOPK问题(了解游戏排行底层原理)通过对两种建堆方式的比较更建议使用向下调整建堆但是向上调整建堆更容易理解看个人情况 🌏2.1 向上调整建堆: 🌏2.2 向下调整建堆: 🌟三、堆排序的时间复杂度:O(N*logN) 🌟四、呼应一下上章节的部分:利用堆使数据有序(不建议) 利用创建的堆数组排序:我们可以采用下面这种方法 — 先建堆(NlogN)太麻烦jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:784489
7.算法与数据结构堆排序&&TOPK问题建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。 堆排序代码----->升序:建大堆 堆排序是通过建立一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,并重新调整堆结构,这样重复地交换和调整得到有序序列。在升序排序时,我们希望第一个元素是最大的,所以需要建立大顶堆,这样堆顶元素就是当前所有元素中的最大值。 /jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:9976:3
8.排序算法详解:选择排序与堆排序本文深入探讨了排序算法中的选择排序与堆排序,包括锦标赛排序、堆的特性、排序思路以及代码实现。重点突出算法核心概念与优化策略。 排序算法中的几个基本概念: 1.内部排序和外部排序 内部排序:将所有的排序记录都存储于计算机随机存储器中的排序过程; 外部排序:排序记录的数量过大,以致于不能将所有的排序记录一次性读jvzquC41dnuh0lxfp0tfv8mgasobq8ftvkimg8igvcomu8=;39>92
9.优先级队列——二叉堆多叉堆堆排序与锦标赛树这使得堆适合在插入、删除时局部调整,而不需要全局排序。 二、完全二叉堆的操作 1.插入操作 插入操作步骤 二叉堆要插入一个节点时,总是插在完全二叉树的最后一个位置(A[n]A[n]A[n]位置上)。 若在最小堆中插入一个节点,则插入节点后与父节点进行比较,若小于父节点则将该节点**“上浮”**,然后继续与父jvzquC41dnuh0lxfp0tfv87523e93>8384<0c{ykenk0fnyckny03=<586?9;
10.排序算法详解常用排序(二) 本文详细介绍了选择排序、锦标赛排序、堆排序、归并排序和基数排序等常见排序算法的工作原理及其实现过程,包括它们的时间复杂度和应用场景。 选择排序 选择排序说的是:每一趟在后面没有排序n-i个元素中,选择一个最小的放在第 i 个位置上,接下来选择i+1位置上的元素,一共需要执行n-2趟操作,他的jvzquC41dnuh0lxfp0tfv8vsa5:74B>::1gsvrhng1jfvjnnu1;45?>956