ADS第一节课笔记

AVL
一、想法来源:搜索树的高度可能为o(n)
最直接的想法就是保证根节点的深度相差不超过1
实际上如果考虑搜索效率的话,这样的限制强了一些。我们可以考虑偏局部的想法,左右子树的高度相差为1,这样包含了上面的情况,并且可能存在根节点深度为2的情况
定义:balance factor:hl-hr,左子树高度减去右子树高度
二、旋转
双旋转/单旋转
单旋转,用于左右子树差别不大的时候,旋转一次就得到结果复杂的情况使用双旋转,可以通过一直使用双旋转不断降低balance factor
标记:RR rotation:RR指的是右子树的右子树是造成不平衡的元凶
同理这点对于LL也是成立的
我的理解是,LL的时候,左子树的高度已经大于原来的树除去左子树后的高度了,因此,左子节点可以作为根节点,并且带着它的左子树一起,并把不深的那个右子树给y作为其左子树。这样为什么叫做右旋呢?大概是左子节点的右节点变为原来的根节点了吧。
从这个角度出发,双旋转、LR、RL也好理解了一些:
LR则是先左旋在右旋,即是说我们先掉换成LL的情况,实际上第一次的左旋并没有使得AVL树恢复平衡,只是说做了一个类似预处理的东西,并且保持了性质。
RL情况同理。
Splay树(伸展树)
一、想法
其实平均时间复杂度应该和概率有关,也即是说每种访问顺序会对应一个概率值,基于这个概率值,我们再计算时间复杂度。那么我们可以把经常访问的节点放在前面容易访问到的位置,从而使得我们的平均复杂度下降。
二、基于AVL操作
值得注意的是,改编不是胡编,我们需要通过AVL操作来完成这些事情,并且我们要牢记我们希望不改变BST的性质。
实际上我们这里就不同的情况分别用不同的旋转方法,对于一条线上的如LL、RR,有拐弯的如LR、RL它们分别采取双旋转和两次简单旋转。
通过这样的操作我们就可以把想要的数给弄上去了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值