寻找带边界间隔的最大对子及反向字典序排序前缀的动态数据结构
1. 寻找带边界间隔的最大对子
在字符串处理中,有时需要寻找满足特定间隔条件的最大对子。如果放松对间隔的约束,只要求找到字符串 $S$ 中间隔至少为 $g(|α|)$ 的所有最大对子(其中 $g$ 是一个可以在常数时间内计算的函数),可以使用一种简单的方法。
1.1 初始解决方案
可以使用算法 2,令 $g_1(|α|) = g(|α|)$ 且 $g_2(|α|) = n$。这样能在 $O(n log n + z)$ 的时间内找到所有间隔至少为 $g(|α|)$ 的最大对子,其中 $n$ 是字符串的长度,$z$ 是报告的对子数量。但由于缺少间隔的上界(这里使用了平凡上界 $g_2(|α|) = n$),实际上可以将运行时间降低到 $O(n + z)$。
1.2 简化报告过程
当报告节点 $v$ 及其子节点 $w_1$ 和 $w_2$ 的对子时,由于没有间隔上界,不需要在 $LL(w_2)$ 中搜索第一个元素来与 $LL(w_1)$ 中的当前元素进行配对报告。可以直接从 $LL(w_1)$ 中的当前元素开始,与 $LL(w_2)$ 中的最大(和最小)元素进行配对报告,然后继续与 $LL(w_2)$ 中递减(和递增)的元素进行配对报告,直到间隔小于 $g(|α|)$。然而,仅这种简化并不能降低渐近运行时间,因为检查 $LL(w_1)$ 中的每个元素以及使用 AVL 树跟踪叶列表本身就需要 $Θ(n log n)$ 的时间。
1.3 优化方法
为了降低运行时间,需要避免检查 $LL(w_1)$ 中的每个元素,并找到另一种存储叶列表的方法。可以使用基于堆排序
超级会员免费看
订阅专栏 解锁全文

418

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



