Algorithm 计算;凯文·培根;数字

Algorithm 计算;凯文·培根;数字,algorithm,graph,bacon-number,Algorithm,Graph,Bacon Number,我一直在玩弄一些东西,并想出了一个想法,试图找出数字。我有一个网站的数据,为此我们可以考虑一个社交网络。让我们假设它是Facebook(为了简化讨论)。我有人,我有他们朋友的名单,所以我有他们之间的联系。我如何计算从一个人到另一个人的距离(基本上是凯文·培根数) 我最好的想法是a,有深度限制(限制计算复杂度,避免在图中无法连接的人的问题),但我意识到这是一种蛮力 制作一些小的子图(比如相当于Facebook上的群组),计算它们之间的最短距离(也许提前计算),然后尝试使用这些子图来查找链接,这样会

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

我最好的想法是a,有深度限制(限制计算复杂度,避免在图中无法连接的人的问题),但我意识到这是一种蛮力

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

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

有人能想出一种更简单/更快的方法吗?我希望能够在两个人之间找到最短的长度,所以这不像总是有相同的终点那么容易(比如凯文·培根问题)

我意识到有一些问题,比如我可以找到200人的连锁店之类的,但这是可以解决的,因为我的搜索深度有限。

听起来像是一份适合我的工作

艾德:呃,我不该这么快扣动扳机。当权重为1时,Dijkstra(和Bellman Ford)的搜索减少为广度优先搜索,因此这不太有用。哦,好吧

tvanfosson提到的这项技术可能是实现这一目标的理想方法。其思想是,不必按照元素在树的每一层(基于起点或终点)的任何顺序进行搜索和递归,而是使用一些启发式方法来确定要首先尝试的元素。在您的情况下,一个好的赌注可能是节点的度数(“朋友”的数量),但您可能希望使用给定人员任意度数范围内的人数(也就是说,一个有三个朋友,每个朋友都有100个朋友的人可能比一个有20个朋友的人在一个避开外人的小圈子里更容易成为一个节点)。你可以用其他各种东西作为启发(朋友得2分,朋友的朋友得1分;不管怎样,实验)


再加上深度限制(在6度间隔后切断,或其他),你可以大大改善你的平均情况(最坏情况仍然与基本BFS相同).

这是一个标准。有很多解决方案,包括和。您可能特别感兴趣的是查看,并了解相对于任何特定节点的阶数的倒数,它将如何使用成本函数执行。我们的想法是访问更受欢迎的节点(阶数更高的节点)首先。

在两个方向(从每个端点)运行广度优先搜索当你有连接或达到深度限制时停下来

这一个可能比所有对最短距离都好。

+1正如我在思考几分钟后提到的,Dijkstra和Bellman Ford都会在边缘权重都为1时简化为简单的广度优先搜索。a*值得一看,因为它添加启发式。结合有限的深度,它可能是您能得到的最好的。对于这种类型的搜索,a*可能是三种搜索中最差的,因为它只返回最接近启发式的节点,而Dijkstra的算法返回任何最接近的节点(它找到的第一个)。这样做可能会更快,因为您没有寻找任何特定的。@Jasper——直觉是最短路径往往通过连接良好的节点——这将是要检验的假设。如果是真的,启发式将更快地为您提供最短路径,使您能够终止其他节点(非最短路径)前面的潜在路径。@tvanfosson:使用顶点的度数听起来是个好主意,但a*只能找到一条到节点的路径。你不能说“给我一条从这里到某个高度节点的路径”因为现在您正在寻找一组节点。无论如何,这可能是需要进行基准测试的。这没什么问题。但是,如果您想将深度限制在(比如)6度的间隔,那么也可以使用某种启发式来确定在广度优先搜索(即a*)中下一步要查看的节点。它不会改善最坏的情况,但可以改善平均情况。是的,它仍然是BFS,但“BFS”并不能说明全部情况。主要是我的意思是“没有用处”bog标准BFS已经被提到了,我没有提出任何新的建议,提出了一个更通用的算法,但在本例中简化为相同的东西。我在我的答案中添加了更多的想法,希望能使它更好。在本例中,比A*更好,因为估计函数可能不可用。顺便说一句,因为这不是ab在电影中,没有令人信服的理由称它为凯文·培根号码,而不是更熟悉的(对某些人来说;-))埃尔德的号码:我在做一些研究时看到了这个词,但通过称它为凯文·培根号码,每个人都立即知道我在说什么。我想这会减少解释的难度,“分离度”也会有意义