减少比较相邻子数组的时间复杂度?

时间:2018-11-19 23:59:20

标签: python-3.x

所以说我有一个这样的列表序列。

我要删除所有总和= N和/或具有和的子数组且总和= N的所有序列。

例如,如果N = 4,则(1,1,2)无效,因为其总数为4。(1,1,3)也是无效的,因为(1,3)也是4。 (1,3,1)出于同样的原因也无效。

lst = [ 
    (1,1,1), (1,1,2), (1,1,3), 
    (1,2,1), (1,2,2), (1,2,3), 
    (1,3,1), (1,3,2), (1,3,3), 
    (2,1,1), (2,1,2), (2,1,3), 
    (2,2,1), (2,2,2), (2,2,3), 
    (2,3,1), (2,3,2), (2,3,3), 
    (3,1,1), (3,1,2), (3,1,3), 
    (3,2,1), (3,2,2), (3,2,3), 
    (3,3,1), (3,3,2), (3,3,3) 
] 

例如

Input: 4 3
Output: 2 1 2

所以我现在拥有的是

lst = [t for t in list(product(range(1,n),repeat=n-1)) if not any((sum(t[l:h+1]) % n == 0) for l, h in combinations(range(len(t)), 2))]

如果我没记错的话,它目前在O(n 2 )中。有什么更好的方法?

1 个答案:

答案 0 :(得分:0)

如果可以使用numpy,则可以将每个元组的总和与相邻的值之和连接起来,然后检查是否有任何resultign元素等于4:

arr = np.array(lst)
arr[~(np.concatenate((np.sum(arr,axis=1).reshape(-1,1),
                      (arr[:,:-1]+ arr[:,1:])),axis=1) == 4).any(1)]
# or:
arr[(np.concatenate((np.sum(arr,axis=1).reshape(-1,1),
                      (arr[:,:-1]+ arr[:,1:])),axis=1) != 4).all(1)]

返回:

array([[1, 1, 1],
       [1, 2, 3],
       [2, 1, 2],
       [2, 3, 2],
       [2, 3, 3],
       [3, 2, 1],
       [3, 2, 3],
       [3, 3, 2],
       [3, 3, 3]])