我有一个6度的Kevin Bacon型问题。假设我有两个Twitter用户,我想通过朋友找出他们之间的关系(我用朋友来表示当你跟随某人跟他们一起跟随你时)和Twitter上的粉丝。我的数据库中有所有id。
例如:
乔尔和莎莉Joel跟随Fred,他是跟随Sally的Steve的朋友。
可能有多种方法可以实现目标,但我想要最短的方式。
这似乎是一个众所周知的计算机科学问题(最短路径算法)。
今天我有一张名为“影响者”的桌子,其中存储了我的所有Twitter ID,然后我有一张自助参考表(一方是粉丝,另一方是朋友)。
这个图论是什么?如果是这样,有人可以指向任何可能有用的实用程序/库/方法。我使用ruby,但可以解析大多数语言。
答案 0 :(得分:1)
正如您所说,这是一个众所周知的问题,您可以在Wikipedia中看到。
请注意,在你的情况下,所有边的权重都等于1),所以我不认为Djikstra的算法对你非常有用。
为了找到最小距离,我建议进行广度优先搜索。问题是Twitter网络可能是极端连接的,因此您可能会发生组合爆炸(想象每个人与其他20个人相连 - 在第一级,您将访问20个配置文件,而在下一个级别,您将访问400个,在接下来的8000中 - 如果你没有快速找到Sally,你很快就会耗尽记忆力。)
还有一个线性编程公式,我对此并不十分熟悉。 These notes在线性编程方面很有用,但在最短路径问题上并不好,而these似乎更关注应用程序。
这个问题有video lecture可供使用,看起来非常完整。
我希望这些参考资料有所帮助。
答案 1 :(得分:1)
这听起来像你需要BFS http://en.wikipedia.org/wiki/Breadth-first_search
在线方法:
我认为它可能很昂贵,具体取决于你想要如何使用它。
在最坏的情况下,您将迭代数据库中的所有数据:cost runtime O(n)
(假设您有一个查找函数,用于在运行时O(1)
中查找图中的用户。)
离线式
您可以执行离线计划预计算并将距离存储为查找功能,但它需要一些额外的内存O(n*n)
,其中n是用户数。查找功能的成本现在只有O(1)
或O(logn)
,具体取决于您的实现方式
(忽略我认为将在O(n)
到O(n*n)
区域区域的离线运行时。
<强>策略强> 您要遵循的策略可以取决于您可以期望作为上限的用户数量以及用户彼此连接的程度。如果您的用户很少,在线方法可能没问题,如果您有数百万用户,那么您可能需要离线方法,但这会花费您一些内存。
其他注意事项
<小时/> 更新的答案 有17个mio。用户,我们需要离线方法。
我会关注离线版本。您应该避免我认为可能的O(n*n)
运行时。
数据库模型
您应该考虑如何为数据库建模,因为这将是此实现中最昂贵的部分。
也许是这样的:
为每个用户创建一个表(table-name可以是userId)。每个表都有每个用户的条目(记录键是userId)。
这将导致17 mio。 17 mio的桌子。每个条目(这是O(n*n)
费用)。
离线您运行BFS一次,同时跟踪您访问过哪个用户以及您在BFS迭代中的哪个级别并保存到DB的距离。我没有想到这一部分,但我认为这个策略是可行的。请记住在每个节点上运行BFS,即在您访问所有用户之前。
如果此策略不可行,那么您可以从O(n*n)
运行时的每个节点运行BFS。这意味着在最坏的情况下运行可能需要一个月的时间,即您的距离数据可能很旧。运行速度取决于用户的连接方式。
或者,如果可能,您可以执行此方法“每当为用户更新新参考时,请更新距离查找功能”。这将运行BFS一次O(n)
,即几秒钟。在第一次事件时调用BFS(userId),然后在参考更新时调用。
在线您使用userId通过table-name获取表,并通过另一个userId获取该条目以获取距离。