三阶 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\), 我们就有

\[\frac{n-1}{n}\lambda_3(n) - 2 \leq \lambda_3(n-1), \]

移项, 得到

\[\frac{\lambda_3(n)}{n}\leq \frac{\lambda_3(n-1)}{n-1} + \frac{2}{n-1}, \]

显见有 \(\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\) 次, 因此, 所有块间字符的数量之和就不超过

\[\sum_{i=1}^b (m_i - 1 + \Psi(m_i, n_i)) = m - b + \sum_{i=1}^b \Psi(m_i, n_i). \]

块间字符的中间

对于一个块间字符 \(x\), 在第 \(i\) 块里, 如果 \(x\) 的第一个字符或最后一个字符均不落在其中, 则称之为中间字符. 我们首先对每个块考察中间字符总共的出现次数. 删去所有其他类型的字符, 仍然只需要合并 \(m_i-1\) 次之后就成为一个 DS 序列, 但注意到由于这一块的两边有每种字符, 所以对于出现了的块间字符, 如果总共有 \(p_i\) 种, 那么我们有接下来的部分构成一个 \(\mathrm{DS}(p_i, 1)\) 序列, 因此这部分数量总共不超过 \(p_i + m_i - 1\). 对所有块求和, 得到长度上界

\[m - b + \sum_{i=1}^b p_i. \]

虽然单个 \(p_i\) 不好分析, 但是注意到我们将 \(p_i\) 求和, 可以看做对于每个块中提取出来的上述序列的拼接, 经过最多 \(b-1\) 次合并之后, 我们又得到了一个 \(\mathrm{DS}(n^\star, 3)\) 序列, 因此刚刚的求和又有上界

\[m-1 + \Psi(b, n^\star). \]

块间字符的两端

对于一个块间字符 \(x\), 我们仅保留 \(x\) 第一个出现的块. 由于每个字符都在后面的块出现过, 对于第 \(i\) 个块来说, 记 \(p_i\) 是现在剩余的字符集大小, 那么剩余的部分是一个 \(\mathrm{DS}(p_i, 2)\) 序列. 因此在 \(p_i > 0\) 时候有上界

\[m_i - 1 + 2p_i - 1, \]

对于 \(p_i\geq 0\) 有上界

\[m_i - 1 + 2p_i, \]

求和得到

\[m - b + \sum_{i=1}^b 2p_i = m - b + 2n^\star. \]

最后一块的情况是对称的.

结论

把以上几个部分加起来, 我们就有

\[\begin{align*} \Psi(m, n) &\leq \left(m - b + \sum_{i=1}^b \Psi(m_i, n_i)\right) + \left(m-1 + \Psi(b, n^\star)\right) + 2\left(m - b + 2n^\star\right)\\ &\leq 4m + 4n^\star + \Psi(b, n^\star) + \sum_{i=1}^b \Psi(m_i, n_i). \end{align*} \]

Ackermann 函数

定义 Ackermann 函数

\[A_k(n) = \begin{cases} 2n & n\geq 1, k=1,\\ 2 & n=1, k\geq 2,\\ A_{k-1}(A_k(n-1)) & \mathrm{otherwise}. \end{cases} \]

我们关心的是它的反函数, 逐行的有

\[\alpha_k(n) = \min \{ s\geq 1 \big\arrowvert A_k(s)\geq n \}, \]

以及对角线上的反函数

\[\alpha(n) = \min\{ s\geq 1 \big\arrowvert A_s(s)\geq n \}. \]

我们接下来的推导会用到以下性质:

\[\alpha_{\alpha(n)}(n) = \alpha(n), \quad \alpha_{\alpha(n)+1}(n)\leq 4. \]

上界

我们现在已有对于 \(\Psi(m, n)\) 的一个估界:

\[\Psi(m, n) \leq 4m + 4n^\star + \Psi(b, n^\star) + \sum_{i=1}^b \Psi\left(m_i, n_i\right). \tag{1} \]

我们证明, 对于 \(k\geq 2\), 我们有

\[\Psi(m, n)\leq (4k-4 +o(1))m \alpha_k(m) + (4k-2)n, \]

本文牺牲部分严谨性, 不对 \(o(1)\) 部分做细致处理.

证明的主要思路无非是归纳, 首先我们证明奠基 (\(k=2\)), 对于 \((1)\) 式, 我们取 \(b=2\), 得到不等式

\[\begin{align*} \Psi(m, n) &\leq 4m + 4n^\star + \Psi(2, n^\star) + \Psi \left(\left\lfloor\frac m 2\right\rfloor, n_1\right) + \Psi \left(\left\lceil\frac m 2\right\rceil, n_2\right)\\ &\leq 4m + 6n^\star + \Psi \left(\left\lfloor\frac m 2\right\rfloor, n_1\right) + \Psi \left(\left\lceil\frac m 2\right\rceil, n_2\right), \end{align*} \]

进行 \(\alpha_2(m) = \lceil \lg m\rceil\) 轮带入, 叶子处所有的位置都形如 \(\Psi(1, n^?) = n^?\), 得到

\[\Psi(m, n) \leq 4m \alpha_2(m) + 6n. \]

这符合 \(k=2\) 时的情形.

然后对于 \(k>2\) 的情形, 我们取 \(b = \left \lceil\frac{m}{\alpha_{k-1}(m)}\right\rceil\), 这样可以保证每个 \(m_i \leq \alpha_{k-1}(m)\). 因此我们有

\[\begin{align*} \Psi(m, n) &\leq 4m + 4n^\star + {\color{red} {\Psi(b, n^\star)} } + \sum_{i=1}^b \Psi\left(m_i, n_i\right) \\ &\leq 4m + 4n^\star + {\color{red} {(4k-8 + o(1))b\alpha_{k-1}(b) + (4k-6) n^\star}} + \sum_{i=1}^b \Psi\left(m_i, n_i\right)\\ &\leq (4k-4 + o(1)) m + (4k-2)n^\star + \sum_{i=1}^b \Psi(m_i, n_i), \end{align*} \]

经过 \(\alpha_k(m)\) 轮迭代后, 我们就得到了

\[\Psi(m, n)\leq (4k-4 + o(1)) m \alpha_k(m) + (4k-2)n. \]

\(k = \alpha(m) + 1\), 我们就得到了

\[\Psi(m, n) = O( (n+m) \alpha(m) ). \]

我们已知了 \(m = O(n)\), 因此就有

\[\lambda_3(n) = O(n\alpha(n)). \]

posted @ 2022-05-03 20:25  EntropyIncreaser  阅读(870)  评论(3编辑  收藏  举报