Bộ lọc Bloom

Bộ lọc Bloom, phát minh bởi Burton Howard Bloom năm 1970,[1] là một cấu trúc dữ liệu xác suất để kiểm tra xem một phần tử có nằm trong một tập hợp hay không. Có thể có lỗi dương tính sai, nhưng không bao giờ có âm tính sai; nghĩa là kết quả thu được luôn là "nằm trong tập hợp (có thể sai)" hoặc "không nằm trong tập hợp". Có thể chèn thêm phần tử nhưng không thể xóa (nhược điểm này có thể được khắc phục bằng một bộ lọc đếm). Càng chèn nhiều phần tử thì xác suất dương tính sai càng cao.

Mô tả thuật toán

[sửa | sửa mã nguồn]
Một ví dụ của bộ lọc Bloom cho tập hợp {x, y, z}. Các mũi tên màu chỉ ra các vị trí mỗi phần tử ánh xạ đến. Phần tử w không nằm trong tập hợp {x, y, z}, bởi một trong các vị trí nó ánh xạ đến có giá trị 0. Trong ví dụ này, m=18 và k=3.

Một bộ lọc Bloom rỗng là một mảng m bit, tất cả đều bằng 0. Giả sử có k hàm băm khác nhau, mỗi hàm ánh xạ từ không gian các phần tử tới m vị trí trong bảng với xác suất như nhau. Thông thường k là một hằng số và nhỏ hơn nhiều so với m

Để chèn một phần tử, áp dụng k hàm băm để tính ra mảng k vị trí và gán cho các bit này giá trị 1.

Để kiểm tra một phần tử có nằm trong tập hợp hay không, áp dụng k hàm băm để tính ra k vị trí trong mảng và kiểm tra xem tất cả các bit đó có giá trị 1 hay không. Nếu có một bit nào đó bằng 0 thì phần tử cần kiểm tra chắc chắn không nằm trong mảng. Nếu tất cả chúng đều bằng 1 thì phần tử đó có thể nằm trong mảng.

Xác suất dương tính sai

[sửa | sửa mã nguồn]
Xác suất dương tính sai dưới dạng hàm số của số phần tử và kích thước của bộ lọc. Giả sử sử dụng hàm băm

Giả sử các hàm băm lựa chọn các vị trí trong bảng với xác suất như nhau và hoàn toàn ngẫu nhiên và độc lập. Nếu m là số bit trong mảng thì xác suất một bit không được gán giá trị 1 khi ta băm một phần tử bằng một hàm băm là

Xác suất nó không được gán giá trị 1 bởi bất kì hàm băm nào là

Nếu chèn n phần tử, thì xác suất bit đó vẫn bằng 0 là

nên xác suất nó bằng 1 là

Ta xét quá trình kiểm tra liệu một phần tử có nằm trong tập hay không. Thuật toán kiểm tra k vị trí trong mảng xem chúng có bằng 1 hay không. Xác suất tất cả chúng đều bằng 1 là

Chứng minh này không toàn toàn đúng do nó giả sử xác suất mỗi bit trong mảng được gán giá trị 1 là độc lập với nhau. Tuy nhiên, giả sử đây là một xấp xỉ tốt, thì giá trị tối ưu để xác suất trên là nhỏ nhất là

cho giá trị xác suất dương tính sai là

Có thể tính kích thước của mảng theo số phần tử và xác suất dương tính sai bằng cách thay giá trị tối ưu của vào biểu thức trên:

Đơn giản hóa biểu thức trên, ta thu được:

từ đó thu được:

Nghĩa là để xác suất sai là hằng số cố định, kích thước của mảng là tuyến tính với số phần tử của tập hợp.

  1. ^ Donald Knuth. “[[The Art of Computer Programming]], Hiệu đính cho quyển 3 (lần xuất bản thứ 2)”. Bản gốc lưu trữ ngày 6 tháng 3 năm 2012. Truy cập ngày 27 tháng 10 năm 2011. Tựa đề URL chứa liên kết wiki (trợ giúp)

Tham khảo

[sửa | sửa mã nguồn]
Chúng tôi bán
Bài viết liên quan
[ZHIHU]
[ZHIHU] "Bí kíp" trò chuyện để ghi điểm trong mắt bạn gái
Những cô gái có tính cách khác nhau thì thang điểm nói của bạn cũng sẽ khác
Nguồn gốc của mâu thuẫn lịch sử giữa hồi giáo, do thái và thiên chúa giáo
Nguồn gốc của mâu thuẫn lịch sử giữa hồi giáo, do thái và thiên chúa giáo
Mâu thuẫn giữa Trung Đông Hồi Giáo, Israel Do Thái giáo và Phương Tây Thiên Chúa Giáo là một mâu thuẫn tính bằng thiên niên kỷ và bao trùm mọi mặt của đời sống
Tóm tắt chương 226 Jujutsu Kaisen
Tóm tắt chương 226 Jujutsu Kaisen
Đột nhiên, Hiruguma nói rằng nếu tiếp tục ở trong lãnh địa, Gojo vẫn phải nhận đòn tất trúng
Đánh giá sơ bộ chung về giá trị của Cyno / Ayaka / Shenhe
Đánh giá sơ bộ chung về giá trị của Cyno / Ayaka / Shenhe
Shenhe hiện tại thiên về là một support dành riêng cho Ayaka hơn là một support hệ Băng. Nếu có Ayaka, hãy roll Shenhe. Nếu không có Ayaka, hãy cân nhắc thật kĩ trước khi roll