计算“凯文培根”数字

时间:2009-03-23 20:27:19

标签: algorithm graph bacon-number

我一直在玩一些东西,并想到试图找出Kevin Bacon数字的想法。我有一个网站的数据,为此我们可以考虑一个社交网络。让我们假装它是Facebook(为了简化讨论)。我有人,我有他们的朋友列表,所以我有他们之间的联系。如何计算从一个人到另一个人的距离(基本上是凯文培根号码)?

我最好的想法是Bidirectional search,具有深度限制(以限制计算复杂性并避免人们在图中无法连接的问题),但我意识到这是相当暴力的。

制作小的子图(比如Facebook上的组相当于某些东西)可能会更好,计算它们之间的最短距离(可能提前),然后尝试使用THOSE来查找链接吗?虽然这需要预先计算,但它可以搜索更少的节点(节点可以是组而不是个体,使图形更小)。这仍然是双向搜索。

我还可以预先计算个人所连接的人数,首先在节点中搜索“热门”人,因为他们最有可能连接到给定的目的地个体。我意识到这将是对可能的最短路径的速度的权衡。我想我也想使用深度优先搜索而不是我计划在其他情况下使用的广度优先搜索。

有人可以想到更简单/更快的方法吗?我希望能够找到两个人之间的最短长度,所以它并不像总是具有相同的终点那么容易(例如在Kevin Bacon问题中)。

我意识到有一些问题,比如我可以获得200人的连锁等等,但这可以解决我对我愿意搜索的深度的限制。

4 个答案:

答案 0 :(得分:17)

这是标准shortest path problem。有很多解决方案,包括Dijkstra's algorithmBellman-Ford。您可能特别感兴趣的是查看A* algorithm并了解它如何使用相对于任何特定节点度的倒数的成本函数执行。我们的想法是首先访问更受欢迎的节点(那些具有更高学位的节点)。

答案 1 :(得分:4)

听起来像个工作 Dijkstra's algorithm

ED:呃,我不应该这么快就扣动扳机。 Dijkstra(和Bellman-Ford)在权重为1时缩小为广度优先搜索,因此这不太有用。哦,好吧。

tvanfosson提到的A* algorithm可能是理想的。我们的想法是,不是按照树的每个级别(以您的起点或终点为根)的元素的任何顺序进行搜索和递归,而是使用一些启发式来确定您将首先尝试的元素。在你的情况下,一个好的赌注可能是一个节点的程度(“朋友”的数量),但你可能想要使用给定人的某个任意度数内的人数(即,有有三个朋友,每个朋友都有100个朋友,这个朋友可能比一个拥有20个朋友的人更好,这个朋友可以避开局外人。还有各种各样的其他东西你可以用作启发式(朋友得2分,朋友的朋友得1分;无论如何,实验)。

将此与深度限制相结合(在6度分离后切断,或其他任何方式),您可以大大改善您的平均情况(最坏情况仍然与基本BFS相同)。

答案 2 :(得分:0)

在两个方向(从每个端点)运行广度优先搜索,并在您建立连接或达到深度限制时停止

答案 3 :(得分:0)

这一个可能总体上更好Floyd-Warshall所有对最短距离。