我无法选择正确的标题,但我想要解决的难题是:
arr = [187, 220, 245, 265, 278, 321, 346, 360, 391, 407, 443, 492, 533, 557, 613, 652]
拼图:我的长度为L,我想确保此数组满足L的条件
window = arr[j] - arr[i]
if window <= L
其中window是此数组的两个值之间的任何可能距离,为此,我将必须具有i(开始元素),j(最后一个元素),并合理滑动它们以覆盖所有可能的组合。它应该是因为数组已排序。
例如,这是我尝试解决的问题:
i = 0, j = -1 # initial values of i and j in python for first and last
i = 0, j = -1 # iteration 0 if(iter % 4 == 0): nothing
i = 1, j = -1 # iteration 1 if(iter % 4 == 1): i+=1
i = 0, j = -2 # iteration 2 if(iter % 4 == 2): i-=1; j-=1
i = 1, j = -2 # iteration 3 if(iter % 4 == 3): i+=1;
i = 2, j = -2 # iteration 4 ;;
i = 1, j = -3 # iteration 5 ;;
i = 2, j = -3 # iteration 6 ;;
i = 3, j = -3 # iteration 7 ;;
我在这里没有找到特定的模式,我认为有更好的方法来解决此问题。我真的觉得有一个流行的算法可以解决这个问题,但是由于某种原因,我完全忘记了它。
编辑:
要澄清的是,这些是非常长的字符串(DNA)中字符串模式的起始索引,我想在这里找到的是:
在长度L 的窗口中出现多次(t)的长字符串中的字符串模式。我忘了提到每张幻灯片都会导致模式频率降低,这意味着arr的长度变为arr-1,因此我们必须检查len(arr)是否仍然
示例:
当L = 500时,频率= 16(len(arr)),并且t = 14(已设置),freq> t?是的,那么我们会看到arr [-1]-arr [0] = 465,这是<500。是的!
但是,当L = 400时,频率= 16,而t = 14,则arr [-1]-arr [0] = 465,即>400。错误!
我们再次尝试使用arr [-2]-arr [0] = 426,但仍然freq = 16> t = 14
我们用arr [-1]-arr [1] = 448再试一次,仍然freq = 16> t = 14
我们用arr [-2]-arr [1] = 393再试一次,对吗?不,freq = 14 == t = 14
我们返回false
答案 0 :(得分:0)
通过使用zip
,您可以实现两种长度小于L(= 50)的点之间的距离组合。
In [11]: [(x,y) for x, y in zip (arr, arr[1:]) if x - y <= 50 ]
Out[11]:
[(187, 204),
(204, 245),
(245, 265),
(265, 278),
(278, 321),
(321, 346),
(346, 360),
(360, 391),
(391, 407),
(407, 443),
(443, 492),
(492, 533),
(533, 557),
(557, 613),
(613, 652)]
In [12]: