Count-Min Sketch — đếm tần suất xấp xỉ
Ước lượng tần suất phần tử trên stream với bộ nhớ cố định, dùng nhiều hàm băm + ma trận đếm. Luôn over-estimate; ứng dụng heavy hitters, rate limiting.
TL;DR: Bài toán: trên một luồng hàng triệu sự kiện, đếm xem mỗi phần tử xuất hiện bao nhiêu lần — ví dụ sản phẩm nào đang được thêm vào giỏ nhiều nhất. Đếm chính xác tốn hàng GB. Count-Min Sketch đếm gần đúng mà chỉ tốn khoảng trăm KB cố định (ví dụ của bài: 106 KB). Mẹo: nhiều phần tử dùng chung một số ít ô (đụng nhau) nên số đếm hơi dư; dùng nhiều bộ ô trộn theo kiểu khác nhau rồi lấy con số nhỏ nhất. Kết quả không bao giờ thấp hơn thật. Redis có sẵn cấu trúc này (lệnh CMS.INCRBY/CMS.QUERY).
Ngày sale 11/11, một sàn thương mại điện tử nhận hàng chục triệu đơn. Với mỗi add-to-cart, service cần biết sản phẩm nào đang hot. Từ điển productId → số lần phình ra vài GB. Count-Min Sketch ước lượng tần suất với khoảng trăm KB cố định, chấp nhận đếm dư (over-count) kiểm soát được, không bao giờ đếm thiếu.
1. Trực giác: trò bỏ phiếu vào ít hộp
Bạn tổ chức bỏ phiếu cho rất nhiều ứng viên (hàng triệu), nhưng chỉ có vài cái hộp (ít hơn ứng viên rất nhiều). Mỗi ứng viên gán cố định vào một hộp, nên nhiều ứng viên dùng chung một hộp. Đọc số phiếu trong hộp của một ứng viên thì con số hơi dư, vì lẫn phiếu của người khác.
Đụng nhau chỉ làm số đếm dư lên, không bao giờ làm thiếu. Để bớt dư, dùng nhiều bộ hộp, mỗi bộ xếp ứng viên theo cách khác nhau: đụng nhau ở bộ này thường không đụng ở bộ kia. Đọc số của ứng viên ở mọi bộ rồi lấy con số nhỏ nhất, vì bộ dư ít nhất gần thật nhất.
Đổi hộp thành ô đếm thì ra bảng d × w:
| Trò bỏ phiếu | Count-Min Sketch |
|---|---|
| Cái hộp | Một ô đếm (một cột trong bảng) |
| Số phiếu trong hộp | Số nguyên trong ô |
| Gán ứng viên cố định vào một hộp | Hàm băm (hash) ánh xạ phần tử về một cột |
| Một bộ hộp (một cách xếp) | Một hàng + một hàm băm riêng |
| Nhiều ứng viên chung một hộp | Đụng độ (collision) — số đếm dư |
| Lấy số nhỏ nhất qua các bộ | Phép "Min" — chỗ chữ "Min" trong tên |
Vì thế tên là Count-Min.
All-Access Pass
Phần còn lại của bài dành cho All-Access Pass
Bạn vừa đọc phần xem trước. Hai bài đầu của mỗi khoá luôn đọc trọn miễn phí.
- Đọc trọn mọi bài trong 6 khoá System Design và dữ liệu phân tán
- AI Mentor trả lời theo toàn bộ nội dung bài
- Trả một lần, không tự gia hạn, không tự trừ tiền
Trọn đời
1.690.000 ₫
Trả một lần, dùng mãi mãi
Gói năm
699.000 ₫
365 ngày · ≈ 58.000 ₫/tháng
Thanh toán bằng thẻ Visa/Master/JCB qua Polar. Xem bảng giá
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Thảo luận & góp ý
Hỏi đáp về bài này