Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 双移动窗口算法_Algorithm - Fatal编程技术网

Algorithm 双移动窗口算法

Algorithm 双移动窗口算法,algorithm,Algorithm,假设我有一个n整数数组,m,每个整数都是从[x,y]范围内随机选择的 我还有两个固定大小的窗口[a,b]和[c,d]。窗口遵循以下规则: d-ab 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,没有一种解决方

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

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

  • d-a
    即窗口的总范围小于
    [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
的一个元素落在两个窗口之间

我一直在考虑实施某种描述的黄金分割搜索,以找到最佳解决方案,但我很有可能在这里找到一些显而易见的东西


任何想法都将不胜感激

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

< p>给定任何解,你总是可以向右推到两个窗口中的一个最左边的边接触一个点。因此,可能的解决方案从点上最左侧的窗口开始,或者从点的固定偏移开始,因为右侧窗口位于点上


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

回答得好,但你没有从正确的角度看待问题;我不想验证元素是否适合给定的窗口,我正在寻找一种算法来找到窗口本身。我明白了。然后可以调整这个算法:如果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这可能应该与合并。