对于民科吧s5_or吧友自增树的复杂度计算

  原帖

  自增树如s5_or所说,是一种思想像Splay的数据结构,每个节点维护一个堆权值,每当询问一个节点时,堆权值++,并返回时维护堆权值为堆的性质。这个树从旋转次数上比Splay小是肯定的,因为Splay旋转次数是logn次,但是这个树不一定,空间复杂度是O(n),接下来分析时间复杂度。

  如果插入时是离散的数,询问是也是离散的数,那么树的深度期望logn,询问的时候期望复杂度也是O(logn),询问之后树的深度变化小于等于1,期望每logn次询问深度变化1,但因为变化有正负,所以深度期望不变,由于旋转次数小于Splay,所以常数小于Splay,在全随机情况下优于Splay。

  但是如果是构造数据的话,自增树的灾难就来了,首先我们按次序插入K个数,从小到大,按照自增树的性质,势必会形成一条链,当然Splay可以靠不断提到根优化,自增树中也可以在返回时随机旋转(即堆权值相等时判断是否旋转的地方随机)做到logn,然后我们访问最右边的节点,它被提到了根,如果堆权值相等不旋转,那么我们在依次访问右数第二个,第三个。。。节点,最后复杂度变成了O(n),如果堆权值相等旋转,我们依次访问右数第二个,第三个。。。节点,然后就变成了一条链,又是O(n)。当然,这也可以靠随机相同权值时的旋转来做到控制深度,对于第n个访问的节点,它要提到根节点的期望访问次数f(n)= f(n-1)+ 0.5;即每N次访问会变成一条链,均摊O(logn)

  从复杂度上来看没什么大问题,但是从功能上来说较之Splay和可持久化Treap有很大差距,不支持拆分合并因为它的旋转不可控(不能一组操作控制树的形态),在常数上肯定大于专业的集合类平衡树(如AVl,SBT),可以作为一种选择方式,来应对不同节点访问量差距大并且访问顺序随机的问题。

  PS:可能复杂度推断有细节错误,但大致比较分析应该是正确的。

原文地址:https://www.cnblogs.com/SymenYang/p/3821208.html