滑动窗口中的最小缺失词及其应用
1. Senft算法概述
Ukkonen算法可以在 $O(n)$ 时间内,通过从左到右处理长度为 $n$ 的单词,在线构建恒定大小字母表上的后缀树。为了将其应用于滑动窗口,且每次窗口移动的摊还时间为常数,需要解决两个额外问题:
- 删除窗口最左边的字母 :考虑当前窗口的最长重复前缀。当删除最左边的字母时,所有比这个前缀长的前缀都需要从树中移除,但最长重复前缀和所有更短的前缀将保留在树中。具体操作如下:
- 如果最长重复前缀对应一个显式节点,该节点是要删除的叶子节点的父节点。如果该节点只剩下一个子节点,则删除该节点并合并两条边;否则,不做任何操作。
- 如果最长重复前缀对应一个隐式节点,它等于最长重复后缀。在删除的叶子节点的位置创建一个新的叶子节点,用最长重复后缀的起始位置标记它,并相应地标记其入边。
- 在窗口移动时维护边标签 :假设通过归纳法,所有边标签相对于当前窗口都已正确定位。对于窗口的接下来 $m$ 次移动,仍然保持边标签的相同相对定位。在 $m$ 次移动后,通过自底向上遍历树重新计算边标签。由于 $m$ 次移动最多创建 $2m$ 个节点,每次移动的摊还时间为 $O(1)$。
2. 算法介绍
考虑一个长度为 $n$ 的单词 $y$,其字母表 $\Sigma$ 的大小为 $\sigma$。目标是维护大小为 $m$ 的滑动窗口的最小缺失词(MAWs)集合。即,对于所有连续的 $i \in [0, \ldots, n - m]$,计算 $M_m(i) = M(y[i \ldots i + m - 1])$。
超级会员免费看
订阅专栏 解锁全文
827

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



