Bloom Filter là một cấu trúc dữ liệu có tính chất xác suất dùng để kiểm tra một phần tử có nằm trong một tập hợp hay không. Nó rất hiệu quả về mặt không gian lưu trữ và tốc độ. Bloom filter có thể trả lời hai câu hỏi chính:
Phần tử có thể nằm trong tập hợp (tính chất xác suất)
Hoặc, phần tử chắn chắn không nằm trong tập hợp
Bloom Filter được ứng dụng trong blockchain để lọc các transaction nhanh chóng trong các block. Bloom filter cũng được dùng trong các cơ sở dữ liệu Cassandra và Bigtable.
Cho bloom filter được khởi tạo là một chuỗi bit độ dài các giá trị :
Thêm một phần tử :
Dùng hàm hash phân biệt : để tính giá trị các giá trị index
Lần lượt set các phần tử ở vị trícủa bằng :
Tìm kiếm phần tử
Dùng hàm hash ở trên để tính các giá trị index cho giá trị :
Lần lượt kiếm tra tất cả các giá trị :
Nếu tồn tại bất kỳ một giá trị nào là thì kết luận phần tử chắc chắn không nằm trong tập hợp.
Ngược lại, phần tử có thể nằm trong tập hợp.
Để tối ưu hóa Bloom Filter, việc chọn số lượng hàm băm và kích thước mảng bit cho filter là cực kỳ quan trọng. Nếu quá nhỏ, tỷ lệ dương tính giả (false positive) sẽ cao; nếu quá lớn, mảng bit sẽ nhanh chóng bị lấp đầy bởi các số 1, cũng dẫn đến tăng tỷ lệ sai sót và tốn chi phí tính toán.
Gỉa sử ta có:
: Số lượng phần tử dự kiến sẽ thêm vào bộ lọc.
: Kích thước của mảng bit.
: Số lượng hàm băm (hash functions).
Xác suất để một bit cụ thể vẫn bằng 0 sau khi chèn phần tử là:
ổng số lần băm đã thực hiện là lần. Vì các hàm băm được giả định là độc lập và phân phối đều, xác suất để bit đó vẫn bằng 0 sau lần băm là:
Từ đó, xác suất để tất cả vị trí băm của một phần tử mới đều bằng 1 (dẫn đến False Positive) là:
Ta có, như đã đề cập ở trên thì suy ra:
Thay giá trị vừa tìm được vào công thức của :
Để tối thiểu hóa , ta có thể tối thiểu hóa giá trị logarit của nó (vì hàm là hàm đồng biến):
Để tìm cực trị, ta đặt và lấy đạo hàm theo :
Giải phương trình để đạo hàm bằng :
Phương trình này có dạng với . Do tính chất đối xứng, nghiệm duy nhất của phương trình này trong khoảng là:
Thay vào công thức lấy log 2 vế, giải ra ta có:
Với một giá trị và cho trước, tỷ lệ sai sót sẽ đạt giá trị nhỏ nhất khi:
Thông thường trong thực tế, bạn sẽ xác định trước tỷ lệ sai sót chấp nhận được (ví dụ hay 1%) và số lượng phần tử . Khi đó, kích thước mảng bit cần thiết được tính bằng:
Nghĩa là:
Để đạt tỷ lệ sai sót 1% (): Bạn cần khoảng 10 bit cho mỗi phần tử ().
Để đạt tỷ lệ sai sót 0.1% (): Bạn cần khoảng 14 bit cho mỗi phần tử.
Ví dụ: Giả sử có khoảng 1 triệu phần tử và muốn tỷ lệ sai số khoảng 2% thì:
Sử dụng công thức:
Và
No comments yet. Be the first to comment!