فیلتر بلوم
عضویت در مجموعه را با یک آرایهی بیتی و چند تابع درهمسازی میسنجد: «قطعاً نیست» یا «شاید هست»، با حافظهی خیلی کم.
فیلتر بلوم یک آرایهی m بیتی و k تابع درهمسازی است (اینجا m = 16 و k = 2):
- زمان:
O(k) per key for k hash functions - حافظه:
m bits - هوروویتز–ساهنی، فصل ۸
پرسوجوی ۱۲ که درج شده؛ هر دو بیتش یک است: «شاید هست» (و واقعاً هست).
def bloom_filter(keys, query):m = 16bits = [0] * mfor key in keys:for seed in (3, 7):h = (key * seed + 1) % mbits[h] = 1for seed in (3, 7):h = (query * seed + 1) % mif bits[h] == 0:return Falsereturn True
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
keys list
Call stack
- bloom_filter()خط 1
رشد تعداد عملیات با اندازهی ورودی
میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.
- set_bit
- ورودی فعلی (n=4)
نمایش به شکل جدول
| n | set_bit |
|---|---|
| 4 | 8 |
| 6 | 12 |
| 8 | 16 |
| 10 | 20 |
| 12 | 24 |
توضیح
ایده
فیلتر بلوم یک آرایهی m بیتی و k تابع درهمسازی است (اینجا m = 16 و k = 2):
- درج: برای کلید، بیتهای
h₁(key)وh₂(key)را یک کن. - پرسوجو: اگر حتی یکی از بیتهای
h₁(q)وh₂(q)صفر بود،qقطعاً درج نشده. اگر همه یک بودند،qشاید درج شده باشد.
چرا «شاید»؟
بیتها را کلیدهای مختلف با هم یک میکنند. ممکن است بیتهای یک کلید درجنشده را کلیدهای دیگر یک کرده باشند: مثبت کاذب. ولی منفی کاذب هیچوقت پیش نمیآید. ورودی «مثبت کاذب» یک نمونه است.
هزینه و کاربرد
حافظه فقط m بیت است، هر چقدر هم کلیدها بزرگ باشند. برای همین فیلتر بلوم جلوی جستجوهای گران را میگیرد: مثلاً پایگاه داده قبل از خواندن دیسک میپرسد «شاید هست؟» و اگر جواب «قطعاً نیست» بود، دیسک را نمیخواند.
در trace به چه چیزی نگاه کنی
- میلهها همان بیتها هستند (۰ یا ۱)؛ فلش
hبیتی است که تنظیم یا بررسی میشود. - ورودی «فیلتر شلوغ» را ببین: تقریباً همهی بیتها یک شدهاند.