【发布时间】:2010-05-30 10:57:14
【问题描述】:
首先,我是一个 Java 初学者,所以我不确定这是否可能!基本上我有一个巨大的(3+百万)关系数据数据源(即A是B+C+D的朋友,B是D+G+Z的朋友(但不是A - 即不互惠的)等),我想要在这个(不一定是连接的)有向图中找到每个循环。
我找到了线程 Finding all cycles in graph,它让我看到了 Donald Johnson 的(基本)循环查找算法,至少从表面上看,它看起来可以满足我的需求(我将等我周二回来上班的时候试试看——我觉得在这期间问问也无妨!)。
我快速浏览了 Johnson 算法的 Java 实现代码(在那个线程中),看起来关系矩阵是第一步,所以我想我的问题是:
a) Java 是否能够处理 3+million*3+million 矩阵? (计划用二元稀疏矩阵表示 A-friends-with-B)
b) 我需要找到每个连通子图作为我的第一个问题,还是循环查找算法会处理不相交的数据?
c) 这实际上是解决问题的合适方法吗?我对“基本”周期的理解是,在下图中,不是选择 A-B-C-D-E-F,而是选择 A-B-F、B-C-D 等,但这并不是任务的世界末日。
E
/ \
D---F
/ \ / \
C---B---A
d) 如有必要,我可以通过加强关系中的相互关系来简化问题 - 即 A-friends-with-B B-friends-with-A,如果真的有必要,我可以减少数据大小,但实际上它总是在 100 万左右。
z) 这是 P 任务还是 NP 任务?!我是不是咬得比咀嚼的多?
谢谢大家,感谢任何帮助! 安迪
【问题讨论】:
-
如果你想找到每个循环,那么它肯定不是P,因为对于一个完整的图你有超过n!循环。另一方面,如果您只想计算周期(不输出它们),那么它就是 P(因此 NP - P 也是 NP 的子集)。
-
那么你想找到每个顶点的子集,其中每个子集中的每个人都是该子集中的其他人的朋友吗?因为这个问题被称为最大集团:en.wikipedia.org/wiki/Maximal_clique#Definitions
-
@Tomer:你确定,在无向图中计算基本圆的问题在 P 中吗?
-
@jpalecek:不,实际上。我可能对最多计算长度为 k 的 所有 个周期感到困惑。
-
@Andy:从问题的 c) 点来看,您似乎可以在没有真正找到所有周期的情况下生活。因此,发现所有周期似乎是您实际潜在问题的解决方案,而不是问题本身。也许您可以描述问题所在(如果可能的话)。也许这里的人们可以找到您没有考虑过的替代方案...
标签: java math graph sparse-matrix discrete-mathematics