假设我有一组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
的一个元素落在两个窗口之间。
我正在考虑实施一些描述的黄金分割搜索,以找到最佳解决方案,但我很有可能在这里做一些显而易见的事情。
任何想法都会非常感激!
答案 0 :(得分: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&gt; = xi,g'&lt; = x {i + 1},g-a> = xi-x1和d-g'> = xm-x {i + 1}。
答案 1 :(得分:0)
给定任何解决方案,您可以始终将其向右轻推,直到两个窗口中的一个窗口的最左边接触一个点。所以可能的解决方案从一个点上最左边的窗口开始,或者从一个点的固定偏移开始,因为右边的窗口在一个点上。
因此,您可以从最左边的解决方案开始,找出窗口边界应该在哪里。如果是匹配,那就完成了。如果没有,请将窗口向右滑动到下一个可能的解决方案并检查。每个这样的幻灯片都会花费您移动指针的注意力,并指出它们何时越过一个点的位置。每个点只能看到每个指针一次,因此总成本应该是点数的线性 - 如果它们是按排序顺序给出的,或者是n log n排序这些点的成本,如果它们不是。