Дозвольте мені спробувати це зробити, щоб побачити, наскільки я можу його відрізати. :-)
Отже, для початку потрібно мати можливість створити звичайний фільтр цвітіння, який дозволяє встановити кінцеву кількість елементів з максимальною ймовірністю помилкового додатного. До того, як спробувати створити масштабовану реалізацію, потрібно додати ці функції до вашого базового фільтра.
Перш ніж ми спробуємо контролювати та оптимізувати, яка ймовірність, давайте розберемося, яка ймовірність для заданого розміру фільтра цвітіння.
Спочатку ми розділили бітфілд на кількість хеш-функцій (загальна кількість біт / кількість хеш-функцій = зрізів), щоб отримати k фрагментів бітів, які представляють кожну хеш-функцію, тому кожен елемент завжди описується k бітами.
Якщо збільшити кількість фрагментів або кількість бітів на фрагмент, ймовірність помилкових позитивних результатів зменшиться.
З цього випливає, що в міру додавання елементів більше бітів встановлюється на 1, тому помилкові позитивні збільшуються. Ми називаємо це "коефіцієнтом заповнення" кожного шматочка.
Коли фільтр містить велику кількість даних, ми можемо припустити, що ймовірність помилкових спрацьовувань цього фільтра - це коефіцієнт заповнення, піднятий до кількості зрізів (Якщо насправді слід було порахувати біти, а не використовувати коефіцієнт, це спрощує перестановка з проблемою повторення).
Отже, як ми з'ясуємо, як підібрати ймовірність помилкових спрацьовувань у фільтрі цвітіння? Ми можемо змінити кількість скибочок (що вплине на коефіцієнт заповнення).
Щоб розібратися, скільки скибочок у нас повинно бути, ми почнемо з з'ясування оптимального співвідношення заливки для скибочки. Оскільки коефіцієнт заповнення визначається кількістю бітів у зрізі, який дорівнює 1 проти кількості бітів, який дорівнює 0, ми можемо визначити, що кожен біт залишатиметься невстановленим з вірогідністю (100% - (1 / біт у зрізі) ). Оскільки у нас буде вставлено кілька елементів, у нас є ще одна перестановка з проблемою репутації, і ми розширюємо речі до очікуваного коефіцієнта заповнення, який становить (100% - ((100% - (1 / біт у шматочку)) ^ "елементи вставлені")). Ну, виявляється, це дуже схоже на інше рівняння. У роботі вони відносять коефіцієнт заповнення до іншого рівняння, тому воно добре вписується в ряд Тейлора (1 -е ^ (- п / м)). Після трохи обмивання цього виходить, що оптимальне співвідношення заливки завжди становить близько 50%,
Отже, оскільки ймовірність фільтра - це коефіцієнт заповнення, піднятий до кількості скибочок, ми можемо заповнити 50% і отримати P = (50%) ^ k або k = log_2 (1 / P). Потім ми можемо скористатися цією функцією для обчислення кількості фрагментів, які ми повинні генерувати для даного фільтра, у списку фільтрів для фільтра масштабованого цвітіння.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Редагувати: Після написання цього слова я натрапив на згадку про "п’ятдесятивідсоткове правило" під час читання динамічного розподілу пам’яті, заснованого на системі приятелів, в TAoCP Vol 1, pp 442-445, з набагато більш чистими міркуваннями проти підгонки кривої до (1 -е ^ (- п / м)). Кнут також посилається на статтю "Правило п'ятдесяти відсотків переглянуто" з деякою інформацією про концепцію ( pdf доступна тут ).