python - Python 中的组合学

标签 python combinatorics directed-acyclic-graphs bipartite

我有一种单层树结构:

alt text

其中 p 是父节点,c 是子节点,b 是假设分支。

我想在只有一个父节点可以分支到只有一个子节点和两个分支的约束下找到分支的所有组合不能共享 parent 和/或 child 。

例如如果 combo 是一组组合:

combo[0] = [b[0], b[3]]
combo[1] = [b[0], b[4]]
combo[2] = [b[1], b[4]]
combo[3] = [b[2], b[3]]

我想就是这些了。 =)

如何在 Python 中自动实现这种结构的任意树,即 p:s、c:s 和 b:s 的数量是任意的。

编辑:

它不是一棵树,而是一棵 bipartite directed acyclic graph

最佳答案

这是一种方法。可以进行很多微优化,但它们的效果取决于所涉及的大小。

import collections as co
import itertools as it

def unique(list_):
    return len(set(list_)) == len(list_)

def get_combos(branches):
    by_parent = co.defaultdict(list)

    for branch in branches:
        by_parent[branch.p].append(branch)

    combos = it.product(*by_parent.values())

    return it.ifilter(lambda x: unique([b.c for b in x]), combos)

我很确定这至少达到了最佳复杂性,因为我看不出有什么方法可以避免查看父级唯一的每个组合。

关于python - Python 中的组合学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095749/

相关文章:

python - 使用 Python 脚本将文件夹从本地系统上传到 FTP

algorithm - 最大化表的总和,其中每个数字必须来自唯一的行和列

graph - Tensorflow图: Are Tensorflow graphs DAG?张量变量中的assignAdd操作会发生什么

julia - 仅生成唯一排列

python - 给定一个节点集,枚举其上的图

c# - 将有向无环图 (DAG) 转换为树

kubernetes - Argo 工作流中的动态 "Fan In"

python - 如何使用pyrebase查询?

python - 将预训练的 word2vec 向量注入(inject) TensorFlow seq2seq

python - 使用 BeautifulSoup 解析一个父级中的多个 href