Bloom filter с несколькими hash-функциями

MediumАлгоритмы
06:00
Лучше работает на десктопе
AlgorithmsHashingProbabilistic Data Structures
Реальный собес00:01:15-00:48:452026-01-08 16-06-07.movСтраница собеса

Реализуйте упрощенный Bloom filter.

Есть битовый массив размера size, num_hashes hash-функций и список операций:

- ["add", value] — добавить строку в фильтр;
- ["check", value] — проверить строку.

Для check верните "MAYBE_EXISTS", если все нужные биты выставлены, иначе "DOES_NOT_EXIST".

Чтобы автотесты были детерминированными, используйте стабильный hash:

def stable_hash(item: str, salt: int, size: int) -> int:
    total = 0
    for ch in f"{salt}:{item}":
        total = (total * 131 + ord(ch)) % size
    return total

Сигнатура

def bloom_filter_trace(size: int, num_hashes: int, operations: list[list[str]]) -> list[str]:

Примеры

Пример 1

Вход:
size = 32
num_hashes = 3
operations = [["add","hello"],["check","hello"],["check","world"]]
Выход:["MAYBE_EXISTS","DOES_NOT_EXIST"]

Пример 2

Вход:
size = 1
num_hashes = 2
operations = [["add","alpha"],["check","beta"]]
Выход:["MAYBE_EXISTS"]

Маленький фильтр дает false positive

Пример 3

Вход:
size = 10
num_hashes = 2
operations = [["add","a"],["add","b"],["check","a"],["check","c"],["add","c"],["check","c"]]
Выход:["MAYBE_EXISTS","DOES_NOT_EXIST","MAYBE_EXISTS"]
Консоль
Нажмите Run или Ctrl+Enter для запуска