三阶 Davenport–Schinzel 序列
我们知道, Davenport–Schinzel 序列 (下称 DS 序列) 是刻画一些几何问题的重要对象. 我高一集训队时候的论文大量用到了 DS 序列, 但是当时并不会分析 \(3\) 阶 DS 序列的长度, 现在我们来填这个坑. 本文主要的参考来自 Pankaj K. Agarwal 和 Micha Sharir 的 survey (Davenport–Schinzel Sequences and Their Geometric Applications).
首先让我们回顾一下定义: 对于一个字符集大小为 \(|\Sigma| = n\) 的序列, \(\sigma_1,\dots,\sigma_m\), 其中 \(\sigma_i \neq \sigma_{i+1}\), 且对于任意互异的 \(x,y\in \Sigma\) 的形如 \(x,y,x,y,\dots\) 的子序列, 长度总是不超过 \(s+1\), 那么我们称这个序列是一个 \(\boldsymbol {(n, s)}\) 阶 Davenport–Schinzel 序列, 或写作 \(\mathrm{DS}(n, s)\) 序列. 我们记 \(\lambda_s(n)\) 为最长的 \(\mathrm{DS}(n, s)\) 序列长度.
较为平凡的事实是 \(\lambda_1(n) = n\) 和 \(\lambda_2(n) = 2n-1\), 今天我们的目标是证明 \(\lambda_3(n) = O(n \alpha(n))\). (对此, 最强的结果由 Wellman 和 Pettie 在 2016 年给出, \(\lambda_3(n) = 2n\alpha(n) + O(n)\).)
\(O(n\log n)\)
首先让我们进行一点热身, 证明 \(\lambda_3(n) = O(n\log n)\).
首先让我们取出一个长度为 \(\lambda_3(n)\) 的序列, 再考虑其中出现次数最少的一个字符 \(x\), 根据鸽笼原理, 其出现了至多 \(\frac{\lambda_s(n)}{n}\) 次. 如果我们将其删去, 会得到一个字符集大小为 \(n-1\) 的序列, 但是其不完全是 \(\mathrm{DS}(n-1, 3)\) 序列, 因为原来形如 \(yxy\) 的位置删去 \(x\) 之后就变成了相邻的 \(yy\), 我们要再把这些位置缩掉. 接下来轮到了一个观察: 只有第一个和最后一个 \(x\) 的位置有可能需要这种操作. 这是因为如果中间有一个 \(yxy\) 出现, 再考虑上开头和结尾, 我们就找到了一个子序列 \(xyxyx\), 这和 \(s=3\) 矛盾. 子序列的长度至少是 \(\frac{n-1}{n}\lambda_3(n) - 2\), 我们就有
移项, 得到
显见有 \(\lambda_3(n) = O(n\log n)\). 这一分析已经可以体现出 DS 序列的趣味之处, 但为了得到更好的界, 我们需要进行更细致的结构考察.
\(O(n\alpha (n))\)
分段
对于一个 \(\mathrm{DS}(n, 3)\) 序列, 我们先将其拆分成若干个段, 要求每一段的每个字符出现最多一次. 这里一个重要的观察在于, 序列一定能拆分成 \(2n-1\) 个段! 我们考虑对于每个字符, 在这个字符的第一次出现位置和最后一次出现位置的左边切一刀, 可以证明, 切完这 \(2n\) 刀之后, 得到的任何一段都满足要求. (原因? 读者可自证) 而第一刀和第二刀显然是没用的, 剩下的 \(2n-2\) 刀就切出了 \(2n-1\) 段. 我们记 \(\Psi(m, n)\) 为一个可以分成 \(m\) 段的 \(\mathrm{DS}(n, 3)\) 序列的最长长度.
估界
我们将已有的 \(m\) 个段再划归为 \(b\) 个块, 记第 \(i\) 块包含 \(m_i\) 个段. 将接下来的字符归为两类. 其一被称为块内字符, 顾名思义也就是所有的字符都出现在其中某一块里, 其他的字符称为块间字符. 第 \(i\) 个块的块内字符数量记为 \(n_i\), 块间字符数量记为 \(n^\star\). 接下来, 我们要对这两类字符逐个击破.
块内字符
对于第 \(i\) 块, 我们考虑将所有的块间字符删去, 剩下的序列再合并相邻的相同字符, 就得到了一个包含 \(m_i\) 个段的 \(\mathrm{DS}(n_i,3)\) 序列了. 那么合并相邻字符会发生多少次呢? 合并操作必然跨越不同的段, 所以只会发生 \(m_i- 1\) 次, 因此, 所有块间字符的数量之和就不超过
块间字符的中间
对于一个块间字符 \(x\), 在第 \(i\) 块里, 如果 \(x\) 的第一个字符或最后一个字符均不落在其中, 则称之为中间字符. 我们首先对每个块考察中间字符总共的出现次数. 删去所有其他类型的字符, 仍然只需要合并 \(m_i-1\) 次之后就成为一个 DS 序列, 但注意到由于这一块的两边有每种字符, 所以对于出现了的块间字符, 如果总共有 \(p_i\) 种, 那么我们有接下来的部分构成一个 \(\mathrm{DS}(p_i, 1)\) 序列, 因此这部分数量总共不超过 \(p_i + m_i - 1\). 对所有块求和, 得到长度上界
虽然单个 \(p_i\) 不好分析, 但是注意到我们将 \(p_i\) 求和, 可以看做对于每个块中提取出来的上述序列的拼接, 经过最多 \(b-1\) 次合并之后, 我们又得到了一个 \(\mathrm{DS}(n^\star, 3)\) 序列, 因此刚刚的求和又有上界
块间字符的两端
对于一个块间字符 \(x\), 我们仅保留 \(x\) 第一个出现的块. 由于每个字符都在后面的块出现过, 对于第 \(i\) 个块来说, 记 \(p_i\) 是现在剩余的字符集大小, 那么剩余的部分是一个 \(\mathrm{DS}(p_i, 2)\) 序列. 因此在 \(p_i > 0\) 时候有上界
对于 \(p_i\geq 0\) 有上界
求和得到
最后一块的情况是对称的.
结论
把以上几个部分加起来, 我们就有
Ackermann 函数
定义 Ackermann 函数
我们关心的是它的反函数, 逐行的有
以及对角线上的反函数
我们接下来的推导会用到以下性质:
上界
我们现在已有对于 \(\Psi(m, n)\) 的一个估界:
我们证明, 对于 \(k\geq 2\), 我们有
本文牺牲部分严谨性, 不对 \(o(1)\) 部分做细致处理.
证明的主要思路无非是归纳, 首先我们证明奠基 (\(k=2\)), 对于 \((1)\) 式, 我们取 \(b=2\), 得到不等式
进行 \(\alpha_2(m) = \lceil \lg m\rceil\) 轮带入, 叶子处所有的位置都形如 \(\Psi(1, n^?) = n^?\), 得到
这符合 \(k=2\) 时的情形.
然后对于 \(k>2\) 的情形, 我们取 \(b = \left \lceil\frac{m}{\alpha_{k-1}(m)}\right\rceil\), 这样可以保证每个 \(m_i \leq \alpha_{k-1}(m)\). 因此我们有
经过 \(\alpha_k(m)\) 轮迭代后, 我们就得到了
取 \(k = \alpha(m) + 1\), 我们就得到了
我们已知了 \(m = O(n)\), 因此就有