在两个数组

时间:2018-01-02 23:37:23

标签: algorithm

假设我们有两个长度相等的整数数组a_1, ..., a_nb_1, ..., b_n。对于具有i的任何给定索引对j1<=i<j<=n,我们需要找到具有a_k, ..., a_{l-1}, b_l, ..., b_{j-i+k}的{​​{1}}形式的任何序列的最小分数0<=k<=n-j+i可以是l,即该序列完全来自数组j-i+k+1a时,序列纯粹来自数组k=0

我们希望非常有效地为所有bi对执行此操作。

示例,给出

j

此输入的最大值为2。

有效的方法有效吗?

1 个答案:

答案 0 :(得分:0)

似乎有可能使蛮力方法运行得相当快。

如果您将每个序列预处理到一个平衡树中,其中每个节点都使用该子树的min进行扩充,那么您可以通过在适当的位置拆分树来找到O(log n)时间内该序列的任何子范围的min。点。有关详细信息,请参阅this paper。请注意,此预处理需要O(n)时间。

让我们将范围(i,j)称为窗口。此问题的复杂性不依赖于特定的(i,j),而是取决于窗口的大小(即j-i + 1)。对于m(= j-i + 1)的窗口大小,存在该大小的n-m + 1个窗口。对于每个窗口,有m + 1个位置,您可以在其中“切割”窗口,以便元素的某些前缀来自序列a,后缀来自序列b。你为每次切割支付O(log n)(如上所述拆分二叉树)。这是 O((n-m + 1)*(m + 1)* log(n))的总成本。

通过重复拆分或注意到附近的窗口共享大量元素,可能有更快的方法。但无论如何,我认为上面提到的二叉树分裂技巧可能会有所帮助!