(Set)从与列表组对应的图表中的集合(笛卡尔积)的列表

时间:2013-06-17 16:36:31

标签: algorithm graph set

一组清单(A):

{[a,b,d,f],
 [a,c,d,f],
 [a,b,e,f],
 [a,c,e,f]}

其中a,b,c,d,e和f是项目(不一定是单词中的字符), 可以作为有向无环图(DAG,B,所有边缘从左边指向 - >从右到右)被考虑:

  b-->d
 / \ / \
a   X   f
 \ / \ /
  c-->e

或作为4组项目(C,称为轴)的笛卡尔积:

{a} * {b,c} * {d, e} * {f}

Guava有一个很好的method用于从集合列表(C)生成一组列表(A)。

我正在尝试接受像B这样的图形的算法并返回像C这样的轴列表(实际上是一个或多个,见下面的示例),它可以与上面的方法一起使用来生成一组像A这样的列表

但是,无法保证这组列表是笛卡尔积。例如:

{[a,b,d,f],
 -missing-
 [a,b,e,f],
 [a,c,e,f]}

对应DAG:

  b-->d
 / \   \
a   \   f
 \   \ /
  c-->e

不能表示为 1 笛卡尔积,但可以表示为2:

{a}*{b}*{d,e}*{f}    and    {a}*{c}*{e}*{f}

对应图表:

      d
     / \
a-->b   f            and     a-->c-->e-->f 
     \ /
      e

列表应该有一定程度的相关性(想想:一个非常大的笛卡尔积的随机样本)。

注意:不同长度的列表不能共享同一组轴。

是否有算法执行此操作,而我还没有用Google搜索正确的条款?如果没有,我们可以创建吗?

算法的复杂性可能是一个问题,因为该集合可能具有10 ^ 2个列表,并且每个列表可以具有10 ^ 2个项目,即相当大的图形。我可以保证输入图表具有可能表示列表集合的最小节点数量......并且可以滚动连接的非分支节点(a-> c-> e-> f)单个对象(acef)。

PS。我不认为这与Cartesian product of graphs相同,但可能会有一些重叠。

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你就是在(A)之后,只想要(C)作为中间步骤。使用例如图表生成shortest pathsDijkstra's algorithm - 这将生成一组列表(A)。如果此时仍然需要笛卡尔积(即如果你不仅仅生成笛卡尔积作为生成(A)的中间步骤)那么从(A)生成它比从(B)生成它要容易得多。 / p>