需求描述
在推荐业务场景中,会有些好友推荐的应用出现,例如现在的QQ好友推荐。那么在早些年头,关于共同好友的算法题是通过MR来实现的,也是大厂面试题中的一道。昨天跟朋友又聊到这道题目,讨论使用SQL如何实现?那么先来看下这道题的描述,以及扩展问题。
问题描述:比如某社交公司想实现一种功能给用户推荐好友,比如小明和小张不是好友,但是他们有一个共同好友小王,那么我们就可以把小明推荐给小张,给小张推荐小明。
公司在推荐时,会根据共同好友数决定推荐的先后顺序。我们现在有以下表结构,假设数据如下::
用户user | 好友列表friend_list |
小明 | 小张,小李,小孙 |
小张 | 小明,小李 |
小李 | 小明,小张,小孙 |
小孙 | 小明,小李,小王 |
小王 | 小孙 |
那么需求来了,现在我们要统计出共同好友的数量,即输出结果包括以下三个字段(即user1和user2共同的好友数用mutual_friends_cnt表示):
举例:比如小明的好友中有小李和小张,而小张的好友里也有小李,那么小明和小张的共同好友就是小李。
最终的结果展示为:
user1 | user2 | mutual_friends_cnt |
小明 | 小张 | 1 |
小明 | 小李 | 2 |
小明 | 小孙 | 1 |
小张 | 小明 | 1 |
小张 | 小李 | 1 |
小李 | 小明 | 2 |
小李 | 小张 | 1 |
小李 | 小孙 | 1 |
小孙 | 小明 | 1 |
小孙 | 小李 | 1 |
扩展问题
那么基于上面的需求,我们再次扩展一下,统计出非好友之间的共同好友数,即比如小明和小孙是好友,小孙的好友中有小王,而小王和小明不是好友,那么小王和小明之间的共同好友就是小孙。所以在推荐时就会把小王推荐给小明,把小明推荐给小王。
最终的结果展示为:
用户user1 | 用户user2 | 共同好友数 |
小明 | 小王 | 1 |
小张 | 小孙 | 2 |
小李 | 小王 | 1 |
小孙 | 小张 | 2 |
小王 | 小明 | 1 |
小王 | 小李 | 1 |
分析
该分析流程可能不是最优解,读者如果有好的思路,可以扫描底部的二维码进群讨论。
1、统计好友之间的共同好友数分析
1.1、基于现有的表结构,需要根据每个用户的好友列表A_list进行迭代找到每个好友的对应好友列表B_list
1.2、将每个好友的对应的B_list中的元素和A_list中的元素进行比对,找到两个列表中的交集。
具体示例步骤见下图:
2、统计非好友之间的共同好友数分析
2.1、基于现有的表结构,需要根据每个用户的好友列表A_list进行迭代找到每个好友的对应好友列表B_list
2.2、将每个好友的对应的B_list中的元素和A_list中的元素进行比对,找到不在A_list中的元素
2.3、按照好友列表A_list对应的用户、不在A_list中的用户且属于B_list中的用户进行组合,得到两个不关联用户之间的共同好友列表
具体示例步骤见下图:
实现
1、统计好友之间的共同好友数分析
2、统计非好友之间的共同好友数分析