php – 朋友建议或二级相关(linkedin)算法如何工作

我一直在思考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所言,您可以筛选每个朋友列表,首先查看最活跃的朋友.或者计算相似性得分,促进那些有更多朋友与你共同的朋友.

如果你真的在探测一个朋友和一个建议之间的距离,这可能是不相关的.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...