数据结构与算法(Java版) | 本套系列教程的内容介绍和授课方式
Posted 李阿昀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法(Java版) | 本套系列教程的内容介绍和授课方式相关的知识,希望对你有一定的参考价值。
接下来,这一讲,我会给大家简单介绍一下我们本套系列教程大致要讲解的内容以及本套系列教程的一个授课方式。
本套系列教程的内容介绍
大家不妨看一下下面这张表格,这就是我们本套系列教程大致要讲解的内容。
有没有震惊到大家啊😱!是不是我们这套系列教程要讲解的内容还是挺多的啊!分了好多好多章节呢,大家看到没有,你现在该知道我们这套系列教程的分量有多重了吧,不夸张的说,这有可能是东半球最系统全面的一套讲述数据结构与算法(Java版)的系列教程,虽然有点王婆卖瓜,自卖自夸的嫌疑!
对于我们这套系列教程,我想说的是,虽然以上表格将每一章节我们要掌握的知识点和每一知识点所要讲述的具体内容作了一个详细概述,但是我觉得还是有必要来给大家再详细赘述一遍,毕竟这样做可以让大家的印象更深刻一点,嘻嘻😀,千万不要嫌我啰嗦哟!
第一章节:内容介绍和授课方式
在这一章节,大家需要掌握的知识点有:
- 几个经典的算法面试题。
- 数据结构与算法的重要性。
- 本套系列教程(数据结构与算法)的内容介绍。
相信经过我前面的讲解,大家已经掌握了这一章节的大部分内容,至于最后一个知识点嘛,咱们本讲就在阐述它。
第二章节:数据结构与算法的介绍
在这一章节,大家需要掌握的知识点有:
- 数据结构的介绍。
- 数据结构与算法的关系。
- 看几个实际编程中遇到的问题。
- 线性结构和非线性结构它们的概念。
可以看到,这一章节都是在讲述一些概念,还没有真正涉及到一些具体的代码,我想,这一章节对于大家而言,学起来应该还算是比较简单的了。
第三章节:稀疏数组和队列
见名之意,这一章节,大家需要掌握的知识点就是稀疏数组和队列。在讲到稀疏数组时,我会给大家讲解如何来实现数组的一个压缩和解压;在讲到队列时,我会首先向大家介绍队列的一个使用场景,就是咱们去银行排队办理业务的这样一个场景,然后我才会向大家介绍队列的概念,最后我会向大家讲解数组模拟队列以及环形队列的一个分析和实现。
注意,从这一章节开始,咱们就要开始写代码了哟😊!
第四章节:链表
在这一章节,大家需要掌握的知识点有:
- 链表的一个介绍。
- 单链表。
- 双向链表。
- 单向环形链表。
- 约瑟夫问题。
讲到单链表时,我会首先向大家简单介绍一下单链表,然后会再给大家讲解一下它的增删改查以及顺序插入,最后我会给大家讲解几个新浪/百度/腾讯这些大厂有关单链表的面试题,比如单链表的逆序打印或者逆转(reverse)。
讲到双向链表时,同样我也会首先向大家简单介绍一下双向链表,然后就是给大家讲解一下它的增删改查了。
讲到单向环形链表时,我则会向大家介绍一个它的应用实例,即约瑟夫问题,简单来说,就是我会教会大家如何使用单向环形链表来解决约瑟夫问题。
第五章节:栈
这一章节,大家需要掌握的知识点可就有点多了,如下:
- 栈的介绍。
- 栈的应用场景。
- 栈的快速入门。
- 栈实现综合计算器。
- 前缀、中缀、后缀表达式(后缀表达式又叫作逆波兰表达式)。
- 逆波兰计算器。
- 中缀表达式转换为后缀表达式。
- 逆波兰计算器完整版。
栈的介绍及其应用场景,比较简单,都是一些概念性的东西,相信大家应该不难理解。而在讲到栈的快速入门时,我则就要向大家讲解数组模拟栈的一个分析和实现了,当然,这也会很简单,相信并不会难倒大家,你可千万不要有畏惧心理哟😊!
然后,我会教大家用栈实现一个综合计算器,计算器嘛,很好理解,就是你输入一个表达式,例如7*2*2-5+1-5*3-3
,计算器就会帮你把这个表达式的结果给算出来。
接着,我会给大家讲一下前缀、中缀、后缀表达式,其中,前缀表达式又被称作波兰表达式,而后缀表达式则是被称作逆波兰表达式。至于这儿我具体要给大家讲解哪些内容,那就不再赘述了,大家参考一下以上表格就行。
紧接着,我们会写一个逆波兰计算器,至于怎么写的,到时候我们再说。
再接着,我会给大家讲一下中缀表达式转后缀表达式的详细步骤,就是代码是怎么一步步实现转换的,之所以我要讲的这么详细,是因为大家在面试的时候,别人往往不会让你讲那些一套一套的理论,而是直接让你上代码,就你把代码给我写出来就行,别BB那么多。
最后,我们会写一个完整版的逆波兰计算器,即支持加、减、乘、除、小括号、多位数以及小数,此外,还可以做兼容处理!至于怎么写的,到时候我们再说吧!
第六章节:递归
在这一章节,大家需要掌握的知识点有:
- 递归的应用场景。
- 递归的概念。
- 递归的调用机制。
- 递归能解决什么样的问题。
- 递归需要遵守的重要原则。
以上知识点,我们会重点来讲解递归能解决什么样的问题。既然话都说到这份上了,那么递归能解决什么样的问题呢?典型来说,就是如下这样两个问题,即:
- 迷宫问题:递归的一个具体应用。
- 八皇后问题:相信大家应该对该问题还留存有些许印象吧!因为之前我就给大家详细阐述过该问题,而且我还说过该问题是回溯算法的一个典型案例,还有印象吧!
以上两个问题虽然看起来很简单,但是也不是随随便便便能轻松解决的,这一点相信大家以后应该会有所体会。当然,说不定有可能面试的时候你就会碰到这两个问题,例如请你利用Java代码实现一个迷宫回溯,或者八皇后问题的回溯算法,当你遇到这样的面试题时,心中可不要觉得太惊讶哟!
第七章节:排序算法
这一章节,大家需要掌握的知识点可就有点多了,如下:
- 排序算法的介绍。
- 算法的时间复杂度。
- 算法的空间复杂度简介。
- 冒泡排序。
- 选择排序。
- 插入排序。
- 希尔排序。
- 快速排序。
- 归并排序。
- 基数排序(基数排序又被称之为升级版的桶排序)。
- 常用排序算法总结和对比。
一说起排序算法,相信大家应该知道现在最常用的其实就那么三种,即冒泡排序、选择排序以及插入排序,但这次我们这套系列教程则就有很大的不同了,相比其他教程而言,我们这套系列教程将会针对排序算法力求讲得更深入一点,其结果便是我会一共给大家讲这八种排序算法,即:
- 冒泡排序。
- 选择排序。
- 插入排序。
- 希尔排序。
- 快速排序。
- 归并排序。
- 基数排序(基数排序又被称之为升级版的桶排序)。
- 堆排序。
其中,基数排序又被称之为升级版的桶排序,桶排序,相信大家应该有听说过吧!要是没听说过,那就当我什么都没说好了。总之,基数排序就是桶排序的一个升级版,可想而知,这儿我要给大家讲解的便是一个更高级版本的桶排序(即基数排序)。
之所以我们这套系列教程要给大家详细讲解以上这八大排序算法,是因为现在企业对程序员的要求是变得越来越高了,保不齐你面试的时候别人就会让你直接写个堆排序或者希尔排序(或者基数排序)。
当然,不出例外,我还会给大家讲解算法的时间复杂度,注意,这一块我会讲得比较详细点,因为我觉得这块的内容还是挺重要的,值得给大家好好讲一讲。至于具体要讲些什么内容,那就只能等到讲到这块内容的时候再来给大家揭晓答案了,其实从上面表格中大家就能知晓答案,除了给大家解释清楚时间频度和时间复杂度分别是什么意思之外,我还得给大家介绍一些常见的时间复杂度,闻名不如见面,下面就让我来给大家列出一些常见的时间复杂度吧!
- 常数阶☛O(1)。
- 对数阶☛O(log2n)。
- 线性阶☛O(n)。
- 线性对数阶☛O(nlog2n)。
- 平方阶☛O(n^2)。
- 立方阶☛O(n^3)。
- k次方阶☛O(n^k)。
- 指数阶☛O(2^n)。
看到没,常见的时间复杂度是不是还是蛮多的啊😥!至于每一个阶到底是什么意思,那就只能等到讲到的时候再来给大家讲了,注意,这儿我会以具体案例的形式来分别对每一个阶进行详细分析,到时候大家可要注意认真看哟😊!
看到这,我猜有些人心里可能就会犯嘀咕了,就是他们担心这儿会用到很多有关数学的知识,其实大家不用怕啊,虽然是用了一些但是用的并不多,可以这么讲,我本人数学也很差,只要大家跟着我这套系列教程来学,认真一点,问题都不会太大,并不是那么的难,因为要想搞清楚以上那些阶你只需要具备数学的一点基础就行了,并没有大家想象中的那么复杂,除非你打算将来学数值分析(或者离散数学),那就有可能会对数学的要求高一点,但如果只是对一个算法的时间复杂度进行分析,那么对数学的要求就并不高了。
讲完算法的时间复杂度之后,接着我还会给大家简单讲一下算法的空间复杂度,当然,这里仅仅是作一个简单介绍,大家重心还是得放在算法的时间复杂度上,因为目前衡量一段代码优不优越,主要还是得看时间复杂度。
紧接着,我便要给大家讲解各种排序算法了,在讲解的过程中,我将会遵循这样一个原则,即先对要讲解的排序算法做一个基本介绍,然后再对其进行算法分析,伴随着算法分析的过程,我都会配备有一个图解,这样大家可能会理解得更透彻一些,最后便是用代码来实现该排序算法了,到时候我会把代码一行一行的给大家敲出来,每一行代码的意思我都会给大家讲清楚,讲完大家肯定都能熟练掌握,放心好了😘!
这里,有一点需要大家注意,就是堆排序我并没有放到这块来讲,因为要想搞懂堆排序你得先有二叉树的基础才行,所以堆排序得等大家学完二叉树之后我才会给大家进行讲解,总之,堆排序并不是说就不讲了,它讲还是得讲,只不过它得留到后面来讲了,希望大家留意这一点。
最后,我会对常用排序算法进行一个总结和对比,给大家收个尾。
第八章节:查找算法
关于查找算法,我猜大家一般学的都是线性查找和二分查找这俩算法吧!但这次情况就大不同了,因为我要来给大家送福利了,就是我们这套系列教程会再给大家讲两个查找算法,即插值查找算法和斐波那契查找算法,其中,斐波那契查找算法又被称作黄金分割查找算法。总之,在这一章节,我总共会给大家讲四种查找算法,即:
- 线性查找算法。
- 二分查找算法。
- 插值查找算法。
- 斐波那契查找算法。
之所以我们这套系列教程要给大家详细讲解以上这四种查找算法,是因为现在企业对程序员的要求变得越来越高了,保不齐你面试的时候别人就会考察你斐波那契查找算法,你要是不会那不就给人一个拒绝你的借口了吗?
第九章节:哈希表
在这一章节,我首先会给大家讲一下哈希表的基本原理,要注意的是,这个哈希表是一个基于数组加单链表的结构哟!
讲完哈希表的基本原理之后,我们就要自己动手写一个哈希表了,这里为了便于大家理解,我会借助Google的一个上机题来给大家进行讲解。只要大家能看得懂,那我相信你对HashTable
的底层原理一定会有一个比较深入的认识,因为我们是完全自己动手写了一个哈希表,而且还是一个实实在在的哈希表。
当然,如果将来我们把哈希表结构中的单链表换成了AVL树(即平衡二叉树),那么就更牛逼了,因为那其实就是一棵红黑树了,红黑树的效率只会更高。
第十章节:树结构基础部分
关于树这块的内容,我这里其实是把它分成了三部分来讲,第一部分讲述的是树结构的基础内容,第二部分讲述的是树结构的实际应用,而第三部分讲述的则是多路查找树。
在讲述第一部分内容(即树结构基础部分)时,我列出的如下知识点需要大家熟练掌握。
- 二叉树:讲到二叉树,自然就要讲到它的创建、遍历、查找以及删除等操作了,其中,二叉树的遍历又有前序、中序、后序之分,这一点大家一定要留意!
- 顺序存储二叉树:关于顺序存储二叉树,我只说一点,别的我也不多说了,就是它是大家学习堆排序的一个前提。
- 线索化二叉树:关于线索化二叉树这块具体要讲解哪些内容,大家参考一下以上表格就行,这里我就不再赘述了。
第十一章节:树结构实际应用
上面我们不是说过嘛,关于树这块的内容,我这里是把它分成了三部分来讲,第一部分,即树结构基础部分,在上面章节已经讲过了,讲过之后,自然我们就要来讲第二部分了,而本章节我们讲述的正是第二部分的内容,即树结构实际应用。
在这一章节,大家需要掌握的知识点有:
- 堆排序。
- 赫夫曼树。
- 赫夫曼编码。
- 二叉排序树。
- 平衡二叉树(平衡二叉树又叫作AVL树)。
不知道大家出去找工作面试时有没有被问到这个赫夫曼树,如果没有遇到的话,那你运气还挺好的,那万一要是运气不好遇上了呢,要知道这个赫夫曼树在面试的时候是会经常被问到的,你这次没遇到,没准下次找工作时就遇到了。
为什么面试的时候会经常被问到赫夫曼树呢?因为赫夫曼树它有一个非常重要的应用,即它可以实现对数据的压缩和解压,比如我们常见的文件压缩和文件解压,这些操作实际上都是借助于赫夫曼编码来实现的,由此可见赫夫曼树(或者赫夫曼编码)在实际应用中的重要性了吧!
这里,大家的思绪不妨回到大学时代一下,好好回想一下,在大学学数据结构时,是不是就只学到如何创建赫夫曼树就完了啊?但这次情况就大不同了,因为我们这套系列教程会继续往下深入,把赫夫曼编码及其最佳实践也给大家讲了,到时候大家就能知道这个赫夫曼编码到底是怎么来的了,以及它到底有什么作用,当然,在讲解的时候,我会借助实际案例来给大家进行讲解,此外,我还会给大家做原理剖析及图解,为的就是让大家能更容易理解。
最后,关于二叉排序树和平衡二叉树这俩知识点具体都要讲些什么内容,在这里我就不再多说什么了,大家参考一下以上表格就行。
第十二章节:多路查找树
关于树的最后一部分,即多路查找树,在这一章节我就要给大家讲讲了,讲毕,那么本套系列教程关于树这块的内容我们就可以暂时告一段落了,当然,我知道还有些内容没讲到,但我们这套系列教程就是这样规划的,如果大家还想知道得更多,那就请关注我后续的动态吧!
谈到多路查找树,头脑中我们势必就要有2-3
树、B
树、B+
树以及B*
树它们的概念,关于它们,首先我们肯定是要对它们的基本介绍要有所了解,其次是还要知道它们各自的运行原理,能掌握这些我觉得就差不多了。
这里,有一点我需要向大家说明,就是之所以这一章节我们会讲B
树、B+
树以及B*
树,是因为到时候我们得为理解mysql索引做准备,如果你学过MySQL的话。学过MySQL的同学,我相信你一定对它里面的索引印象非常深刻,因为索引有基于B
树结构的,也有基于B+
树结构的,如果想要彻底地搞清楚它们,那么你得对B
树和B+
树有一个清晰的认识才行,而这一章节我们就会对它们作一个详细的介绍。
第十三章节:图
图这一章节,大家需要掌握的知识点有:
- 图的基本介绍。
- 图的常用概念。
- 图的快速入门案例。
- 图的深度优先搜索算法介绍。
- 图的创建和深度优先搜索算法。
看起来,似乎我们这套系列教程对图讲解的篇幅过于少了,但是麻雀虽小五脏俱全,对于大家学习图还是有一定的参考价值的,要不然我写它干嘛呢,对不?
第十四章节:程序员常用十大算法
至此,大家终于历经千辛万苦来到最终章节了,在这一章节,我会给大家好好讲讲程序员常用的十大算法,哪十大算法呢?
- 二分查找算法(非递归)。
- 分治算法。
不知道大家还记不记得前面我给大家介绍过的汉诺塔游戏,没错,该游戏正是分治算法的一个最佳实践!这也就是说,讲到分治算法时,我会使用该游戏来对其做一个最佳实践的案例演示,大家到时就请拭目以待吧! - 动态规划算法。
这里,我会借助一个背包问题来给大家讲述动态规划算法。 - KMP算法。
这里,我会借助一个字符串匹配问题来给大家讲述KMP算法,而且在讲述该算法的过程中,我还会告诉大家搜索词和部分匹配值到底是怎么创建起来的。 - 贪心算法。
这里,我会借助一个集合覆盖问题来给大家讲述贪心算法。 - 普里姆算法。
这里,我会借助一个修路问题来给大家讲述普里姆算法。当然,在讲述该算法的过程中,不可避免地我们还要讲到最小生成树以及极小连通子图,到时候我们就来看一下它们到底是怎么创建起来的。 - 克鲁斯卡尔算法。
这里,我会借助一个公交站问题来给大家讲述克鲁斯卡算法。至于这个公交站问题嘛,归根结底来说,就是我们怎么样才能够算出一个最小生成树。 - 迪杰斯特拉算法。
这里,我会借助一个最短路径问题来给大家讲述迪杰斯特拉算法。最短路径问题,描述起来也很简单,就是现有很多节点,如果要想从这个节点到达另外一个节点,那么怎么样才能够找到一个最短的路径呢?我不说,想必大家也都知道了,迪杰斯特拉算法就可以用于解决该问题。 - 弗洛伊德算法。
这里,我想说的是,弗洛伊德算法也可用于解决最短路径问题哟!于是,现在就有俩算法可以用于解决最短路径问题了,即迪杰斯特拉算法和弗洛伊德算法,既然它俩都可用于解决最短路径问题,因此咱们这儿就要对它俩做一个对比了,看一看它俩都有些什么区别,以及它们各自的有优缺点都有些啥。 - 马踏棋盘算法。
谈到马踏棋盘算法,想必大家应该都知道该算法就是用来解决马踏棋盘问题(当然,你也可以称之为骑士周游问题)的。等到时候我们用马踏棋盘算法算出马踏棋盘问题的一种解(走法)之后,我会给大家去玩一把那个马踏棋盘游戏,验证一下该解(走法)能不能让一匹马把整个棋盘踏完。
以上便是程序员常用的十大算法,不知道大家看完心里有没有一点发怵,发怵是正常的啊,毕竟要掌握的内容还是挺多的,但世上无难事,只怕有心人,只要我们这套系列教程所讲述的内容你都真真正正地掌握了,那我可以负责任地跟你讲,你的数据结构与算法的水平一定会得到一个较大的提升,这是毋庸置疑的!
关于我这么用心写的这套讲述数据结构与算法的系列教程,无论大家怎么夸赞,我都觉得还不够,还远远不够,这可不是我不要脸啊,我就问你你在市面上有看到过写得这么详细而又全面的系列教程嘛,没有吧,全网就独我这份,说是东半球最系统全面的一套讲述数据结构与算法(Java版)的系列教程一点都不为过,所以我觉得大家怎么夸都不过分。你也不想想你在大学学数据结构这门课时,老师有给你讲这么多吗?你再好好看一下我们这套系列教程所要讲述的章节内容,是不是并没有这么多啊?顶多就给你讲讲如下这些内容。
- 数组。
- 链表。
- 递归与广义表。
- 排序。
- 集合与搜索。
- 索引与散列。
- 树。
- 图。
甚至有的大学讲的还没这么多,仅仅只是粗粗略过,自然同学们学的也是囫囵吞枣。好,就算退一步说,以上内容都讲到了,但算法本身是不是讲的还是挺少的啊!然则我们这套系列教程就不同了,数据结构与算法它是结合起来讲的,应该说讲的还是相当有深度的。
总之,只要我们这套系列教程所讲述的内容你都真真正正地掌握了,那么你的数据结构与算法的水平就一定会得到一个大幅度的提升,当然,这对你理解算法也会有很大帮助。
本套系列教程的授课方式
。。。
以上是关于数据结构与算法(Java版) | 本套系列教程的内容介绍和授课方式的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法(Java版) | 本套系列教程的内容介绍和授课方式
数据结构与算法(Java版) | 本套系列教程的内容介绍和授课方式
数据结构与算法(Java版) | 本套系列教程的课程亮点和授课方式