计算数组的相邻幂集
Calculate Adjacent Powerset of an array
互联网 full of powerset algorithms.
但在我的例子中,我只需要相邻部分的幂集。
例如。来自:[1, 2, 3]
,我需要得到:
adjacentPowerset([1, 2, 3]) = [[1, 2, 3], [1, 2], [2, 3], [1], [2], [3]];
// Without [1, 3]
我正在努力实现这个...
非常感谢功能性解决方案(最终递归)。
可以使用滑动windows来解决这个问题:
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
的滑动 window 并复制滑动 [=33] 的内容来生成特定长度 l
的所有子数组=] 到结果,同时在数组上移动。
递归求解在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]]
非空范围看起来像 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]]
互联网 full of powerset algorithms.
但在我的例子中,我只需要相邻部分的幂集。
例如。来自:[1, 2, 3]
,我需要得到:
adjacentPowerset([1, 2, 3]) = [[1, 2, 3], [1, 2], [2, 3], [1], [2], [3]];
// Without [1, 3]
我正在努力实现这个...
非常感谢功能性解决方案(最终递归)。
可以使用滑动windows来解决这个问题:
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
的滑动 window 并复制滑动 [=33] 的内容来生成特定长度 l
的所有子数组=] 到结果,同时在数组上移动。
递归求解在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]]
非空范围看起来像 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]]