定理:这个问题的每个确定性算法在最坏的情况下探测Ω(log 2 n) 个内存位置。
证明(以更正式的方式完全重写):
令 k > 0 为奇数且令 n = k 2。我们描述了一个强制 (log 2 (k + 1)) 2 = Ω(log 2 n) 探测的对手。
我们称相同元素的最大子序列为组。对手的可能输入由 k 个长度为 k 的段x 1 x 2 … x k组成。对于每个段 x j,存在一个整数 b j ∈ [0, k],使得 x j由j - 1的 b j个副本和 j 的 k - b j个副本组成。每组最多重叠两个段,每个段最多重叠两个组。
Group boundaries
| | | | |
0 0 1 1 1 2 2 3 3
| | | |
Segment boundaries
只要增加了两个,我们就按照惯例假设一个双边界。
Group boundaries
| || | |
0 0 0 2 2 2 2 3 3
声明:第 j个组边界 (1 ≤ j ≤ k) 的位置由段 x j唯一确定。
证明:就在第 ((j - 1) k + b j )个内存位置之后,并且 x j唯一确定 b j。//
我们说该算法已经观察到第 j个组边界,以防它对 x j 的探测结果唯一地确定 x j。按照惯例,总是观察输入的开始和结束。该算法可以在不观察组边界的情况下唯一确定组边界的位置。
Group boundaries
| X | | |
0 0 ? 1 2 2 3 3 3
| | | |
Segment boundaries
仅给定 0 0 ?,算法无法确定是否 ? 是 0 还是 1。然而,在上下文中,?必须是 1,否则会有三个奇数组,并且可以推断 X 处的组边界。这些推论对于对手来说可能是有问题的,但事实证明,只有在所讨论的群体边界“不相关”之后才能做出这些推论。
声明:在算法执行期间的任何给定点,考虑它观察到的组边界集。恰好一对连续的对处于奇数距离,奇数组位于它们之间。
证明:每隔一个连续的对只限制偶数组。//
将由特殊连续对限定的奇数长度子序列定义为相关子序列。
声明:相关子序列内部没有唯一确定的组边界。如果存在至少一个这样的边界,则奇数组的身份不是唯一确定的。
证明:不失一般性,假设不在相关子序列中的每个内存位置都已被探测过,并且相关子序列中包含的每个段恰好有一个未被探测过的位置。假设第 j个组边界(称为 B)位于相关子序列的内部。根据假设,对 x j的探测可以确定 B 的位置,最多有两个连续的可能性。我们称距左侧观察边界奇数距离的一个为奇数左,另一个为奇数右. 对于这两种可能性,我们从左到右工作并固定每个剩余内部组边界的位置,以便其左侧的组是偶数。(我们可以这样做,因为它们每个都有两个连续的可能性。)如果 B 在奇数左边,那么它左边的组就是唯一的奇数组。如果 B 在右奇数,则相关子序列中的最后一个组是唯一奇数组。两者都是有效输入,因此该算法既没有唯一确定 B 的位置,也没有唯一确定奇数组。//
例子:
Observed group boundaries; relevant subsequence marked by […]
[ ] |
0 0 Y 1 1 Z 2 3 3
| | | |
Segment boundaries
Possibility #1: Y=0, Z=2
Possibility #2: Y=1, Z=2
Possibility #3: Y=1, Z=1
由于这种说法,算法,无论它如何工作,都必须将相关子序列缩小到一组。根据定义,它因此必须遵守一些群体边界。对手现在的简单任务是尽可能多地保持开放。
在算法执行期间的任何给定时间点,攻击者在内部致力于为相关子序列之外的每个内存位置提供一种可能性。一开始,相关子序列是整个输入,因此没有初始承诺。每当算法探测到 x j的未提交位置时,攻击者必须提交以下两个值之一:j - 1 或 j。如果它可以避免让第 j个边界被观察,它会选择一个值,该值至少留下剩余可能性的一半(相对于观察)。否则,它选择将至少一半的组保持在相关间隔中,并为其他组提交值。
这样,对手强制算法至少观察 log 2 (k + 1) 个组边界,并且在观察第 j个组边界时,强制算法至少进行 log 2 (k + 1) 个探测。
扩展:
该结果通过随机化输入直接扩展到随机算法,将“最多减半”(从算法的角度来看)替换为“期望最多减半”,并应用标准浓度不等式。
它还扩展到没有组可以大于 s 个副本的情况;在这种情况下,下限是Ω(log n log s)。