Hãy để tôi thử bắn nó để xem tôi có thể bán nó bao nhiêu. :-)
Vì vậy, để bắt đầu, bạn cần có khả năng tạo bộ lọc nở thông thường cho phép số lượng phần tử hữu hạn với xác suất tối đa là dương tính giả. Việc bổ sung các tính năng này vào bộ lọc cơ bản của bạn là bắt buộc trước khi thử xây dựng một triển khai có thể mở rộng.
Trước khi chúng tôi cố gắng kiểm soát và tối ưu hóa xác suất là gì, hãy tìm hiểu xác suất của kích thước bộ lọc nở nhất định là bao nhiêu.
Đầu tiên chúng ta chia bitfield bằng cách có bao nhiêu hàm băm (tổng số bit / số hàm băm = lát) để lấy k lát bit đại diện cho mỗi hàm băm để mọi phần tử luôn được mô tả bởi k bit.
Nếu bạn tăng số lát hoặc số bit trên mỗi lát, xác suất dương tính giả sẽ giảm.
Nó cũng theo sau khi các phần tử được thêm vào, nhiều bit được đặt thành 1, do đó dương tính giả tăng lên. Chúng tôi gọi nó là "tỷ lệ lấp đầy" của mỗi lát.
Khi bộ lọc chứa một lượng lớn dữ liệu, chúng ta có thể giả sử rằng xác suất dương tính giả cho bộ lọc này là tỷ lệ lấp đầy được nâng lên số lát (Nếu chúng ta thực sự đếm các bit thay vì sử dụng tỷ lệ, điều này đơn giản hóa thành một hoán vị với vấn đề lặp lại).
Vậy, làm thế nào để chúng ta tìm ra cách chọn xác suất dương tính giả trong bộ lọc nở? Chúng tôi có thể sửa đổi số lát (sẽ ảnh hưởng đến tỷ lệ lấp đầy).
Để tìm ra có bao nhiêu lát chúng ta nên có, chúng ta bắt đầu với việc tìm ra tỷ lệ lấp đầy tối ưu cho một lát. Vì tỷ lệ lấp đầy được xác định bởi số bit trong một lát bằng 1 so với số bit bằng 0, nên chúng tôi có thể xác định rằng mỗi bit sẽ không được đặt với xác suất (100% - (1 / bit trong một lát) ). Vì chúng tôi sẽ có nhiều mục được chèn, chúng tôi có một hoán vị khác với vấn đề danh tiếng và chúng tôi mở rộng mọi thứ ra tỷ lệ lấp đầy dự kiến, đó là (100% - ((100% - (1 / bit trong một lát)) ^ "Các phần tử được chèn")). Chà, hóa ra điều này rất giống với phương trình khác. Trong bài báo, họ liên kết tỷ lệ lấp đầy với một phương trình khác để nó phù hợp độc đáo với một chuỗi taylor (1-e ^ (- n / m)). Sau một chút tương lai với điều này, hóa ra tỷ lệ lấp đầy tối ưu luôn ở mức khoảng 50%,
Vì vậy, vì xác suất của bộ lọc là tỷ lệ lấp đầy được nâng lên số lát, chúng ta có thể điền 50% và nhận P = (50%) ^ k hoặc k = log_2 (1 / P). Sau đó, chúng ta có thể sử dụng hàm này để tính toán số lát chúng ta nên tạo cho một bộ lọc nhất định trong danh sách các bộ lọc cho bộ lọc nở có thể mở rộng.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Chỉnh sửa: Sau khi viết bài này, tôi đã bắt gặp một đề cập đến "quy tắc năm mươi phần trăm" khi đọc về phân bổ bộ nhớ động dựa trên hệ thống bạn bè trong TAoCP Vol 1, trang 438-445 với lý do rõ ràng hơn so với khớp đường cong với (1 -e ^ (- n / m)). Knuth cũng tham khảo một bài báo "Quy tắc năm mươi phần trăm được xem xét lại" với một chút nền tảng về khái niệm này ( pdf có sẵn ở đây ).