JAVA面试-系统设计题

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次,这种行为应该进行限制

滑动窗口就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酆都小菜鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值