2013-04-16 50 views
17

鉴于输入数组这个集合/数组操作有没有名字?

和“加入”功能(a,b) => (a+b)

我的代码返回阵列的以下数组,含有通过将连接功能的各种元素对,同时保持获得的每个可能的变化顺序:

[ 
    [a,b,c,d,e], 
    [a,b+c,d,e], 
    [a,b+c+d,e], 
    [a,b,c+d,e], 
    [a+b,c,d,e], 
    [a+b,c+d,e], 
    [a+b+c,d,e], 
    [a+b+c+d,e], 
    [a,b,c,d+e], 
    [a,b+c,d+e], 
    [a,b+c+d+e], 
    [a,b,c+d+e], 
    [a+b,c,d+e], 
    [a+b,c+d+e], 
    [a+b+c,d+e], 
    [a+b+c+d+e], 
] 

在视觉上,我想要做的是这样的:

diagram of ordered partitions

该代码有效,但我不知道该怎么称呼它 - 并且希望使用一个名称,熟悉该操作的其他开发人员将会理解该名称,如果存在这样的名称。这不是一个权力集,但它是类似的...这个特定的集合/数组操作有一个名字吗?

编辑:好的。他们不是排列;排列将全部为不同顺序的5元素阵列[[a,b,c,d,e], [e,d,c,b,a], [a,d,b,c,e], ...]

它们不是分区,因为任何子集只能包含输入的相邻元素。 - 换句话说,分区将允许这样的:

diagram depicting partitions of non-adjacent elements

(这大概源于没有一组有序的概念纯集理论。)

他们不是因为每个元素组合的输出只使用输入集的每个成员一次。

我认为myArray.OrderedPartitions((a,b) => (a+b))可能是一个适当的简洁和解释性的。

+0

GetPermutations? – KingCronus

+1

为什么'[a + b + c + d + e]'缺失? – Landei

+0

@Landei我的错误:)编辑了这个问题,以包括缺失的排列。 –

回答

5

正如mbeckish在评论中说的那样,那些集合(一旦原始集合上的一个订单被固定)同构于依赖于顺序的整数分区,显然通常被称为compositions。每一组都有正确的组成。对于每1kn(n-1) choose (k-1) 元素组合(n-1) choose (k-1)组合k集合,保留您开始使用的集合的顺序。为了使其可视化,请考虑按顺序放置的集合中的元素和按顺序排列的邻居元素之间的空格;把你的例子看作A|B|C|D|E。你会注意到有确切的n-1可能的边界。要创建K组合,您只需要选择k-1这些可能的边框,这可能是也可能不是您生成套组的方式。总结所有(n-1) choose (k-1)k1n然后给我们2 n-1作为可能的组成的数量。

+0

很好的解释。值得补充的是,总和等于'2 ^(n-1)'。 – rliu

+0

@roliu补充说,感谢您的建议! –

+0

他们确实会出现成分。谢谢 :) –

1

[海报的主要编辑使我的回答过时,这是关于发布的原始问题:] 整数序列的在线百科全书简单地提到这些“间隔子集”。 (http://oeis.org/A000124) 我会坚持这一个,这是相当具有描述性的。

+0

我不会说它是描述它在做什么(如果我看到名字我不知道我期望的功能是什么 - 我可以看到这个名字如何适用于很多,但)。 – Chris

5

经过编辑 - 这些都是分区的一个数组(并且它们的计数是2 ^(n-1),因为您可以用joiner(+)替换任何分隔符(冒号))。

注 - 这些是阵列分区,不是设置分区。

+0

它是2 ^(n-1),而不是2^n。 – ElKamina

+0

是的,固定..... – MBo

0

这是一个向树从根节点分之遥:

enter image description here

要注意,你不声明你的套重要的顺序是非常重要的,只是为了保持与各组。在Python代码通过您的 “加盟” 产生你的 “分区”:

A = map(list, list('abcde')) 

def join(A): 
    B = [] 
    for x1,x2 in zip(A,A[1:]): 
     B.append((x1,x2,sorted(list(set(x1+x2))))) 
    return B 
def label(x): 
    return '+'.join(x) 

# Draw the graph with networkx 
import networkx as nx 
G = nx.DiGraph() 

while len(A)>1: 
    B = join(A) 
    for x1,x2,pair in B: 
     print label(x1), label(pair) 
     G.add_edge(label(x1),label(pair)) 
     G.add_edge(label(x2),label(pair)) 
    A = [x[2] for x in B] 

nx.write_dot(G,'test.dot') 

# Render the graph to an image 
import os 
os.system('dot -Tpng test.dot > test.png') 
0

如何myArray.possibleChainings()或myArray.possibleLinkings()?

这个想法是,它看起来像你链接或链接在一起至少 两个要素。我觉得它也很直观,因为你不能链接或链接在一起的不是邻居的元素。

相关问题