Я пытаюсь использовать фильтр Блума, чтобы определить, какие наборы из семейства наборов A1
, A2
,..., Am
являются подмножествами другого фиксированного набора Q
. Я надеюсь, что кто-то может проверить правильность изложенного подхода или предложить какие-либо улучшения.
Пусть Q
будет заданным набором целых чисел, содержащим от 1 до 10000 элементов из множества юниверсов U = {1,2,...,10000}
.
Кроме того, пусть имеется семейство наборов A1
, A2
,...,Am
, каждое из которых содержит от 1 до 3 элементов из одного набора юниверсов U
. Размер m
порядка 5000.
схема алгоритма:
Пусть имеется набор k
хеш-функций. Для каждого элемента Q
применяются хеш-функции и добавляются к набору битов размером n
, обозначенному Q_b
.
Кроме того, для каждого из наборов Ai
, i = 1,...,m
примените хеш-функции к каждому элементу Ai
, создав набор битов (также размером n
), обозначенный Ai_b
.
Чтобы проверить, является ли Ai
подмножеством Q
, выполните логическое И над двумя наборами битов, Q_b & Ai_b
, и проверьте, равен ли он набору битов Ai_b
. То есть, если Q_b & Ai_b == Ai_b
ложно, то мы знаем, что Ai
не является подмножеством Q
; если это правда, то мы не знаем наверняка (возможность ложного срабатывания) и нам нужно проверить данное Ai
с помощью детерминированного подхода.
Мы надеемся, что фильтр сообщит нам о большинстве Ai
, которых нет в Q
, и мы сможем более тщательно проверить те, которые возвращают true.
Хороший ли это подход для решения моей проблемы?
(Дополнительные вопросы: насколько большим должно быть n
? Какие хорошие хэш-функции можно использовать?)