【问题标题】:Double moving window algorithm双移动窗口算法
【发布时间】:2011-08-23 14:51:27
【问题描述】:

假设我有一个n 整数数组m,每个数组都是从[x,y] 范围内随机选择的。

我还有两个固定大小的窗口[a,b][c,d]。窗口遵循以下规则:

  • d-a < y-x 即窗口总范围小于[x,y];
  • c > b
  • c-b = const 即两个窗口始终保持固定距离。

从任意窗口位置开始,谁能想到一个好的算法来确定两个窗口是否可以移动,使得m的所有元素都包含在窗口内?

这里有一些例子:

a) 设m = { 20, 21, 23, 25, 26, 27, 28 },两个窗口的大小都是4,c-b = 2。这里有一个解决方案,a = 20, b = 23, c = 25, d = 28

b) 使用相同的m,但使用c-b = 3,没有一种解决方案不会导致m 的一个元素落在两个窗口之间。

我正在考虑对某些描述进行黄金分割搜索以找到最佳解决方案,但我很有可能在这里完成一些显而易见的任务。

任何想法将不胜感激!

【问题讨论】:

标签: algorithm


【解决方案1】:

对元素进行排序。你得到排序列表 x1,x2,...,xm,其中 x1 是最小的。对于每个 i 检查 (x{i+1} - xi) 是否大于 c-b。如果是,检查(xi-x1)是否小于b-a,(xm-x{i+1})是否小于d-c,(xm-x1)是否小于d-a。如果所有这些条件都成立,则存在第一个窗口覆盖 x1 .. xi 而第二个窗口覆盖 x{i+1}...xm 的解决方案。它仍然找到 xi 和 x_{i+1} 之间间隙的确切位置。让间隙从 g=min(xi+(b-a), x{i+1}-(c-b)) 开始,到 g'=g+(c-b) 结束。那么 g >= xi, g'= xi-x1 和 d-g' >= xm-x{i+1}。

【讨论】:

  • 很好的答案,但你没有从正确的角度看待问题;我不想验证元素是否适合给定窗口,我正在寻找一种算法来查找窗口本身。
  • 我明白了。然后你可以调整这个算法:如果 c-b 的条件成立,则窗口是 (xi-x1) 和 (xm-x{i+1})。挑选最好的。
  • 对不起,我显然没有很好地解释自己!对于任何一组元素,窗口约束都是已知的,即 b-a、c-b 和 d-c 是恒定的。所以算法需要在给定上述约束的情况下找到 a,b,c,d 的值。
  • 有很多可能的值。你想要所有这些,还是有一个标准来选择哪个是最好的?
  • @Irit 我不认为你的解决方案是正确的:让我们采取 m={1,3,8,10} 和 b-a = 3; c-b =1 和 c-d = 3 然后在 3 和 8 之间你有: 8-3 > b-c , 3-1
【解决方案2】:

对于任何解决方案,您始终可以将其向右轻推,直到两个窗口之一的最左边缘刚好碰到一个点。所以可能的解决方案是从最左边的窗口开始在一个点上,或者从一个点的固定偏移开始,因为右边的窗口在一个点上。

因此,您可以从最左边的解决方案开始,并确定窗口边界应该在哪里。如果是一场比赛,你就完成了。如果没有,请将窗口向右滑动到下一个可能的解决方案并检查。每张这样的幻灯片都会花费您移动指针并注意它们何时穿过一个点的位置的努力。每个点只能看到每个指针一次,因此总成本应该与点数成线性关系 - 如果它们是按排序顺序给出的,或者如果它们不是按顺序给出的排序这些点的 n log n 成本。

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2011-03-06
    • 2011-05-06
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多