互联网是full of powerset algorithms。
但就我而言,我只需要相邻部分的电源。
EG。来自:[1, 2, 3]
,我需要得到:
adjacentPowerset([1, 2, 3]) = [[1, 2, 3], [1, 2], [2, 3], [1], [2], [3]];
// Without [1, 3]
我正在努力实现这一目标......
非常感谢功能性解决方案(最终递归)。
答案 0 :(得分:2)
您可以使用滑动窗口来解决此问题:
python代码:
def adjacent_powerset(arr):
result = []
#loop over all possible lengths of subarrays
for i in range(1, len(arr) + 1):
#loop over all possible starting indices of subarrays of length i
for j in range(1, len(arr) - i + 1):
#store subarray at position j with length i in the powerset
result.append(arr[j:j+i])
return result
试验运行:
print adjacent_powerset([1, 2, 3, 4])
产生
[[1],[2],[3],[4],[1,2],[2,3],[3,4],[1,2,3],[2,3] ,4],[1,2,3,4]]
如果您更喜欢从最大到最小子集的订单,则必须替换此行:
for i in range(1, len(arr) + 1):
通过
for i in range(len(arr) , 0, -1):
基本思想是可以使用长度为l
的滑动窗口生成特定长度l
的所有子阵列,并将滑动窗口的内容复制到结果中,同时移动到阵列。
答案 1 :(得分:2)
Python中的递归解决方案 -
st = set()
arr = [1, 2, 3]
res = list()
def power_set(i, j):
if i == j:
return
if (i, j) not in st:
res.append(arr[i : j])
power_set(i, j - 1)
power_set(i + 1, j)
st.add((i, j))
power_set(0, len(arr))
print(res)
输出 -
[[1, 2, 3], [1, 2], [1], [2], [2, 3], [3]]
答案 2 :(得分:1)
非空范围看起来像xs[i:j]
i<j
。
您可以使用嵌套循环:
def adj_powerset(xs):
for i in xrange(len(xs)):
for j in xrange(i, len(xs)):
yield xs[i:j+1]
print list(adj_powerset([1, 2, 3]))
输出:
[[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]