这个set / array操作有名字吗?

时间:2013-04-16 11:28:34

标签: arrays algorithm math powerset set-theory

给定输入数组

[a,b,c,d,e]

和'join'函数(a,b) => (a+b)

我的代码返回以下数组数组,包含通过将join函数应用于各种元素对而获得的每个可能的变体,同时保持顺序:

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

代码可以工作,但我不知道该怎么称呼它 - 并希望使用熟悉此操作的其他开发人员可以理解的名称,如果存在这样的名称。它不是一个电源组,但它是类似的......这个特定的set / array操作有一个名字吗?

编辑:好的。他们不是排列;排列将是不同顺序的{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))可能是一个适当的简洁和解释。

5 个答案:

答案 0 :(得分:5)

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

注意 - 这些是数组分区,而不是设置分区。

答案 1 :(得分:5)

正如mbeckish在评论中所说,这些集合(一旦原始集合上的订单被修复)与依赖于顺序的整数分区同构,这显然通常被称为compositions。每组中恰好有2个 n-1 组合物。对于每个1kn(n-1) choose (k-1)n个元素组成k个组合,保留了集合的顺序你开始了。为了使其可视化,请考虑按顺序放置的集合的元素以及按该顺序作为邻居的元素之间的空间;将您的示例视为A|B|C|D|E。您会注意到有n-1个可能的边界。要创建k-composition,您只需选择k-1这些可能的边框,这可能是也可能不是您生成集合的方式。将(n-1) choose (k-1)的所有k1汇总到n然后将2 n-1 作为可能的合成数量。

答案 2 :(得分:1)

[海报的主要编辑使我的答案过时了,这是关于发布的原始问题:] 整数序列的在线百科全书简要地将这些简称为“间隔子集”。 (http://oeis.org/A000124) 我会坚持使用这个,它具有很强的描述性。

答案 3 :(得分:0)

它是一个指向远离根节点的有向树:

enter image description here

重要的是要注意,您没有声明您的集合的顺序很重要,只有每个集合维护该顺序。用于通过“join”生成“分区”的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')

答案 4 :(得分:0)

myArray.possibleChainings()或myArray.possibleLinkings()怎么样?

这个想法是看起来你至少在链接或链接 两个元素在一起。我发现它也很直观,因为你做不到 链或链接元素在一起,而不是邻居。