我一直在考虑facebook的建议和其他类似的系统。
我认为Facebook的建议还基于个人知识,如学年,我工作的公司或类似的东西。
但除此之外,更具体的是这个方案
Case1看起来很简单,但是当朋友数量变大(事件大约300朋友太多)时效率不高。 Case2怎么样?什么样的算法可以做这项工作。
我对Case3一无所知,因为我猜它是facebook的特别之处。 但我怎么能发现人4.与哪个学位有关?
答案 0 :(得分:5)
我不确定您是在询问如何提出建议或检测朋友距离。提出建议很容易,但往往会爆炸。
前两种情况可以用同一算法覆盖,第三种情况可以用小扩展覆盖。
前两个基本上是在寻找你知道的朋友相互了解的所有人:
FriendHash = {}
foreach Friend in me.getFriends()
foreach FriendOfFriend in Friend.getFriends()
FriendHash{FriendOfFriend} += 1
foreach PotentialFriend in keys FriendHash
if FriendHash{PotentialFriend} > 1
me.suggestFriend(PotentialFriend)
在案例1中,朋友1和2之间的链接可能是一个额外的约束,实际上会使案例实现起来有点复杂。通过要求朋友1和2拥有链接,您需要在迭代朋友对时检测潜在的朋友,而不是在最后一次。
foreach Friend in me.getFriends()
foreach SecondFriend in me.getFriends()
# skip already processed friends and Friend == SecondFriend
if Friend.getFriends() contains SecondFriend
foreach FriendOfFriend in Friend.getFriends()
# skip already suggested friends
if SecondFriend.getFriends() contains FriendOfFriend
me.suggestFriend(PotentialFriend)
当然可以添加一些可以跳过重复比较的优化。实际上,这可能不是一个有用的搜索。你所要做的就是排除两个不同朋友群体共同的潜在朋友。
最后一个案例通过将朋友建议扩展到已知朋友共同朋友的所有朋友来修改第一个伪代码段:
foreach PotentialFriend in keys FriendHash
if FriendHash{PotentialFriend} > 1
foreach ExtendedFriend in PotentialFriend.getFriends()
me.suggestFriend(ExtendedFriend)
正如Neil Knight评论的那样,您可以过滤每个朋友列表,然后首先查看最活跃的朋友。或者计算一个相似度分数,以促进那些拥有更多朋友的朋友。
如果你真的想要检测朋友和建议之间的距离,这可能是不相关的。
答案 1 :(得分:1)
Facebook可能会从您的个人资料,消息和使用连接计数等信息中获取信息。距离可能是再次加入计算加权矩阵的因素之一。然后总结并使用此总和的阈值选择最高建议。 有关常见喜欢,直接评论等的信息可能会从服务器转储到日志中。然后每周左右分析一次这个日志,以便使用Hadoop MapReduce建议朋友。每个人的这个结果可以被提供给网络服务,该服务在用户登录时向用户提供信息。