公平窗口缩小的迭代数组

时间:2018-12-25 15:14:55

标签: python arrays algorithm

我无法选择正确的标题,但我想要解决的难题是:

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

1 个答案:

答案 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]: