【问题标题】:Combinatorics in PythonPython中的组合学
【发布时间】:2010-11-04 20:13:15
【问题描述】:

我有一种单级树结构:

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

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

例如如果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 的数量是任意的。

编辑:

它不是一棵树,而是一棵bipartitedirected acyclic graph

【问题讨论】:

  • 您的图像表明每个父母都可以使用分支到每个孩子。你会这么认为吗?
  • 你是否已经有一个数据结构来表示这个?
  • @dhill - 是吗?父节点 p1 不分支到子 c0。
  • 另外,这不是一棵树,而是一个二分 DAG。
  • @Space_C0wb0y - 现在怎么办?请粘贴维基百科参考或类似内容。 ;) 至于数据结构,将 b 视为具有变量 p 和 c 的对象,如 b[0].p = 0

标签: python combinatorics directed-acyclic-graphs bipartite


【解决方案1】:

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

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)

我很确定这至少达到了最佳复杂性,因为我没有看到避免查看父项唯一的每个组合的方法。

【讨论】:

  • 我认为你的意思是让 get_combos 的 arg 成为分支,否则分支中的分支会抛出异常。
  • @Philip 很好看。固定。
  • 非常感谢,很好的解决方案!
  • branches 是什么意思?什么蟒蛇类型?什么内容?
  • ^ 我现在看到这在 cmets 中得到了解决。不过,最好在答案中说明它。
【解决方案2】:

看看itertools组合生成器:

  • 产品()
  • 排列()
  • 组合()
  • combinations_with_replacement()

看起来你可以编写一个迭代器来实现你想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多