粉丝1.0万获赞1.4万


大家好,我是苏博洋,抱歉啊,我又拖了几天,本来是打算周日就把这些做出来的,结果回家以后因为各种各样的事情嘛,就是,嗯,赶车啊,睡眠不好,然后睡得不好呢,精神就不好,精神不好呢,就是 吹了冷风又头疼,总之就是各种各样的那个问题啊。嗯,拖了拖,希望大家可以谅解。然后后面的考前考点突击视频,我尽快的做,趁我这两天在工作上好像还不太急。那好,那咱们正式开始,也就是二零二二年的大体部分的 数据结构组成原理和操作系统的讲解,这应该是我在二零二五年考前讲的最后一个真题讲解视频了。总而言之就是二零二二年的选择题出的呢,是叫叫中正平和, 但是呢,他又会挖出很多细节,难度来看还是挺合适的。大体部分来看呢,难度主要是在数据结构, 然后组成原理,考的比较复古,而且确实有一点难,需要大家学的很细,因为那几年确实是有点复古风。今年也就是二零二五年十二月份的这个考试,大体我觉得有可能会考一点数据通路配流水线, 但是我觉得乘除法大家应该不用再看了,应该不太可能再考了,因为已经考了好几次了。好,那咱们正儿八经的开始看一看题目,第一题,非空二叉数,然后顺序方式存储保存,然后不存在的是负一 啊,巴拉巴拉。然后问的规矩还是老问题,是要求判断一棵存储数是否是二叉搜索数,然后先铲实算法基本思想再说算法描述,最后给出注是这些东西, 然后这个题其实我讲过,我记得是我最早的时候,我发的是第一个视频叫算法快学,当时说的是地规, 然后我就详细的讲了这个题目,然后拿到今天为止,我已经经历了四个月的沉淀了。我再讲一次这个题目,这个题目在我之前说过的这几年真题,二一年真题里面,二一年的真题我看了是当之无愧的最难, 是当之无愧的最难,这点我是没有任何夸张的。比如说二五年考的是一个数组 arim, 它的一个反向变例,然后构建前缀数组考了一个,你说它是 d p 吧,你其实就很自然的就想到 d p 了。 然后二四年和二三年考的都是突破排序它的变种,简而言之是这三年考的都是比较单一的知识。然后二一年考的也是图,就是题目出的第一不太好理解,但是其实也不难做, 而且最重要的是什么呢?最重要的是这几个题目相对来说,暴力解是好写的,至少你想不出什么好的解法呢,你就写暴力解,咱们可以先拿分再说。二二年为什么难呢?就是我之前提过一嘴数,数据结构本身它有一个叫逻辑和物理的分层, 就之前的考法是逻辑和物理统一的。二二年考的难,就是逻辑和物理去分离了。我们看一下这个题啊,就是判断排序二的差数,一般而言数结构我们用的是指征,就是数吗?这种 trigonometry 是吧?这我们一般都是用指针,指针就是有点像练的这种就离散的形式嘛,竖和指针形式就叫逻辑和物理的统一,它能够实现最大程度上理解的便捷。而本题用的是什么?用的是顺序存储, 顺序存储他本身和数结构是分离的,就逻辑和物理是不统一的,而数结构用顺序存储呢?就他不是天然的,你懂吗?他有一个转换,那这个转换就要求我们肯定是要记得住这个转换规则的。所以说这个题就是逻辑部分,他融合了二叉,二叉搜索数,他的一个判断规则, 然后也和物理部分就是数据结构,它的存储规则两个部分,它这两个是分开考的,偏偏这个逻辑部分它还不太好写,所以我在这我就认为这道题就是二一年到二五年它的考卷的最难的题。哦,还有个因素是因为这个题它的暴力解, 它的暴力解非常不好写,就我我到现在我也没,我也没太想明白这玩意要怎么解,出手就是杀招,搞得大家都很难受, 那大家看一看,就是二零,就说四零八这五年他的算法就最难,也就难到这个程度了。所以不要老是天天去惦记什么 dp 啊,什么贪心啊,什么考不了很难的,不会考的特别难,知道吧? 那既然,哎哎呀,行,那既然说是逻辑,它的逻辑和存储是分离的,那我们就分成两个部分来做。我们先说一下是逻辑部分,逻辑部分呢,就是我们只看一个 chino 的, 就是 假如说这个 node 它会有一个 value, 然后有一个指值,是 left 和 right 这两个地方,这两个指值的一个二叉数,然后我们这个要怎么判断它是一个二叉数呢?二叉数所说的定义,这个大家是很清楚的定义,就是说对于任意一个节点,比如说四十,所有的比它小的节点都要在左指数,所有的比它大的节点都要在右指数。是这样 啊,当然这个他不是啊,你看五十就比四十大,这个他就是的,是吧?嗯,那显然大家只要提到二叉数,很自然就想到一件事叫地规。 然后关于地规的写法呢?我的算法快学那个视频里也提出了三个原则,第一个叫分解问题,第二个叫导因为果而导果为因, 第三个叫边界条件。 那如果有兴趣可以找一下。我的第一个视频里面就说了说地龟要怎么写,当然有些朋友说我不喜欢写地龟,我就用站写,我就用 stock 写,可不可以?可以?实话说真的可以,因为地龟它本质上就是隐藏了这个站的实线, 这他其实也是用的占,但是我不是很推荐,因为除了说有些题目你第一眼你一看就说这个东西,他肯定需要用占实现的,大部分能用占实现的,最后基本上都能找到一个用地规实现,而且还会简单的很多的一个解法,所以地规我们是一定要会的。 那对于二叉数而言,分解问题,因为我们刚刚说了一步、两步、三步,是吧?第一步分解问题,分解问题是非常天然的,就是当前节点,左节点,右节点是这样, 那我们先写一下说函数签名,先写一个就是函数名,然后返回值,肯定是,它说返回值是去和 false 嘛,肯定是固定了,然后入参,就是 trigonot 一个 note, 然后结果返回就很好写。就是对于任意节点来说,首先是当前节点,那判断一下它和左,对于任意节点,它判断一下它和左手左左左,左指节点和右指节点的关系,这是第一个条件,就是当前节点跟左指节点右指节点这关系是 condition 一。 然后呢,再看一下左子节点,它的返回值是什么?异归嘛?是吧?你看下左子节点,它的返回值是 control 线二,右子节点它的返回值是 c 三, control 线三,然后只要说 control 线一, control 线二, control 线三中间有一个是 false, 那 就是 false。 然后补一下边界条件,边界条件是,如果是左子节点为空,那我就不比较左子了。然后左子你也别低规了是吧?你抗这些二就默认是 boss 二默认是 q, 然后右子也是一样,如果你右子为空,那我就不比较你的右子,然后右子也就为空。 我们看下代码,代码看起来就已经搞定了。对于每一个节点来说,它都要,什么它都要。如果是左节点不为空,那就是左节点要小于它,不然肯定想二就是 false。 哎,这边写的不好,这边其实是一个。 啊哈,对对对,这这这是 control 线一,就是如果左子接点不为空,那我就比较一下不让 control 线一就是 false, 然后如果柚子接点不为空,那我再比较柚子接点不让 control 线一也是 false。 然后我们再比较一下 control 线二,那咱们这一下 control 线三, control 线二就是使左子接左子的变低规条件, control 线三就是柚子的低规条件, 然后大家就兴高采烈的,是吧?下一题,哎,然后就喜提标准的零分,这个解法呢?老头最多给三分, 不能给再多了。为什么?大家想一下说,如果说左子小于根,那对于一连串的左子来说,左子小于根,左子小于根。好,那一连串下去,这个关系必然是成立的。问题就在于说右子大于根上,就是 根大于根的左子,根大于根的左子,这个是没问题的,左子是不是也要大于左子的左子,这个也是没问题的。然后理论上说,这个左子的右子,他应该会卡在这个根,这个入侧 和这个 left 之间,但是偏生说我没有验证这个左子的右子,我 没有验证他跟右侧的关系,所以说这就不行了,你知道吧?就这就出现逻辑漏洞,麻烦事马上就来了。比如说我们说举个例子,根是五,左子是三,那柚子是八, 左子的柚子是八,眼看是完全符合条件的,你看五大于三是吧?三又大,三又小于八,这好像每个都是成立,但是偏偏说这个八,他是大于五的,那就麻烦了 啊。所以说这样这样的结法,他是不行的,他是有问题的。所以我们明确判断一下标准,就是注意一下,这个标准很重要,因为我们刚才说的标准是每一个节点啊,他的左子要成立,他的右子要成立,然后自己要实现一个 这么一个根跟左右子的关系,是吧?但我们要明确一下标准,就是对于任意一棵子树,对于任意一棵子树,他干嘛呢?他的根的值,这个 root 点位率, 他要全部大于左子节点,就是他的左子节点上的任意一个值,都要小于这个根的外六。同样的,对于右子节点,他的每一个值都要大于这个根的外六,那也就是说根的外六,这个 root 点外六,他是左子的上界, 他同时也是右子的下界。是这样,那我们势必要明确说左子说你判断的时候,你就要补充这么一个上界,你每个都要补充,也就是根的直。而对于左子的左子,你看左子的左子 他的这个上界是不是被更新了,他的他的这个上界就被更新成了根的左子就第一层左子他的直, 那同样的,对于左子的右子,他同时是不是又想有这个上界,又有这个下界,是吧?所以说我们要把这个整个字漏下去,然后在逐步的递归,当过程当中,这个上界和下界都要去逐步的收紧,就都是一样的逻辑。 然后我们就看一下最后的啊,还有最后一个要判宫,这个边界条件肯定是那个,那这个肯定是要有的。好,最后我们看下代码,代码就会变成这样,就是首先一个界和是,那是吧?现在左右两边都是,那 然后当你的这个 no 的 等于 no 的 时候,等于 no, 我 就直接返回去了吗?如果说这个最小值它不会空,而且有这么一个左子条件判断,如果说,然后再判断下这个这个最大值,这个左右就是跟的左右上界这么一个卡在这里,一个上界在这, 那如果说你们两个判断都通过,最后我就比较一下说啊,就是 control 型二,就是把我的左子也放下去,右子也放下去,同时要注意一下,就是这边要去更新一下这个值,更新一下左右,更新一下就是最大值和最小值,上界和下界是这样做, 那如果那最后就是最后还加一件什么事呢?这是刚才这边是逻辑部分,逻辑部分我们到现在也写完了,但是他题目说的是顺序存储, 顺序存储也就是一个就是一个节点,在顺序存储里它有一个什么结果呢?就是下标如果是 n 的 话,当一个节点它的下标是 n 的 话,那它的左子它的下标是二, n 加一,它的右子是二, n 加二,这个是程序便利的 就非常基础的知识,这个我就不多说了。然后题目里如果说的他是因为我们这边判的是那儿,对吧?题目里说的他是那儿的话,他的只是负一,咱们把这个再带过去,整个就做完了,然后本题到这就基本上做完了。大家看完书,卧槽,这么复杂,那我在考场上怎么想的到啊? 这个没有办法,这个题确实费劲了点,所以我说是确实是近五年来最难的题目,他的逻辑部分不太好做,如果你没有做过的话,确实在考场上很难想我。当时我是因为我真的见过这道题,我当时是在二一年离开上海的, 就在去虹桥火车站的地铁上,我看了,我就打开手机看微信公众号,看那种技术类的博客,我就看到这道题,刚好又印象很深刻。 那你说基于这个题目能不能再上一点难度,那其实我这边是有一个 idea 的, 但我就不给你们了,贪多嚼不烂,这个时间点没必要再去看更多的新知识,给你们制造恐慌,是吧?有兴趣的加群,我会在群里面说一下这个 idea, 如果你真的无所谓的话, 能给这个题稍微上一点难度,但是又会稍微展现一点温柔。就是什么温柔呢?至少暴力解会好写一点。那这个题到到现在我暴力解,我还没太想好要怎么写。那好,这个题我们就讲到这。

这是一棵树,这是一棵程序员的树,今天我们要聊聊算法中的二叉搜索树。二叉树作为一棵树,只有一个根结点,如果没有子结点,那就是叶子结点,会有很多二叉树结点之多,与两个子结点一左一右, 左子结点包括他的徒子徒孙都会小于负节点和他的徒子徒孙,这一特性在左右的子数中同样成立。 如果现在我们要查找十一这个值,先从根节点开始比较,发现比五大,那么按照上述的特性,直接和柚子节点八比较,发现也比八大,那么就在选择柚子节点的十一 发现一样,结束查找,总共比较三次,我们发现比较次数就是数的高度三次。 相比于现行数据结构,比如列表,如果同样需要查找十亿的话,那么就需要从头开始,一个一个便利,一直到最后,那么总共需要七次, 所以二叉树的结构可以更快速。那么如果有很多个呢?查找次数又是多少呢?或者说树的高度是多少呢? 我反而起到了醒知数一数,第零层极根节点有一个,第一层有两个,第二层有四个,第三层有八个,那么第 n 层的话就有二的 n 次方各节点。 所以如果这 n 加一层包含的所有节点数是所有值的加和二的 n 加一次方减一, 相当于可以容纳的节点数 m, 反过来就是 log 二 m 加一减一等于 n, 简而言之就是大 o log m 的 时间复杂度。然后这棵树很平衡,我们就叫平衡二叉数。 平衡二叉数的定义是任何节点的左子数和右子数的高度差不超过一,就可以称为平衡二叉数。 如果我们继续插入值六,按照查找的方式,先和五比较,然后再和八比较,最后和七比较,最终成为七的左子节点。那么这里的七八五节点看起来不对称,但是他们的高度差都是一,所以仍然是平衡的。 那么二叉数平衡有什么好处吗?现在有一组数,从一到十,按照顺序,先把一作为根节点,然后插入二,再插入三,以此类推。这是一棵线形结构的树,所以它的时间复杂度就是大 o m, 而一颗平衡二叉树的时间复杂度则是大 o log m, 而不平衡的树则处于这两者之间,所以平衡二叉树是二叉树中叉到最优的结构。那么如何保持平衡状态呢?这种自平衡的二叉树就叫 a v l 树。自平衡一共有四种情况。 第一种,插入值一,通过比较成为节点三的左子节点,那么节点九的左子数有三层,右子数只有一层,变成不平衡了。 那么现在从插入的节点一出发,向上追寻最近的不平衡指数的根结点是节点九,然后九节点的左子节点六。在这个路径上,所以有两个左,称为左左类型。 对于这样的结构,需要将这三个节点右旋,也就是将六作为根节点,九作为六的右子节点,三还是六的左子节点七变成九的左子节点三的子节点保持不变。 第二种,插入值六,通过比较成为节点七的左子节点。如上的方式,从六出发,找到第一个不平衡子数的根节点,也就是九 往下,沿着路径分别是节点五和节点七,所以是先左后右,是左右类型。现在对五和七左旋调整剩下的六,再和刚才一样把七和九右旋调整。五的子数 与上述两种对称的结构分别是右右类型和右左类型。从插入点出发直到不平衡子数的根节点右右类型选择左旋达到平衡,右左类型先右旋再左旋达到平衡。


就是因为这个假两件,所以才这么吸引人到。是的,我我今天也没有带任何垫肩啥的,你帮我看看是不是就纯一个正正肩的肩膀,就能给人穿出来那种窄窄的薄薄的瘦瘦的感觉。不用自己去搭配,我们一件搞定哦,很方便啊,高利娃身高一米七二,体重一百六十斤。 好了,我一百六十斤卡到二叉和三叉之间的,但我上身的这个尺码是二叉上的效果。是的,卡码王小排都可以穿出来这种很显瘦很显薄的感觉。那我们珊珊身高是一米七,体重是两百零八斤,她穿的码数是三个加。