用于生成大小为n

时间:2015-09-21 11:48:15

标签: algorithm combinatorics partial-ordering oeis

我正在寻找一种中途有效的算法,在给定输入集的情况下,该算法从中生成所有总预序关系(或者,等效地,所有弱订单)。你也可以称之为n标记元素的所有优先安排。

我已经尝试通过首先生成大小为n的所有排列然后通过'〜'来折叠那些的子序列来实现这一点,但由于许多重复,这是非常低效的,我也错过了一些结果。大小由Fubini数字1,1,3,13,75,541,4683,47293,345835 ......(OEIS编号A000670)给出,并且随n快速增长。我只需要前几个,比如说,直到n = 8。

示例:对于A = {a,b,c},n = 3,结果为13个预订器:

< b> c,b> a~c,b> c> a,b~c> a,c> b> a,c> a~b,c> a> b,a~c> b ,a> c> b,a> b~c,a> b> c,a~b> c,a~b~c

1 个答案:

答案 0 :(得分:4)

不太难。在Python 3中:

import itertools

def weakorders(A):
    if not A:  # i.e., A is empty
        yield []
        return
    for k in range(1, len(A) + 1):
        for B in itertools.combinations(A, k):  # i.e., all nonempty subsets B
            for order in weakorders(set(A) - set(B)):
                yield [B] + order

使用例如list(weakorders(range(8)))进行调用。