Capstone: mạng xã hội mini với graph và feed
Dựng mạng xã hội mini: đồ thị theo dõi, gợi ý bạn bằng BFS, bảng tin xếp hạng và chống spam bằng Bloom filter.
Chuyên giaThuật toán ~120 phút
Ôn lại trước khi học
Giới thiệu
Bạn dựng mạng xã hội mini chạy được. Có gợi ý bạn và bảng tin.
Kiến thức cần nhớ
Đồ thị theo dõi
- Mỗi người là một đỉnh, theo dõi là một mũi tên.
- Ví dụ đời thường: giống sơ đồ ai theo dõi ai.
- Cần hỏi nhanh: đang theo dõi ai, ai theo dõi mình.
- Bạn chung là người cả hai cùng theo dõi.
Gợi ý bạn bằng BFS
- BFS lan hai tầng từ bạn để tìm ứng viên.
- Chấm điểm bằng số bạn chung và tương tác.
- Ví dụ đời thường: giống giới thiệu bạn của bạn.
- Trả top 10 kèm lý do gợi ý.
Bảng tin và chống spam
- Bảng tin gom bài của người đang theo dõi.
- Chấm mỗi bài bằng độ mới và tương tác.
- Ví dụ đời thường: giống chọn tin hot lên đầu.
- Bloom filter chặn link độc trước khi đăng.
# tìm bạn chung đơn giản
def ban_chung(a, b):
return a & b # giao hai tập theo dõi
me = {"An", "Binh"}
ban = {"Binh", "Chi"}
print(ban_chung(me, ban)) # ra {'Binh'}
Ví dụ
- A theo dõi B, B theo dõi C -> gợi ý C cho A.
- Bài mới nhiều like -> xếp hạng cao hơn.
💻 Bài tập
Ngôn ngữ: Python 3 (hoặc Go). Dùng code đồ thị, heap, Bloom, cache các ngày trước. Nộp vào day-160-capstone/.
Bài 1: Mô hình dữ liệu và API
class SocialGraph:
def follow(self, a: int, b: int): ...
def unfollow(self, a: int, b: int): ...
def following(self, a: int) -> set[int]: ...
def followers(self, a: int) -> set[int]: ...
def mutuals(self, a: int, b: int) -> set[int]: ... # cùng theo dõi
def post(self, user: int, text: str, ts: float) -> int: ...
def like(self, user: int, post_id: int): ...
Sinh dữ liệu: 100.000 user, phân bố theo dõi theo luật lũy thừa (vài người rất nổi tiếng), 10^6 bài.
Bài 2: Gợi ý theo dõi và bảng tin
| Tính năng | Yêu cầu |
|---|---|
suggest(a, k=10) | BFS 2 tầng. Điểm = số bạn chung + 0.1 x log(followers). Không gợi người đã theo dõi. Trả lý do "3 bạn chung: X, Y, Z" |
feed(a, k=20) | Bài của người a theo dõi. Điểm = like / (giờ + 2)^1.5. Gộp K danh sách bằng heap |
| Người nổi tiếng | Bài của người trên 10.000 follower kéo lúc đọc, còn lại đẩy vào hộp thư lúc đăng (fan-out on write) |
suggest cho user mới 0 theo dõi -> trả người nổi tiếng nhất
feed không chứa bài của người đã unfollow
Bài 3: Chống spam và đo (nâng cao)
- Bloom filter 10^6 link độc. Bài chứa link độc bị chặn khi đăng.
- Cache LRU cho
feed60 giây, xóa khi người mình theo dõi đăng bài. - Đo p50/p99 của
suggestvàfeedvới 1000 truy vấn ngẫu nhiên. So fan-out on write và on read cho người nổi tiếng: bộ nhớ và độ trễ. REPORT.md: sơ đồ, bảng số liệu, đánh đổi push/pull.
✅ Tiêu chí hoàn thành
- API có test cho follow/unfollow/mutuals.
-
suggestcó lý do,feedđúng thứ tự điểm. - Bảng push vs pull có số thật.
- Link độc bị chặn, có test.
❓ Câu hỏi ôn tập
- Mũi tên theo dõi chỉ hướng nào?
- BFS gợi ý bạn đi mấy tầng?
- Bảng tin chấm bài bằng gì?
- Bloom filter đặt ở đâu?
🌕 Bạn đã hoàn thành ngày 160. Làm hết bài tập phía trên rồi sang ngày tiếp theo.