首先,我是一个Java初学者,所以我不确定这是否可能!基本上我有一个巨大的(3 +百万)关系数据的数据源(即A是B + C + D的朋友,B是D + G + Z的朋友(但不是A - 即不成对)等等)我想要找到这个(不一定是连接的)有向图中的每个周期。
我找到了线程Finding all cycles in graph,它向我指出了唐纳德约翰逊的(基本的)循环发现算法,至少从表面上来看,它看起来像我将要做的事情(我是我星期二回到工作岗位时会去尝试 - 认为同时问起来也不会有害!)。
我快速浏览了Johnson算法的Java实现代码(在那个帖子中),看起来像关系矩阵是第一步,所以我想我的问题是:
a)Java是否能够处理3 +百万* 3 +百万的矩阵? (计划通过二进制稀疏矩阵表示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,如果真的有必要,我可以减少数据大小,但实际上它总是在1mil左右。
z)这是P或NP任务吗?!我咬的比我嚼得多吗?
谢谢大家,感谢任何帮助! 安迪
答案 0 :(得分:2)
您正在做的事情类似于数据挖掘中经过深入研究的问题,称为关联规则挖掘或更常见的频繁项集挖掘。通过频繁项集挖掘可以找到的东西比你正在做的更具体,但也更有用。
我们将采用封闭的频繁项目集挖掘,这将做的是找到所有朋友群,每个人都是彼此的朋友。
我现在要说的是,Java不能做你想做的事。它无法加载那么多内存,并且在任何合理的时间内处理数据都不够高效,您将需要使用C / C ++。我建议使用LCM,这是一个封闭的频繁项目集矿工,但由于您拥有的数据量,您还需要设置相当高的支持。
您可能想要考虑的另一件事是阅读大图挖掘,这也是一个相当大的研究领域,但Java不会削减它。此外,您无法找到数据中的所有周期(除非它非常稀疏),其中会有太多的周期。它们也会重叠而且没有意义,你可能能找到的是几个最大的周期。
答案 1 :(得分:0)
c)这实际上是否合适 解决问题的方法?我的 理解“基本”周期 而是在下图中,而不是 它挑选出A-B-C-D-E-F 选择A-B-F,B-C-D等但是那样 不是世界末日给予的 任务。
E / \ D---F / \ / \ C---B---A
没有。唐纳德约翰逊的论文意义上的“小学”意味着简单,即没有节点在圆圈中出现两次。这意味着算法不会选择AFBCDBA
,但会选择ABCDEF
。
d)如果有必要,我可以简化 通过强制实现相互关系的问题 关系 - 即A-friends-with-B< ==> B-friends-with-A,如果真的 必要的我可以减少 数据大小,但实际上是 总是在1英里左右 标记
无向图具有(非简单)循环的向量空间(具有良好的基础等),但我不知道它是否对您有帮助。
z)这是P或NP任务吗?
这是一个枚举问题,它本身不能在P或NP中。
答案 2 :(得分:0)
找到每个周期听起来都不合理。将有指数级的循环,彼此重叠。
对于P或NP,最慢的部分实际上是枚举每个循环(因为可能有这么多循环)。如果没有循环,则存在线性算法。
也许你真的想在双连通组件中划分图形? 见http://en.wikipedia.org/wiki/Biconnected_component
将图形存储在矩阵中几乎绝对不合理。理论上听起来不错,但在实践中没有扩展,请改用邻接列表(http://en.wikipedia.org/wiki/Adjacency_list)