Loading

《浅谈 Splay 与 Treap 的性质及其应用》学习笔记

屎一样的一年还有两天就过去了呢。

听说要期末考,日了狗了。

感觉都阳了一周了还是没有回复到正常状态,真的挺讨厌的。今天随便找了篇论文假学习了一会儿。

由于懒,所以大量内容属摘抄。

《浅谈Splay与Treap的性质及其应用》学习笔记

1 Splay

2 Treap

2.1 节点深度

考虑每个节点 \(i\) 在什么情况下会成为节点 \(x\) 的祖先。当 \(i\)\(x\) 的祖先时,说明在 \(i\)\(x\) 之间的节点的优先级都小于 \(i\) 。因此节点 \(x\) 的期望深度为

\[1+\sum_{i=1}^{x-1}\frac{1}{x-i}+\sum_{i=x+1}^{n}\frac{1}{i-x}=O(\log n) \]

finger search 指的就是在数据结构中从某些特定的节点(也就是“finger”)开始查找
其他元素。

\(d(x,y)\) 表示两个元素 \(x,y\) 在集合中的排名之差。

下说明 \(\mathbf{finger search}\) 的复杂度为 \(polyd(x,y)\)

定理 3.1 (Dynamic Finger Theorem). 在一棵 \(n\) 个节点上的 Splay 上进行 \(m\) 次的插入、删除或
者查找操作的总时间为 \(O(n+m+\sum_{i=1}^{m}\log(d_i+1)\)。其中 \(d_i\) 表示第 \(i\) 次操作的元素与第 \(i−1\) 次操作的元素在该操作时的排名之差。第 \(0\) 次操作的元素可以视为初始的根节点。

论文原作者说他也不会证明。。。

定理 3.2. 两个元素 \(x,y\) 在 Treap 上的路径长度是期望 \(O(\log(d(x,y)+1))\) 的。

证明和 2.1 的证明很像。

丢一个截图,明天再看。

3.3 应用

3.3.1 启发式合并

对于Splay,只需要把较小的一棵Splay中的元素按升序/降序的顺序中插入到另一棵Splay中。

对于Treap,同样把较小的一棵Treap中的元素按升序/降序的顺序插入到另一棵Treap中,每次插入时从上一个插入的位置开始进行一次 \(\mathbf{finger}\) \(\mathbf{search}\),找到新元素应插入的位置。具体实现时可以自顶向下地实现,这样就不需要记录每个节点的父指针。(ps 这里没太搞懂怎么不记父亲)

假设合并的两棵平衡树大小分别为 \(n,m(n\ge m)\)。那么这样合并时,除了第一次插入的耗时为 \(O(\log n)\) 外,其余插入的总耗时为 \(O(\sum_{i=2}^{m}\log (d_i+1))\)

由于 \(\log\) 是凸函数,最坏情况为所有 \(d_i\) 相等,即 \(d_i=\dfrac{n}{m}\)。因此一次合并的复杂度就是 \(O(m\log \dfrac{n}{m})\)

那对于一个元素,假设其在合并过程中的集合大小是 \(s_1,s_2,\dots,d_k\),那么合并其的复杂度也就是 \(O(\sum_{i=2}^{k}\log \dfrac{s_{i}}{s_{i-1}})=O(\log n)\)

总的复杂度也就是 \(O(n\log n)\)

ps:实际实现不用 finger search 毫无差异,但是比 set.insert() 要快多了。

3.3.2 维护答辩序列

我可能还是没太看懂treap快速分裂合并那个部分。

https://loj.ac/p/2506

4 带权二叉树

额...不懂这一部分是干什么的?这个带权的意义不大啊。

4.4 多层嵌套问题

没太看懂嵌套了什么地方?树剖不就是树剖吗?

https://uoj.ac/problem/173

等我做会了这道题再来看看。

4.5 LCT

狗都不学。

posted @ 2022-12-30 15:40  Semsue  阅读(136)  评论(0编辑  收藏  举报
Title