Y快速前缀树

喜欢这篇文章吗?喜欢的话去看博主的置顶博客,即可依据分类找到此文章的原版得到更好的体验,

图片及代码显示的问题,笔者深感抱歉,想要更好的体验去原博文即可。


title: Y快速前缀树
mathjax: true
date: 2020-03-16 19:05:29
categories: [myself_library,datastructure,tree,trie]
tags: [myself_library,datastructure,tree,trie]
keywords: [myself_library,datastructure,tree,trie]


Y快速前缀树

   继X快速前缀树以后,Dan Willard又提出了X快速前缀树的改进版本

改进X快速前缀树

   我们还是继续考虑n个小于M的整数(n<M),我们按照大小,从小到大分组,每组的元素的个数在区间 [ l g M 4 , 2 l g M ] [\frac{lgM}{4},2lgM] [4lgM,2lgM]上,对每组构建一颗普通平衡树,这样我们一共会得到 n 2 l g M \frac{n}{2lgM} 2lgMn 4 n l g M \frac{4n}{lgM} lgM4n颗树,我们在这些树中取一个随便的值r,r要在平衡树的最大和最小值之间,这样我们每棵树对应了一个r,把所有的r作为键,其对应的平衡树作为值放到X快速平衡树中,这就是Y快速平衡树。

Y快速前缀树的查找前驱后继

   首先在上层X前缀树上查找前驱和后继,最终我们会定位到两个叶子节点,也就对应了两颗普通平衡树,我们在这两颗普通平衡树里面直接找前驱后继然后合并就结束了。总复杂度 l g l g ( n l g M ) + 2 ∗ l g ( l g M ) = l g l g M lglg(\frac{n}{lgM})+2*lg(lgM)=lglgM lglg(lgMn)+2lg(lgM)=lglgM

Y快速前缀树的插入

   先在X前缀树上查询前驱后继,然后在其对应的平衡树上插入真正要插入的值,总复杂度 l g l g ( n l g M ) + l g l g M = l g l g M lglg(\frac{n}{lgM})+lglgM=lglgM lglg(lgMn)+lglgM=lglgM,这里有可能导致插入的值太多,进行分裂,我们来看一下这次分裂前插入了多少元素,我们考虑最坏的情况,不妨设之前也是分裂的,那么他的大小为 l g M lgM lgM,到这次分裂一共插入了lgM+1个元素,导致现在的大小超过了2lgM,于是这lgM次插入的均摊分裂复杂度为 l g ( n l g M ) l g M < 1 \frac{lg(\frac{n}{lgM})}{lgM}\lt 1 lgMlg(lgMn)<1,于是总复杂度为 l g l g M lglgM lglgM

Y快速前缀树的删除

   同样的,我们还是先查询前驱后街,然后在对应的平衡树上删除真正要删除的值,总复杂度为 l g l g ( n l g M ) + l g l g M = l g l g M lglg(\frac{n}{lgM})+lglgM=lglgM lglg(lgMn)+lglgM=lglgM,这里有可能导致平衡树上剩下的值太少,我们考虑合并,合并后如果依然太大,比方说大于lgM,我们就再次分裂为两个平衡树即可。这里可以证明,均摊复杂度依然是O1,因为从 l g M 2 \frac{lgM}{2} 2lgM l g M 4 \frac{lgM}{4} 4lgM也要 l g M 4 \frac{lgM}{4} 4lgM次删除,均摊下来,依然是O1,为了懒惰删除,我们甚至可以不必要求合并后超过lgM猜分裂,到2lgM也行。懒惰总是优秀的。于是总体复杂度为 l g l g M lglgM lglgM

总结

   至此,Y快速前缀树的所有操作均为lglgM了.

代码

   欠着欠着,以后再补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值