1.已知用户好友关系(平均100个好友),设计查看和另一个用户是几度人脉的功能?
在社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。
说明:
一度:A<->B :A和B是直接好友,此时A和B是一度好友
二度:A<->B<->C,A和B是好友,B和C是好友,所以A和C是两度好友
以此类推
思路1:
建立一张用户关系表:(key:维护用户的ID,value维护用户的好友ID集合set)
一度:A<->B , 直接查询用户关系表(可以用缓存优化,key:用户id,value:用户的好友set)
二度:A<->B<->C,首先排除一度的情况,然后拿A的好友和C的好友,两个集合取交集
三度:A<->B<->C<->D,拿A的二度好友(提前计算好的),和D的一度好友,取交集
四度及以上的:显示三度+
思路2:图计算(最短路径)(面试官可能追问图计算怎么实现)
两种算法参考:
(深度优先搜索算法和广度优先搜索算法都是基于“图”数据结构)
1.深度优先搜索算法
2.广度优先搜索算法
2.基于redis设计限流器
需求:限定用户的某个行为在指定时间T内,只允许发生N次。假设T为1秒钟,N为1000次。
思路1:利用 zset实现滑动窗口限流的代码(防止流量突增)
以限制用户行为为例子,比如一秒内进行某个操作50次,这种行为应该进行限制
滑动窗口就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流