如何以有效的方式获取长度为 2 或更长的数组的所有子数组?
How to get all sub arrays of an array of length 2 or more in efficient way?
array =[1,2,3,4]
结果子数组应该是...
[1,2],[2,3],[3,4],[1,2,3],[2,3,4],[1,2,3,4]
O(n)?也许如果你有无限的内存,存储了 real/imaginary 数字系统中的每个可能的子数组以便高效访问,那么当然,你可以有任何你喜欢的复杂算法。
...但实际上,无论您的效率如何,您都在看 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]]
一个衬里隐藏了两个循环和切片操作,所有这些都增加了复杂性。然而,它是高效和快速,正如底层算法所允许的那样。
您无法以任何方式在 O(N
) 中获得结果。
由于有 2^N - 1 - N
个大小 > 1 的子数组,因此总复杂度为 O(2^N)
,因为您必须获取所有子数组。
对于 O(2^N)
解决方案,您可以搜索 well known problem of getting power set of a set
.
您总是可以尝试这个 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]]
array =[1,2,3,4]
结果子数组应该是...
[1,2],[2,3],[3,4],[1,2,3],[2,3,4],[1,2,3,4]
O(n)?也许如果你有无限的内存,存储了 real/imaginary 数字系统中的每个可能的子数组以便高效访问,那么当然,你可以有任何你喜欢的复杂算法。
...但实际上,无论您的效率如何,您都在看 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]]
一个衬里隐藏了两个循环和切片操作,所有这些都增加了复杂性。然而,它是高效和快速,正如底层算法所允许的那样。
您无法以任何方式在 O(N
) 中获得结果。
由于有 2^N - 1 - N
个大小 > 1 的子数组,因此总复杂度为 O(2^N)
,因为您必须获取所有子数组。
对于 O(2^N)
解决方案,您可以搜索 well known problem of getting power set of a set
.
您总是可以尝试这个 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]]