https://blog.acolyer.org/2017/08/08/a-general-purpose-counting-filter-making-every-bit-count/amp/
Approximate Membership Query (AMQ). Example: Bloom filter.
Определять, принадлежит какой-то элемент данному множеству.
Не возвращают false negative (т.е. они говорят, что не принадлежат, хотя они принадлежат), но могут возвращать false positive.
=> Суммарно на вопрос “объект в множестве?” отвечают либо “No”, либо “Возможно”
Расширения: удаление, изменение размеров множеств, вести подсчет кол-ва, etc
4 недостатка Bloom фильтров:
В paper придумана новая AMQ структура: Counting Quotient Filter (подсчетный количественный фильтр) = CQF structure
Все недостатки Bloom фильтра ушли, очень хорошо работает (время, объем памяти)
В несколько раз быстрее Bloom Filter, cuckoo filter
Поддержка количества объекта - это огромный плюс
Обычный QF (долевой фильтр) -> RSQF (rank and reset based quotient filter) -> CQF
QF: 
храним в h0-вой ячейке h1 (домашняя), либо сдвиг на соседнюю.
QF использует чуть больше места, чем Bloom, но намного меньше, чем counting bloom.
QF скорость сравнима с Bloom.
QF лучше переиспользует cache значения, чем Bloom, поэтому лучше и быстрее работает на SSD
Производительность значительно падает после 60% наполнения
RSQF:
RANK(B,i) - возвращает кол-во 1-чек в B до позиции i
SELECT(B,i) - возвращает индекс первой 1-цы в B
обе функции будут бегать по occupieds, runends, remainders - плохо с кэшом, поэтому
добавлен offsets массив, который хранит дистанцию от слота i до runend, который соответствует этому слоту i. Для оптимизации, сохраняют только для каждого 64-го слота (uint8) -> 2.125 бита на слот
Т.е. делят на блоки по 64 записи, которые хранятся вместе -> все операции хорошо оптимизируются на machine-word операции PDEP, TZCNT
Counting Quotient Filters
Сравнение использование места  
CQF лучше почти всегда.
CQF может быть сделан мультитредовым (шарды, лочатся всегда по два)
Сравнение по производительности: