高效计数的数据结构:简洁动态基数树与整数表示
1 简洁动态基数树操作
1.1 树操作基础
在基数树操作中,DFUDS 序列 $D_{\tau}$ 包含 $2·|\tau|$ 个平衡括号。树 $\tau$ 上的 parent、child、degree、subtree - size 和 is - ancestor 等操作,可通过 $D_{\tau}$ 上的平衡括号操作以及 rank/select 操作来实现。preorder 操作同样可借助 $D_{\tau}$ 上的平衡括号操作和 rank/select 操作达成。插入和删除叶子节点对应着插入和删除括号对 “()”。
1.2 微树的边标签
设 $L_{\tau}$ 是按 DFUDS 顺序包含 $\tau$ 所有边标签的序列。执行 label - child($\alpha$) 操作时,需先找出 $\alpha$ 在当前节点及其子节点所有边标签中的排名 $i$,再使用 child($i$)。为找到 $i$,要先计算当前节点之前 $\alpha$ 的数量,然后利用 $D_{\tau}$ 和 $L_{\tau}$ 上的 rank/select 结构找到下一个 $\alpha$ 的位置。执行 insert - leaf($\alpha$) 操作时,同样需要找到 $i$ 以插入标签。若所有边标签中不存在 $\alpha$,则需要更多信息。为此,为每个内部节点下方的所有边标签构建动态前驱结构。
$L_{\tau}$ 由连续子序列 $s_i$($i = 1 · · · I_{\tau}$)组成,其中 $s_i$ 按前序表示 $\tau$ 的第 $i$ 个内部节点下方的所有标签,且 $|s_i| ≤
超级会员免费看
订阅专栏 解锁全文
9

被折叠的 条评论
为什么被折叠?



