Algorithm 我怎样才能证明这一点;“六度分离”;以编程方式实现概念?

Algorithm 我怎样才能证明这一点;“六度分离”;以编程方式实现概念?,algorithm,networking,graph-theory,combinatorics,Algorithm,Networking,Graph Theory,Combinatorics,我有一个2000万用户的数据库和这些人之间的联系。如何在编程中以最有效的方式证明“六度分离”概念 您只需要测量 这正是找出图中最远连接节点之间的距离的度量 谷歌上也有很多算法。你可能可以在内存中拟合图形(表示每个顶点都知道它的邻居列表) 然后,从每个顶点n开始,可以运行宽度优先搜索(使用队列),搜索深度为6,并计算访问的顶点数。如果不是所有的顶点都被访问,那么你已经证明了这个定理是错误的。在其他情况下,继续下一个顶点n 这是O(N*(N+#边))=N*(N+N*100)=100N^2,如果用户平

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


您只需要测量 这正是找出图中最远连接节点之间的距离的度量


谷歌上也有很多算法。

你可能可以在内存中拟合图形(表示每个顶点都知道它的邻居列表)

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

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

单个顶点的计算是独立的,因此可以并行进行


一点启发:从次数最少的顶点开始(更有可能反驳定理)。

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


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

好吧,已经给出了一个更好的答案,但在我脑海中,我会使用所有对最短路径算法,即O(n^3)。我不确定graph diameter算法的复杂度,但它“听起来”好像也是O(n^3)。如果有人知道,我想澄清一下


顺便说一句,你真的有这样一个数据库吗?可怕。

六度是最高还是平均?我读到的大多数实际分析都使用平均值,而不是最大值。“六度分离”的一般概念是它是最大值。当然,事实上根本不是这样。这样说更令人印象深刻,而且很难找到反例。你无法在内存中构建一个20x20百万大小的邻接矩阵。另外,乘法是O(N^3),其中N是2000万。strassen的算法大约是N^2.8,因为它们是平方矩阵。您也不需要将整个matix保存在内存中,只需将正在积极乘法的部分保存在内存中。将其余的页面调出到磁盘。但确实需要大量磁盘。。。400 TB是一种简单的方法。虽然有很大的压缩空间,但我认为这比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+#边数)中执行此操作:运行宽度优先搜索-。你是对的,不是O(N),而是O(N+#边),其中#边就像100*N(如果用户平均有100个连接)。谢谢