我无法选择正确的标题,但我想要的是解决这个难题:
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其中,窗口是该数组的两个值之间的任何可能距离,为此,我必须有i (start元素),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)是否仍然< t,如果是,如果没有找到该窗口并返回true,则返回False。
示例:当L= 500,频率= 16 (len(arr)),t= 14 (已经设置)时,,freq>t?是的,那么我们看到arr-1 - arr = 465,也就是< 500.是真的!
当L= 400,频率= 16,t= 14,arR-1-arr= 465,即> 400。假的!
我们再次尝试使用arr -2-arr= 426,仍然是freq=16>t=14。
我们再次尝试使用arr-1 - arr1 = 448,仍然是freq=16>t=14。
我们再试一次arr-2 - arr1 = 393,对吗?不,freq=14 == t=14
我们返回假的
发布于 2018-12-25 15:31:40
通过使用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]:https://stackoverflow.com/questions/53923546
复制相似问题