我一直在思考Facebook的建议和其他类似的系统.
我认为Facebook的建议也是基于个人知识,像学年,我工作的公司或类似的东西.
但除此之外,更具体的是这个计划
Case1看起来很简单,但是当朋友数量变大时(约300个朋友太多),效率不高.
Case2怎么样?什么样的算法可以做到这一点.
我不知道Case3,因为我猜这是Facebook的特别之处.
但是我怎么能检测到人4.哪个程度有关系?
我不知道你是否问如何提出建议或检测朋友的距离.提出建议很容易,但会趋向于爆炸.
前两种情况可以由相同的算法覆盖,第三种则由一个小的扩展.
前两个人基本上都是寻找所有知名朋友相互认识的人:
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所言,您可以筛选每个朋友列表,首先查看最活跃的朋友.或者计算相似性得分,促进那些有更多朋友与你共同的朋友.
如果你真的在探测一个朋友和一个建议之间的距离,这可能是不相关的.