一组清单(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相同,但可能会有一些重叠。
答案 0 :(得分:1)
如果我正确理解你的问题,你就是在(A)之后,只想要(C)作为中间步骤。使用例如图表生成shortest paths。 Dijkstra's algorithm - 这将生成一组列表(A)。如果此时仍然需要笛卡尔积(即如果你不仅仅生成笛卡尔积作为生成(A)的中间步骤)那么从(A)生成它比从(B)生成它要容易得多。 / p>