伸展树分析
感觉缓慢平和细水长流的复习节奏不适合我了。我夜深人静的时候深深为自己的实力感到担忧。感觉自己的实力不足以支撑自己百分百上岸。然后因为一些生活中或者学校里面的事情,还需要花费一些复习的时间去处理,还有自己不够自律的话,还需要花费一些时间去放松。实际上每个人都是这样,都需要克服各种各样的问题,才能慢慢提升自己的实力。大概就是这样。就是没有任何办法的事情。我只能说,我们能做的就是,尽可能提升效率,自律。然后希望最后运气也比较好,能取得一个比较不错的初试成绩。
理想随机的情况下,伸展树的插入、删除、查找三者的分摊时间复杂度都是 O ( l o g n ) O(logn) O(logn) 。假设满足局部性原理,可以保证分摊的时间复杂度是 O ( 1 ) O(1) O(1)。局部性原理表示的意思是,下一次访问的数据,很可能在上一次访问的时间和空间的附近。
在一小段时间内,被访问过的程序和数据,很可能被再次访问。
空间上这些程序和数据可能集中在一小片存储区域。
在访问顺序上,指令顺序执行比转移执行的可能性大。大约是五比一。
实际上这个数据结构的题真的有那么困难么。实际上也没有吧。还是自己吓唬自己了。用理性的思维去慢慢地分析,听着老师讲解,然后自己去理解老师的逻辑,肯定是可以搞懂的。数据结构不崩掉,实际上专业课根本就崩不了。多复习一下数据结构就可以了。
实际上没有学好的就是伸展树,B 树,红黑树,也就是这个样子。没啥困难的。干就完事了。
局部性原理:被访问过的节点,很可能再次被访问。下一次访问的节点,很有可能就在刚被访问过的节点附近。伸展树里面,zig 是把左孩子顺时针旋转到根节点。zag 是把右孩子逆时针旋转到根节点。
zig 操作的时候,原来左孩子的左孩子还是左孩子。左孩子的右孩子,成为新的根的右孩子的左孩子。
zag 操作的时候,原来右孩子的右孩子还是右孩子,右孩子的左孩子变成新的根的左孩子的右孩子。
这种伸展,是否可以提升时间效率呢,就是是否可以把访问过的节点,提升到树根,进而提升访存的时间效率呢。这个取决于两个因素。第一个因素是树的初始的形态。第二个因素是节点的访问次序。节点的访问顺序不是我们可以控制的吧。
树的初始形态,假设是单链,这个时间复杂度就比较高。因为单链的高度是 O ( n ) O(n) O(n),假设树的高度比较低,那么高度的级别是 O ( l o g n ) O(logn) O(logn) ,这里实际上差距是比较大的。
假设访问几个非常靠近的节点,效率就比较高。要是访问单调的几个节点,并且这几个节点之间的差距比较大,那么这个效率就比较低。
假设关键码的个数是 n ,那么这个树高是 n - 1 。这个考虑的是最坏的情况。别的不说,反正学习就是要自律一点。时间反正只有三十多天了。抓紧时间学习。提升自己专业课的实力就完事了。
我想了一下,自己学不下去的一个重要原因就是学习这些东西对我来说是有一定的难度的,要是像吃饭喝水一样简单,我就随便学了。所以学习一些比较难的东西之后,我就学习一些简单的东西,调节一下。这样有利于自己进行持续的学习。
最坏的情况是单链的伸展树,然后依次查找每个节点,这个时候高度的变化就是先降低然后升高。累计是 Ω ( n 2 ) \Omega(n^2) Ω(n2) ,分摊是 Ω ( n ) \Omega(n) Ω(n) ,这个时间复杂度是比较高,不可以接受的。所以我们可以考虑不用单层伸展。考虑用双层伸展。
单层伸展的意思是,不管发生什么情况,都是把查找的元素伸展到树根。然后双层伸展是找 3 个节点。v 表示查找的节点,p 表示查找节点的父亲,g 表示父亲的父亲。
如果查找的节点是中序遍历中间的节点,就是图形上面看处于中间的节点,那么,双层伸展和逐层伸展没啥区别。就是把 v 节点一层一层伸展到根节点就完事了。
zig 就是顺时针转一下,zag 就是逆时针转一下。这种旋转之后很平衡的情况,让人看起来非常爽。感受到了数据结构的一种简洁的逻辑上的美感。感觉这个操作还是需要记住一些常见的例子,不然这个描述也没有那么清晰,我考试的时候怎么输出出来呢。
这个区别是看先旋转的哪个节点吗。如果我先旋转 p 再旋转 g ,和我先旋转 g 再旋转 p 可以给这个树高带来不一样的变化?观察 ppt 里面关于逐层伸展的描述,也就是假设 p 是 v 的父亲,那么每次就是转 p ,每次转新的 p ,那么观察下面的描述。
zig-zag 操作实际上是类似于单层伸展的,和单层伸展别无二致,因为,单层伸展的本质是顺时针旋转父节点,不断提升叶子节点的高度。让叶子节点逐渐登顶,变成根节点。那么,zag-zig 也是类似的,也就是,我们先对 p 操作,然后把 v 提升到了原来 p 所在的位置,实际上 g 就是新的位置的 v 的父亲节点,旋转 g 实际上对父节点进行旋转操作,完全就是单层伸展。我感觉 ppt 的意思就是,第一次对 p 进行旋转就是单层伸展,如果第一次对 g 进行旋转,第二次对 p 进行旋转,就是双层伸展。
观察可以发现,先对 p 还是先对 g 进行旋转,最后的结果是有区别的。这个伸展我有点分析不清楚。我不知道怎么一个节点从单链最底部,逐层伸展到最上面是个啥情况。受不了的时候就刷数学真题吧。把 09 到 25 年数学小题每一个都搞得非常非常透彻。这里大概是 248 道小题。吃透这 248 道小题,感觉数学的基本盘绝对非常非常扎实了。
24 年 t5
这个题看不懂啊。系数矩阵的秩等于增广矩阵的秩,表示非齐次方程有解,然后小于系数矩阵的秩,表示有无数解。交线是一个直线,所以表示是无数解。和 19 年 t6 如出一辙。我翻出了 19 年的卷子。一定要把这个类型的题吃透。先优先吃透 21 到 25 年的每道题,然后慢慢来吧。
系数矩阵实际上每一行就是一个平面的法向量。平面相交,法向量肯定就是不对应成比例,换句话说,两个法向量一定线性无关,那么系数矩阵的秩,肯定至少是 2 了。
空间解析几何和线性方程组问题。还是太极限了。要是自己在 11 月初,就能把自己的实力提升到 360 分以上,后面的时间只需要保温就好了。现在我估计自己实力还是没有 360 分。要是专业课有 90 分的实力搞不好也能冲一个 360 了。哎。专业课就是我现在最大的短板。突破之后就稳了。反正就是重复练习重点就完事了。
剩下的看运气了。
线性方程组和空间解析几何,记忆结论就完事了。没啥困难的。要顶住所谓的任何压力,提升自己的实力到 360 分的水平。
双层伸展本质
我想要知道,七个节点,单层伸展和双层伸展,到底这个过程是怎么样的。是所谓的左侧链的情况。

Data Structure Visualization
animation 动画片。
最下面三个节点的双层伸展没啥问题。我可以理解。假设是做 zig 操作,也就是对父节点或者祖先节点做顺时针旋转,那么孩子节点的左孩子是不动的。这里指的是,旋转上去的孩子节点的左孩子,旋转上去的左孩子的左孩子,保持不变。好像确实是这么回事儿。
考试的时候默认就是双层伸展的。考虑了一下,两门文科都是重点突破所谓的客观题,客观题要是几乎拿满,那么这两门文科就稳了。数学也是,重点就是客观题,客观题几乎拿满就是稳了。专业课重点是数据结构,数据结构几乎拿满,也是几乎稳了。大概就是这么个复习思路。剩下的就是踏踏实实地好好努力了。
我之前听伸展树的网课没有听懂,主要是因为网课的节奏太快了。我跟不上。然后也没有花费足够的时间精力去啃这个板块的内容。大概就是这样子。
但是好像也就只有这点东西了。双层伸展也是有这个高度降低和升高的一个情况的。只是和单层伸展相比,双层伸展高度降低的速度更快。双层伸展的最坏情况不致持续发生。
伸展树势能分析
我们计算的是,伸展树的每个节点作为根节点的子树的规模,所谓规模就是以节点为根的子树的所有的节点个数。然后连乘这个节点个数,最后取一个对数,作为整棵伸展树的势能。
为什么 l o g ( n ! ) log(n!) log(n!) 和 O ( n l o g n ) O(nlogn) O(nlogn) 同级别
用斯特林公式分析。

取对数之后,抓大头,就可以得到两者是同级别的。
