很抱歉问题描述不够清晰。

我有一个由长度组成的数组 $N$ 由...组成的 $K$ 线性子数组。我们将线性子数组定义为数组的连续子数组 $[l,r]$ 在哪里 $A[i]-A[i-1] = C$, ,一个常数,对于所有 $l<i<=r$. 。(笔记: $C$ 不同的子数组可能不同;数组的元素是整数。)请注意,线性子数组 不相交 (任何一对相邻的线性子数组之间都有一个元素交集)。例如,[1,3,5,4,3,2] 有两个线性子数组:[1,3,5] 和 [5,4,3,2]。[1,3,5,1,2,3] 将有三个:[1,3,5]、[5,1]、[1,2,3]。

我希望找到小于查询值的最大值的多个查询 $V$, , 在 $o(K)$$o(N)$ 每次查询的时间,其中 $o(K^2)$$o(N)$ 预处理。(假设数组已经存储在 K 线性子数组,也许用常数表示 C 以及每个子数组的长度,并且子数组是有序的。因此,您将获得包含所有线性子数组的起点和终点的数组,以及线性常数 C, ,如前所述。因此,一开始就不需要导出线性子数组。)否则,我们将不胜感激(无论是正式的还是非正式的)证明不可能这样做的证明。

当然,平衡二叉搜索树(BBST)或者简单的排序就可以达到目的,但是需要 $O(NlogN)$ 预处理,这太多了。检查每个子数组中的最大有效值需要 $O(K)$ 每个查询,这又太多了。也许有可能将这两者结合起来吗?

随机算法是可以的,只要它们总是能获得正确的答案并且在平均情况下工作得足够快,尽管确定性算法是首选。

感谢您的所有回复。我想知道这个问题是否有任何研究?这似乎不是一个太晦涩的话题,但不幸的是我的搜索能力还不够。

编辑:一个看起来很有用的方法。

这是我提出问题后的想法;我想知道这是否会有帮助。它也使用了模的思想。初始化 V=0, ,并允许每个线性子数组存储为 L,R;在哪里 L 是子数组的最小值,并且 R 是最大值。当我们收到以下查询时 V, ,我们以某种方式排除了其中的元素 L>VR<V (也许通过使用多个维度?)补充数据结构存储数组中元素的最小理论差异,类似于 L - V mod c[i]. 。所以本质上,我们现在需要能够在此数据结构上运行范围添加,但是如果任何元素的值变成 <0 或者 >=c[i] 它需要重置(例如如果一个元素在 c[i]=5 时等于 -1,它将被重置为 4;如果具有相同 c[i] 且等于 6 的元素将被重置为 1);并且还运行范围最小查询。

如果能做出这样的数据结构,问题就解决了。麻烦在于模数,因为范围添加和范围最小查询可以使用线段树和惰性传播轻松完成;以及排除某些元素。

有帮助吗?

解决方案

无法保证找到小于查询值的最大值 $V$$o(K)$ 预处理时间 $o(N)$ 时间。

从下面的极端情况中可以很容易地看出这一点。让 $A$ 可以是任意数组 $N$ 整数,由以下组成 $K=N-1$ 线性子数组。

  • 子数组 $A[0], A[1]$$C=A[1]-A[0]$.
  • 子数组 $A[1], A[2]$$C=A[2]-A[1]$.
  • $\cdots$
  • 子数组 $A[N-2], A[N-1]$$C=A[N-1]-A[N-2]$.

$o(N)$ 时间预处理和 $o(K)=o(N)$ 时间处理时,算法甚至无法读取其中的某些数字 $A$ 什么时候 $N$ 足够大。(事实上​​​​,大多数数字 $A$.) 因此,对于某些查询值 $q$, ,算法将无法识别 $q+1$ 出现在 $A$.

(上面的解释可以更加严格,例如,使用对手的形式化方法和明确定义的计算模型。)


看起来更有趣的问题应该是是否存在一种算法 $o(N\log N)$ 预处理和 $o(K)$ 每个查询。或者是否有算法 $o(N)$ 预处理和 $o(K)$ 每个给出的查询 $K=o(N)$. 。无论如何,这听起来像是另一个问题。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top