计算阵列的相邻Powerset

时间:2016-05-19 17:24:40

标签: algorithm powerset

互联网是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]

我正在努力实现这一目标......

非常感谢功能性解决方案(最终递归)。

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]]