【问题标题】:The Puzzle on the graph图上的谜题
【发布时间】:2012-10-14 03:05:20
【问题描述】:

给定一个无向图 G=(V,E),每个节点 i 都与“Ci”个对象相关联。在每一步,对于每个节点 i,Ci 对象在 i 的邻居之间平均分配。经过K步,输出对象最多的前5个节点的对象个数。

以下是一步完成的一个示例:
A 的对象被 B 和 C 平分。
B 的对象被 A 和 C 平分。
C 的对象被 A 和 B 平分。

一些限制: |V|

我目前的想法是:用一个矩阵来表示每一步的变换。 这个问题转化为矩阵幂的计算。但是考虑到|V|,这个解决方案太慢了。可以是 10^5。

有没有更快的方法?

【问题讨论】:

  • 评论你听说过PageRank吗?这似乎与您想要的 en.wikipedia.org/wiki/PageRank 相似,但需要进行一些修改...
  • 单个对象可以关联多个节点吗?当您说“ Ci 对象将被 i 的邻居平均带走”时,您的意思是 i 的每个邻居都与与 i 关联的所有对象相关联吗?或者与 i 相关的对象是否以某种方式在 i 的邻居中分配?
  • |V|是 10^5 但矩阵不必取 |V|*|V|,如果使用邻接矩阵,矩阵将非常稀疏,带有 |E|最多非零单元格,因此如果您使用稀疏表示,您可能不会遇到问题。你知道你需要对矩阵进行对角化吗?
  • 这个问题的根源是什么?
  • @rob mayoff 对象在我的邻居之间平均分配

标签: algorithm math graph matrix network-flow


【解决方案1】:

单步矩阵方程类似于M x = x',其中x是当前节点内容的向量,x'是一步后的内容。即x' = M x。后面的内容是x" = M x' = M(M x)。下面是 M 的示例,其中图的邻接矩阵显示在左侧。标题为#nbr 的列是节点a、b ... e 的邻居数。矩阵M 是由邻接矩阵通过将每个 1 替换为与同一列中的个数相等的分数而形成的。

  a b c d e  #nbr          matrix M
a 0 0 1 1 0   2       0   0  1/3 1/4  0
b 0 0 0 1 0   1       0   0   0  1/4  0
c 1 0 0 1 1   3      1/2  0   0  1/4 1/2
d 1 1 1 0 1   4      1/2  1  1/3  0  1/2
e 0 0 1 1 0   2       0   0  1/3 1/4  0

要从初始内容 x 开始执行 K 步,只需计算 (M^K) x。使用需要lg K 矩阵乘法的exponentiation methodlg 表示以 2 为底的对数。由于矩阵乘法通常具有 O(n^3) 复杂度,因此如果直接使用此方法,则为 O(lg K * n^3)如果使用 Coppersmith/Winograd 算法,则为 O(lg K * n^2.376)。复杂度可以降低到 O(n^2.376) - 也就是说,我们可以将 lg K 乘数 - 通过 diagonalizing M 放到 (P^-1)AP 的形式中,其中 M^K = (P^-1)(A^K)PA^K是一个 O(n lg K) 操作,总体上给出 O(n^2.376)。对角化通常花费 O(n^3),但 O(n^2.376)using Coppersmith/Winograd algorithm

【讨论】:

  • 嘿,谢谢你的回复。我忘记了关于对角化的那些事情。你的想法确实让它更快。另一个问题是:如果矩阵稀疏,对角化会更快吗?
  • 一些特征值的迭代方法对于稀疏矩阵来说更快,如果你可以将你的矩阵组织成块,就可以解决块的特征问题,节省大量时间。除此之外我不记得太多了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2013-03-18
  • 2015-01-13
  • 2023-03-31
相关资源
最近更新 更多