我正在寻找一种中途有效的算法,在给定输入集的情况下,该算法从中生成所有总预序关系(或者,等效地,所有弱订单)。你也可以称之为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答案 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)))
进行调用。