【问题标题】:How can I prove the "Six Degrees of Separation" concept programmatically?如何以编程方式证明“六度分离”概念?
【发布时间】:2009-06-12 20:38:05
【问题描述】:

我有一个包含 2000 万用户和这些人之间联系的数据库。如何在编程中以最有效的方式证明“六度分离”的概念?

link to the article about Six degrees of separation

【问题讨论】:

    标签: algorithm networking graph-theory combinatorics


    【解决方案1】:

    您只想测量diameter of the graph. 这正是找出图中最远连接节点之间分离的指标。

    Google 上有很多算法,Boost graph 也是。

    【讨论】:

    • 六度是最大值还是平均值?我读过的大部分实际分析都使用平均值而不是最大值。
    • “六度分离”的常见概念是它是一个最大值。当然,这在现实中根本不是真的。只是这样说更令人印象深刻,而且很难找到反例。
    【解决方案2】:

    您可能可以将图形放入内存中(表示每个顶点都知道其邻居列表)。

    然后,从每个顶点 n,您可以运行广度优先搜索(使用队列)到深度 6 并计算访问的顶点数。如果不是所有的顶点都被访问过,那么你就证明了这个定理。在其他情况下,继续下一个顶点n

    这是 O(N*(N + #edges)) = N*(N + N*100) = 100N^2,如果用户平均有 100 个连接,这对于 N=2000 万来说并不理想。我想知道上面提到的库是否可以以更好的时间复杂度计算直径(一般算法是 O(N^3))。

    单个顶点的计算是独立的,因此它们可以并行完成。

    一点启发式:从度数最低的顶点开始(更好的机会反驳定理)。

    【讨论】:

    • 我认为这比 O(n^2) 差很多。即使假设每个节点仅连接到 3 个其他节点,深度为 6 的堆栈跟踪也将是 3 * 2^0 + 3 * 2^1 + 3 * 2^2 + 3* 2^3 + 3* 2^4 + 3*2^5。指数增长
    • 对于每个顶点,您最多访问每个顶点一次,因此运行一个顶点需要 O(N)。
    • 啊,没错,这是一个限制。我认为这仍然是 O(N^3),不是吗?找到从顶点 A 到顶点 B 的路径是 O(N),你必须这样做 O(N^2) 次。
    • 嗨,假设您想计算图中一个顶点到每个其他顶点的最短距离。由于边没有权重(路径长度 = 边数),这可以在 O(N+#edges) 中完成:运行广度优先搜索 - en.wikipedia.org/wiki/Breadth-first_search。你是对的,它不是 O(N) 而是 O(N+#edges),其中 #edges 就像 100*N(如果用户平均有 100 个连接)。谢谢
    【解决方案3】:

    我认为最有效的方式(最坏的情况)几乎是 N^3。建立一个邻接矩阵,然后取该矩阵 ^2、^3、^4、^5 和 ^6。查找图中从矩阵 0 到矩阵 ^6 的任何条目。

    您可以试探性地尝试挑出子图(仅通过相对较少数量的“桥”节点连接到其他集群的大群人),但绝对不能保证您会拥有任何子图。

    【讨论】:

    • 您无法在内存中构建大小为 20x20 百万的邻接矩阵。此外,乘法为 O(N^3),其中 N 为 2000 万。
    • 使用 strassen 算法大约是 n^2.8,因为它们是方阵。您也不需要将整个 matix 保存在内存中,只需将您正在积极乘法的部分保存在内存中。将其余部分分页到磁盘。
    • 确实需要大量磁盘... 400 TB 用于幼稚的方法。不过压缩空间很大。
    【解决方案4】:

    已经给出了更好的答案,但我想我会使用Floyd-Warshall所有对最短路径算法,即 O(n^3)。我不确定图形直径算法的复杂性,但它“听起来”像这样也是 O(n^3)。如果有人知道,我想澄清一下。

    顺便说一句,你真的有这样的数据库吗?吓人。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2010-10-04
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多