OpenAI 面试真题:Social Network Snapshot 设计题,考的不只是数据结构 – 一亩三分地 – AI – 面试辅助 – 代面试

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 下关注的人,再看这些人关注了谁。候选人必须满足:

  1. 用户自己还没关注;
  2. 不是用户自己;
  3. 至少被一个 followee 关注。

然后按出现次数排序,返回 top-K。

我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

Leave a Reply

Your email address will not be published. Required fields are marked *