假设我们有两个长度相等的整数数组a_1, ..., a_n
和b_1, ..., b_n
。对于具有i
的任何给定索引对j
和1<=i<j<=n
,我们需要找到具有a_k, ..., a_{l-1}, b_l, ..., b_{j-i+k}
的{{1}}形式的任何序列的最小分数0<=k<=n-j+i
可以是l
,即该序列完全来自数组j-i+k+1
。 a
时,序列纯粹来自数组k=0
。
我们希望非常有效地为所有b
和i
对执行此操作。
示例,给出
j
此输入的最大值为2。
有效的方法有效吗?
答案 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))的总成本。
通过重复拆分或注意到附近的窗口共享大量元素,可能有更快的方法。但无论如何,我认为上面提到的二叉树分裂技巧可能会有所帮助!