Implement follow, unfollow, snapshot, and is_following.
snapshot captures the current state of all relationships and returns an incremental ID starting from 0.
is_following must answer whether user A was following user B at a specific past snapshot.
Extend with get_followers(user_id, snapshot_id) and get_followees(user_id, snapshot_id).
Add recommend(user_id, snapshot_id, k=5), returning top-K users to follow based on friends-of-friends.
设计一个简化版社交网络:
用户可以关注、取关别人。系统可以随时保存一次快照,并返回一个递增的 snapshot_id。之后要能查询:在某个历史快照中,A 是否关注 B。
后续还要支持查询某个用户在历史快照下的 followers / followees,并基于“我关注的人关注了谁”做推荐。
最简单的方法是每次 snapshot() 都复制一份完整关注关系。
优点是查询简单,缺点是空间爆炸。如果关注关系很多、快照很多,这个方案很难扩展。
更好的做法是:记录每条关注关系的历史变化。
比如 A 关注 B 这条边可以记录成:
A -> B:
(0, true)
(3, false)
(7, true)查询某个 snapshot 时,对这条边的历史记录做 binary search,找到不超过目标 snapshot 的最后一次状态变化,就能判断当时是否关注。
可以维护两个索引:
outgoing[user] = user 历史上关注过的人
incoming[user] = 历史上关注过 user 的人查询 get_followees 时,遍历这个用户历史上关注过的人,再用 is_following 判断在该 snapshot 是否有效。
get_followers 同理,只是走反向索引。
推荐基于 friends-of-friends:
先找到用户在该 snapshot 下关注的人,再看这些人关注了谁。候选人必须满足:
- 用户自己还没关注;
- 不是用户自己;
- 至少被一个 followee 关注。
然后按出现次数排序,返回 top-K。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

