如何以有效的方式获取长度为2或更长的数组的所有子数组?

时间:2018-06-03 08:03:10

标签: python arrays algorithm sub-array

array =[1,2,3,4]

产生的子阵列应该是......

[1,2],[2,3],[3,4],[1,2,3],[2,3,4],[1,2,3,4]

3 个答案:

答案 0 :(得分:3)

O(N)?也许如果你有无限的记忆与存储的实/虚数系统中的每个可能的子阵列进行有效的访问,那么你可以使用任何你喜欢的复杂算法。

......但实际上,无论你的效率如何,你都在寻找O(n ^ 3)的东西。

>>> [lst[i:j + 1] for i in range(len(lst)) for j in range(i + 1, len(lst))]
[[1, 2], [1, 2, 3], [1, 2, 3, 4], [2, 3], [2, 3, 4], [3, 4]]

一个衬里隐藏了两个循环和切片操作,所有这些都增加了复杂性。但是,它是高效快速,因为基础算法允许它。

答案 1 :(得分:2)

您无法以任何方式获得O(N)的结果 由于2^N - 1 - N子数组的大小为> 1,因此总复杂度为O(2^N),因为你必须获得所有的子阵列 对于O(2^N)解决方案,您可以搜索众所周知的获取power set of a set的问题。

答案 2 :(得分:1)

你总是可以尝试这个itertools.combinations()解决方案来获得长度为2或更大的所有重叠子阵列:

>>> from itertools import combinations
>>> array = [1, 2, 3, 4]
>>> [array[start:end+1] for start, end in combinations(range(len(array)), 2)]
[[1, 2], [1, 2, 3], [1, 2, 3, 4], [2, 3], [2, 3, 4], [3, 4]]