Làm thế nào để bộ lọc nở có thể mở rộng hoạt động?


15

Tôi đã đọc các bộ lọc nở có thể mở rộng và không thể hiểu được mỗi lần bộ lọc nở thành phần lấp đầy, bộ lọc nở mới với kích thước lớn hơn được thêm vào.

Các phần tử đóng góp cho các bit được đặt trong các bộ lọc được tạo ban đầu không thể được tìm kiếm để hiện diện. Có lẽ tôi sai trong sự hiểu biết của tôi về điều này?

Tôi hiểu bộ lọc nở hoa cơ bản. Tuy nhiên, tôi không thể quấn đầu xung quanh các bộ lọc nở năng động.

Câu trả lời:


7

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 ).


Không có thảo luận về các bộ lọc Bloom trong bài báo đó, vì vậy không thấy bất kỳ lời biện minh nào cho "quy tắc năm mươi phần trăm" này ở đây. Một tiên nghiệm, tôi mong đợi "quy tắc năm mươi phần trăm" chỉ là một số người tập trung vào mọi người xung quanh bởi vì câu trả lời thực sự bao gồm một loạt các cân nhắc vượt ra ngoài tiêu chí thiết kế mô-đun cụ thể của họ.
Jeff Burdges

1
Này @JeffBurdges, bạn có thấy ít nhất là tò mò rằng hai khái niệm này rất giống nhau không?
Jon Bringhurst

4

Một mục nằm trong bộ lọc nở có thể mở rộng nếu bất kỳ bộ lọc nào trả về đúng. Do đó, bạn có thể thêm các bộ lọc mà không ảnh hưởng đến các truy vấn thành viên cho các mục trước đó.

Để đảm bảo bạn vẫn có bảo đảm dương tính giả trong trường hợp xấu nhất, các bộ lọc mới được thêm vào với tỷ lệ dương tính giả làm giảm hình học. Ví dụ: bộ lọc đầu tiên có tỷ lệ dương sai p, thứ hai rp, thứ ba r^2p, v.v ... Xác suất của dương tính giả trên bộ lọc nở có thể mở rộng được giới hạn bởi liên kết ràng buộc : sum_{k>=0} r^k p = p/(1-r).


3
'R' thể hiện điều gì trong các công thức này?
zslayton

1

Tôi đã đọc các bộ lọc nở có thể mở rộng và không thể hiểu được mỗi lần bộ lọc nở thành phần lấp đầy, bộ lọc nở mới với kích thước lớn hơn được thêm vào.

Các phần tử đóng góp cho các bit được đặt trong các bộ lọc được tạo ban đầu không thể được tìm kiếm để hiện diện. Có lẽ tôi sai trong cách hiểu của tôi về điều này?

Xin chào,
Ý tưởng cơ bản là thêm vào bộ lọc đầu tiên cho đến khi trường bit của bộ lọc cấp đầu tiên được bão hòa. Bị bão hòa không có nghĩa là mỗi bit được sử dụng, nhưng nó có nghĩa là bộ lọc chứa rất nhiều mục nhập mà các mục nhập bổ sung sẽ tạo ra quá nhiều dương tính giả.

Từ điểm bão hòa, bất kỳ mục mới nào sẽ không được thêm vào bộ lọc bão hòa, mà vào bộ lọc phụ mới và lớn hơn (bộ lọc cấp hai).

Để tìm giá trị, bạn sẽ tìm kiếm nó trong bộ lọc cấp đầu tiên và nếu bạn không thể tìm thấy nó ở đó, bạn sẽ tìm kiếm nó trong bộ lọc cấp hai. Nếu bạn có thể tìm thấy nó trong bất kỳ bộ lọc nào trong số này, thì đó là (được biết đến) với bộ lọc (dương tính giả có thể xảy ra do bản chất của bộ lọc Bloom). Nếu bạn không thể tìm thấy giá trị trong bất kỳ bộ lọc nào, bộ lọc được đảm bảo không nhìn thấy nó. Tất nhiên, điều này có thể được thể hiện dưới dạng cấu trúc dữ liệu đệ quy.

Bạn có thể muốn đọc bài đăng trên blog của tôi có chứa triển khai bộ lọc Bloom có ​​thể mở rộng trong Java và giải thích cách thức hoạt động của nó một cách chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.