Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm (集合)集合列表(笛卡尔积)来自对应于列表集合的图形_Algorithm_Graph_Set - Fatal编程技术网

Algorithm (集合)集合列表(笛卡尔积)来自对应于列表集合的图形

Algorithm (集合)集合列表(笛卡尔积)来自对应于列表集合的图形,algorithm,graph,set,Algorithm,Graph,Set,列表集(A): 其中a、b、c、d、e和f是项目(不一定是单词中的字符), 可以作为有向无环图进行分解(DAG,B,所有边从左到右指向): 或作为4组项目(C,称为轴)的笛卡尔乘积: Guava有一个从集合列表(C)生成集合列表(a)的好方法 我正在尝试一种算法,它接受像B这样的图形,并返回像C这样的轴列表(实际上是一个或多个,请参见下面的示例),可以与上面的方法一起使用,以生成像a这样的列表集 但是,不能保证列表集是笛卡尔乘积。例如: {[a,b,d,f], -missing- [a,b,

列表集(A):

其中a、b、c、d、e和f是项目(不一定是单词中的字符), 可以作为有向无环图进行分解(DAG,B,所有边从左到右指向):

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

Guava有一个从集合列表(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
这些列表应该有一定程度的相关性(想想:一个非常大的笛卡尔乘积的随机样本)

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

有没有一种算法可以做到这一点,而我只是没有用谷歌搜索到正确的术语?如果没有,我们可以创建它吗

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


注:我不认为这是相同的,但可能有一些重叠。

如果我正确理解你的问题,你在(A)之后,只想(C)作为中间步骤。通过图形生成,例如-这将生成列表集(A)。如果此时您仍然需要笛卡尔积(即,如果您不只是生成笛卡尔积作为生成(A)的中间步骤),那么从(A)生成笛卡尔积要比从(B)生成笛卡尔积容易得多。

有图形库(我在这里考虑的是jgrapht,但可能还有其他图形库),你有没有试过戳他们,看看他们有什么东西在接近吗?“我熟悉JGrOCT,它没有这样的算法。我会把这些列表看作单词,并试图找出最长的常见后缀。你有什么理由不想直接生成一组列表吗?也许是DAG源的BFS。(我假设这是一个DAG?)工作,每次到达新边界时检查分支?图中可能有多个Integer.MAX_值路径,因此生成完整的路径既不可行也不可能。我希望轴能够对通过图的路径进行平衡采样(…在这种情况下可能会随机移动它…但尝试一种算法会很有趣)@Jon如果你想要均匀的随机样本,有一个线性时间算法来计算每个顶点的路径数,还有另一个线性时间算法来使用这些计数来提取样本。这不是一个复杂的算法,但我现在没有时间正确地写出来。路径计数算法的描述感谢@Davidisenstat和#Zim-ZamO'Pootertoot。我吸收了这些想法。然而,我意识到要得到B,我需要知道A,这意味着确定C(正如sgpc所指出的)基本上是多余的;因为C是表达A或B的节省空间的方法。我意识到我真的需要从C开始,事实上许多可能相交的笛卡尔集,并以这样一种方式进行细化,使得余数不相交。我想我已经解决了这个问题,但它没有回答这个问题。如果有人问这样的问题(我希望看到另一个需要它的问题!)我很乐意回答。
  b-->d
 / \   \
a   \   f
 \   \ /
  c-->e
{a}*{b}*{d,e}*{f}    and    {a}*{c}*{e}*{f}
      d
     / \
a-->b   f            and     a-->c-->e-->f 
     \ /
      e