AlgoVerse

فیلتر بلوم

عضویت در مجموعه را با یک آرایه‌ی بیتی و چند تابع درهم‌سازی می‌سنجد: «قطعاً نیست» یا «شاید هست»، با حافظه‌ی خیلی کم.

فیلتر بلوم یک آرایه‌ی m بیتی و k تابع درهم‌سازی است (اینجا m = 16 و k = 2):

ادامه‌ی توضیح ↓
ورودی:
n=4 · target=12خروجی PDF

پرس‌وجوی ۱۲ که درج شده؛ هر دو بیتش یک است: «شاید هست» (و واقعاً هست).

  1. def bloom_filter(keys, query):
  2. m = 16
  3. bits = [0] * m
  4. for key in keys:
  5. for seed in (3, 7):
  6. h = (key * seed + 1) % m
  7. bits[h] = 1
  8. for seed in (3, 7):
  9. h = (query * seed + 1) % m
  10. if bits[h] == 0:
  11. return False
  12. return True

ناوردا: برای هر کلید درج‌شده، همه‌ی بیت‌های h₁(k) و h₂(k) یک‌اند؛ پس کلید درج‌شده هیچ‌وقت «قطعاً نیست» نمی‌گیرد.

شروع اجرا

50121202333

متغیرهای محلی

query12

نارنجی = در همین گام عوض شد

keys list

5122033

Call stack

  1. bloom_filter()خط 1
گام ۱ از ۴۴
خط سیاه = set_bit, probe · خط نارنجی = گام کلیدیhash: 0/8 · set_bit: 0/8 · probe: 0/2 · check: 0/2 · maybe: 0/1

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • set_bit
    • ورودی فعلی (n=4)
    01020304681012n = تعداد عضوهای آرایهset_bit
    نمایش به شکل جدول
    nset_bit
    48
    612
    816
    1020
    1224
    توضیح

    ایده

    فیلتر بلوم یک آرایه‌ی m بیتی و k تابع درهم‌سازی است (اینجا m = 16 و k = 2):

    • درج: برای کلید، بیت‌های h₁(key) و h₂(key) را یک کن.
    • پرس‌وجو: اگر حتی یکی از بیت‌های h₁(q) و h₂(q) صفر بود، q قطعاً درج نشده. اگر همه یک بودند، q شاید درج شده باشد.

    چرا «شاید»؟

    بیت‌ها را کلیدهای مختلف با هم یک می‌کنند. ممکن است بیت‌های یک کلید درج‌نشده را کلیدهای دیگر یک کرده باشند: مثبت کاذب. ولی منفی کاذب هیچ‌وقت پیش نمی‌آید. ورودی «مثبت کاذب» یک نمونه است.

    هزینه و کاربرد

    حافظه فقط m بیت است، هر چقدر هم کلیدها بزرگ باشند. برای همین فیلتر بلوم جلوی جستجوهای گران را می‌گیرد: مثلاً پایگاه داده قبل از خواندن دیسک می‌پرسد «شاید هست؟» و اگر جواب «قطعاً نیست» بود، دیسک را نمی‌خواند.

    در trace به چه چیزی نگاه کنی

    • میله‌ها همان بیت‌ها هستند (۰ یا ۱)؛ فلش h بیتی است که تنظیم یا بررسی می‌شود.
    • ورودی «فیلتر شلوغ» را ببین: تقریباً همه‌ی بیت‌ها یک شده‌اند.