我有一个拥有2000万用户的数据库以及这些人之间的联系。如何在编程中以最有效的方式证明“六度分离”概念的概念?
答案 0 :(得分:11)
您只想衡量diameter of the graph. 这正是用于找出图中距离最远的节点之间的分离的度量标准。
Google上有很多算法,Boost graph。
答案 1 :(得分:4)
您可以将图形放在内存中(在每个顶点知道其邻居列表的表示中)。
然后,从每个顶点 n ,您可以运行广度优先搜索(使用队列)到深度6并计算所访问的顶点数。如果不是所有顶点都被访问过,那么你已经反驳了这个定理。在其他情况下,继续下一个顶点 n 。
如果用户平均有100个连接,则这是O(N *(N + #edges))= N *(N + N * 100)= 100N ^ 2,这对于N = 2000万不是理想的。我想知道所提到的库是否能够以更好的时间复杂度计算直径(通用算法是O(N ^ 3))。
各个顶点的计算是独立的,因此它们可以并行完成。
一点启发式:从具有最低程度的顶点开始(更好的机会反驳定理)。
答案 2 :(得分:2)
我认为最有效的方式(最坏的情况)几乎是N ^ 3。构建邻接矩阵,然后取该矩阵^ 2,^ 3,^ 4,^ 5和^ 6。在图中查找矩阵到矩阵^ 6的任何条目。
启发式地,你可以尝试挑出子图(大块的人只通过相对较少的“桥”节点连接到其他团块),但绝对不能保证你会有。
答案 3 :(得分:2)
已经给出了一个更好的答案,但是在我的头脑中,我将使用Floyd-Warshall所有对最短路径算法,即O(n ^ 3)。我不确定图直径算法的复杂性,但它“听起来”像这样也是O(n ^ 3)。如果有人知道,我想澄清一下。
另外,你真的有这样的数据库吗?吓人。