【问题标题】:finding ALL cycles in a huge sparse matrix在一个巨大的稀疏矩阵中找到所有循环
【发布时间】: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


【解决方案1】:

您正在做的事情类似于数据挖掘中一个经过深入研究的问题,称为关联规则挖掘或更普遍的频繁项集挖掘。您可以通过频繁项集挖掘找到的东西比您正在做的更具体,但也更有用。

我们将使用封闭频繁项集挖掘,这将找到所有朋友组,其中每个人都是彼此的朋友。

我现在要说的是,Java 不能做你想让它做的事情。它无法加载那么多内存,并且在任何合理的时间内处理该数据的效率也不够高,您将需要使用 C/C++。我建议使用 LCM,它是一个封闭的频繁项集挖掘器,但由于您拥有的数据量,您还需要将支持设置得相当高。

您可能要考虑的另一件事是阅读大型图挖掘,这也是一个相当大的研究领域,但 Java 不会削减它。此外,您将无法找到数据中的所有循环(除非它非常稀疏),它们的数量将会太多。它们也将重叠并且不是很有意义,您可能会找到几个最大的周期。

【讨论】:

    【解决方案2】:

    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,如果真的 有必要我也许可以减少 数据大小,但实际上它是 总是在100万左右 标记。

    无向图具有(非简单)循环的向量空间(具有很好的基础等),但我不知道它是否会对您有所帮助。

    z) 这是 P 任务还是 NP 任务?

    这是一个枚举问题,它本身不能在 P 或 NP 中。

    【讨论】:

      【解决方案3】:

      找到每个周期听起来并不合理。会有指数级的循环,所有循环都相互重叠。

      对于 P 或 NP,最慢的部分实际上是枚举每个循环(因为它们可能有很多)。如果没有环,则存在线性算法。

      也许您真的想将图形划分为双连通分量? 见http://en.wikipedia.org/wiki/Biconnected_component

      此外,将图形存储在矩阵中几乎是不合理的。理论上听起来不错,但实际上无法扩展,请改用邻接列表 (http://en.wikipedia.org/wiki/Adjacency_list)

      【讨论】:

        猜你喜欢
        • 2014-12-01
        • 2019-04-29
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多