Bloom Filter — Bộ lọc xác suất

1. Cơ chế cơ bản (m=64, k=3)

Bảng 64 bit cố định, 3 hàm hash. Add một key bật 3 bit. Check một key nhìn vào đúng 3 bit đó — nếu cả 3 đều bật → "có thể có"; có bit nào tắt → "chắc chắn không có". Đây là demo nhỏ để thấy cơ chế trước khi vào vấn đề kích thước ở phần 2.
Bảng 64 bit, k = 3 hàm hash.
Đã thêm:
Add: bật 3 bit ứng với 3 hash. Check: cả 3 bit cùng bật → "có thể có"; có bit nào tắt → "chắc chắn không có".

2. Saturation — thiết kế đúng size để giữ FP target

Bảng 64 bit ở phần 1 saturate rất nhanh (n=20 đã có FP ~23%). Phần này cho biết n dự kiếnFP target → tự động tính m, k theo công thức: m = -n·ln(p) / (ln 2)², k = (m/n)·ln 2. Sau đó add key và đo FP đo thực để xác nhận giữ trong tầm kiểm soát.

2.1. Thiết kế bảng

2.2. Trạng thái thực tế

Đã add
0 / 100
Bit bật
0%
FP dự đoán (công thức)
0%
FP đo thực (1000 probe)
Thiết lập n=100, FP 1% → bảng tự động sized. Bắt đầu add key.

2.3. Bảng bit (đen = bật)

3. Skip List — search nhảy tầng (mục 2 README)

Linked list nhiều tầng: L0 chứa tất cả phần tử đã sắp xếp; tầng trên chỉ giữ một số node, mỗi tầng bỏ qua một nửa (xác suất). Search đi từ tầng cao xuống, mỗi tầng nhảy phải tối đa khi còn ≤ target, rồi xuống tầng dưới. Trung bình O(log n) — chính là cách Redis ZSET tìm trong sorted set.
Mảng 10 phần tử [3,6,7,9,12,17,19,21,25,26] với 4 tầng (xây minh họa). Mỗi node vẽ ô vuông; '─────' = bỏ qua (skip).