Как я могу получить размер набора фильтров Блума при использовании функции объединения или пересечения? - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь получить размер набора фильтра Блума при использовании функций объединения и пересечения фильтра Блума с пакетом python (https://github.com/jaybaird/python-bloomfilter.git)

Я думал, что после выполнения функции 'union' или 'intersection', я мог бы получить результат, добавив функцию len (), но она просто выводит только вывод '0'.

from pybloom import BloomFilter
bf1 = BloomFilter(1000)
bf2 = BloomFilter(1000)

# After adding some elements to bf1 and bf2
print(len(bf1.union(bf2)))
# expected max(len(bf1), len(bf2)) but the result was 0

После того, как я нашел страницу документа, я понял, что опция len () отключена после функции 'union' и ее фактический результат len () был равен 0.

Вместо этого я хочу приблизить размер набора фильтров Блума. У вас есть идея, чтобы рассчитать его размер?

1 Ответ

2 голосов
/ 01 апреля 2019

Реализация копирует только BloomFilter bitarray , то есть self.bitarray.Элементы self.count в предыдущих фильтрах не учитываются в.

Так что это не объединяет элементы - но делает битовый массив or.


Обновление:

В большинстве случаев вам не нужно приближать счет.Он обеспечил точное количество элементов при вызове add, и вы можете просто позвонить len(bf3).К сожалению, новый созданный bf3 не был назван add, поэтому len(bf3) == 0.

Для формулы для приблизительного количества элементов,

- m / k * ln(1- n / m)

У вас есть

import math.log as ln

m = bf3.bitarray.length()
n = bf3.bitarray.count()
k = bf3.num_slices

# given m=20, n=8, approximate n elements as 5.89
...