获取通过条件的所有n对数字组

时间:2016-03-28 16:57:56

标签: algorithm

我有一个列表,其中包含两个数字之间的某些组合:

[1 2] [1 4] [1 6] [3 4] [5 6] [3 6] [2 3] [4 5] [2 5]

现在我想制作3种组合的组,其中每组包含所有六位数,例如:

[1 2] [3 6] [4 5] is valid
[1 4] [2 3] [5 6] is valid
[1 2] [2 3] [5 6] is invalid

订单并不重要。 如何在不使用强制算法的情况下到达所有可能组的列表?

它实施的语言并不重要。可以实现此目的的算法描述就足够了。

3 个答案:

答案 0 :(得分:0)

有一点需要注意的是,您可以从集合{1,2,3,4,5,6}中选择有限多个可能的元素对。具体来说,如果您认为订单相关,则(6P2)= 30,如果不考虑,则选择(6选2)= 15。即使是在这种情况下以立方时间运行的简单“尝试所有三元组”算法也只需要查看最多(30选3)= 4,060三元组,这是一个非常小的数字。我怀疑你在实践中遇到任何问题。

答案 1 :(得分:0)

这是Python中的一个递归函数,它从列表中选择一对数字,然后使用剩余的列表调用自身:

Mask

输出(6个三联体)是:

def pairs(l, picked, ok_pairs):
    n = len(l)
    for a in range(n-1):
        for b in range(a+1,n):
            pair = (l[a],l[b])
            if pair not in ok_pairs:
                continue
            if picked and picked[-1][0] > pair[0]:
                continue
            p = picked+[pair]
            if len(l) > 2:
                pairs([m for i,m in enumerate(l) if i not in [a, b]], p, ok_pairs)
            else:
                print p

ok_pairs = set([(1, 2), (1, 4), (1, 6), (3, 4), (5, 6), (3, 6), (2, 3), (4, 5), (2, 5)])
pairs([1,2,3,4,5,6], [], ok_pairs)

答案 2 :(得分:0)

这是使用Python集算术的版本:

pairs = [(1, 2), (1, 4), (1, 6), (3, 4), (5, 6), (3, 6), (2, 3), (4, 5), (2, 5)]
n = len(pairs)
for i in range(n-2):
    set1 = set(pairs[i])
    for j in range(i+1,n-1):
        set2 = set(pairs[j])
        if set1 & set2:
            continue
        for k in range(j+1,n):
            set3 = set(pairs[k])
            if set1 & set3 or set2 & set3:
                continue
            print pairs[i], pairs[j], pairs[k]

输出结果为:

(1, 2) (3, 4) (5, 6)
(1, 2) (3, 6) (4, 5)
(1, 4) (5, 6) (2, 3)
(1, 4) (3, 6) (2, 5)
(1, 6) (3, 4) (2, 5)
(1, 6) (2, 3) (4, 5)