A Bloom filter with a small counter per slot (max 15) instead of a bit. Insert increments k counters; Delete decrements them; a query needs all k counters > 0. The counter is what lets you delete — and saturating at the max keeps overflow safe.
| Operation | Action | Time | Notes |
|---|---|---|---|
| Insert | counter += 1 | O(k) | saturate at 15 (never wrap) |
| Delete | counter −= 1 | O(k) | clamp at 0; skip saturated |
| Query | all counters > 0? | O(k) | early-exit on first 0 |
| Space | m × 4 bits | O(m·c) | ~4× a Bloom filter |
| Optimal k | (m/n)·ln2 | — | mean counter ≈ ln2 ≈ 0.69 |
| FPR p | (1−e^(−kn/m))^k | — | same as Bloom; falls as you delete |
| Overflow (4-bit) | Pr[≥16] ≈ (ln2)¹⁶/16! | — | ≈ 10⁻¹⁶ — essentially never |