Lợi ích của việc sử dụng bộ lọc nở là gì?


108

Tôi đang đọc các bộ lọc nở và chúng có vẻ ngớ ngẩn. Bất cứ điều gì bạn có thể thực hiện với bộ lọc nở, bạn có thể hoàn thành trong ít không gian hơn, hiệu quả hơn, bằng cách sử dụng một hàm băm duy nhất thay vì nhiều hoặc đó là những gì có vẻ như vậy. Tại sao bạn sử dụng bộ lọc nở và nó hữu ích như thế nào?


5
bạn đã đọc bài viết trên wikipedia chưa? Nó giải thích những lợi thế khá tốt. en.wikipedia.org/wiki/Bloom_filter
Alex Budovski,

@david điều đó có vẻ khó xảy ra. k hàm băm trong không gian không đổi sẽ có nhiều va chạm hơn so với một hàm băm đơn lẻ trong không gian không đổi.
nhức đầu

1
@Alex Tôi đã đọc bài viết trên wikipedia. Tôi hiểu những gì được nói ở đó, nhưng tôi không hiểu tại sao nó tốt hơn chút nào. Tại sao nó hoạt động là trực quan. Tại sao nó hữu ích là không.
nhức đầu

Nhà văn này làm rất tốt với nó michaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo, Bài viết được liên kết jasondavies.com/bloomfilter thì tốt hơn.
Pacerier

Câu trả lời:


155

Từ Wikipedia :

Bộ lọc Bloom có ​​lợi thế mạnh về không gian so với các cấu trúc dữ liệu khác để biểu diễn các tập hợp, chẳng hạn như cây tìm kiếm nhị phân tự cân bằng, các lần thử, bảng băm hoặc các mảng đơn giản hoặc danh sách liên kết của các mục nhập. Hầu hết trong số này yêu cầu lưu trữ ít nhất bản thân các mục dữ liệu, có thể yêu cầu ở bất kỳ đâu từ số lượng bit nhỏ, đối với số nguyên nhỏ, đến số lượng bit tùy ý, chẳng hạn như đối với chuỗi (cố gắng là ngoại lệ, vì chúng có thể chia sẻ bộ nhớ giữa phần tử có tiền tố bằng nhau). Các cấu trúc được liên kết phát sinh thêm phí không gian tuyến tính cho các con trỏ. Mặt khác, bộ lọc Bloom với sai số 1% và giá trị tối ưu của k chỉ yêu cầu khoảng 9,6 bit cho mỗi phần tử - bất kể kích thước của các phần tử. Ưu điểm này một phần đến từ sự nhỏ gọn, kế thừa từ các mảng, và một phần từ tính chất xác suất của nó. Nếu tỷ lệ dương tính giả 1% có vẻ quá cao, mỗi lần chúng tôi thêm khoảng 4,8 bit cho mỗi phần tử, chúng tôi giảm nó đi mười lần.

Tôi khá rõ ràng.

Bộ lọc nở không tự lưu trữ các yếu tố, đây là điểm quan trọng. Bạn không sử dụng bộ lọc nở để kiểm tra xem một phần tử có tồn tại hay không, bạn sử dụng nó để kiểm tra xem nó có chắc chắn không có mặt hay không , vì nó đảm bảo không có âm tính giả. Điều này cho phép bạn không làm thêm công việc đối với các phần tử không tồn tại trong một tập hợp (chẳng hạn như IO đĩa để tra cứu chúng).

Và tất cả trong không gian ít hơn đáng kể so với một cái gì đó như bảng băm (có thể sẽ nằm một phần trên đĩa cho các tập dữ liệu lớn). Mặc dù bạn có thể sử dụng bộ lọc bloom kết hợp với một cấu trúc như bảng băm, nhưng khi bạn chắc chắn phần tử có cơ hội hiện diện.

Vì vậy, một mẫu sử dụng ví dụ có thể là:

Bạn có rất nhiều dữ liệu, trên đĩa - bạn quyết định lỗi nào bị ràng buộc mà bạn muốn (ví dụ: 1%), quy định giá trị của m . Khi đó k tối ưu được xác định (từ công thức được đưa ra trong bài báo). Bạn điền bộ lọc của mình từ dữ liệu liên kết đĩa này một lần.

Bây giờ bạn có bộ lọc trong RAM. Khi bạn cần xử lý một số phần tử, bạn truy vấn bộ lọc của mình để xem liệu nó có cơ hội tồn tại trong tập dữ liệu của bạn hay không. Nếu không, không có công việc bổ sung nào được thực hiện. Không có đĩa nào đọc, v.v. (Bạn sẽ phải làm gì nếu đó là băm hoặc cây, v.v.).

Ngược lại, nếu bộ lọc nói "Có, nó ở đó", có 1% khả năng là nó sai, vì vậy bạn thực hiện công việc cần thiết để tìm ra. 99% thời gian, nó thực sự sẽ ở đó, vì vậy công việc không phải là vô ích.


2
Nếu nó rõ ràng, xin vui lòng trả lời. Làm thế nào điều này có thể hiệu quả hơn về không gian so với một hàm băm đơn lẻ trên cùng một tập hợp có kích thước? Điều này chỉ đơn giản là sẽ tạo ra nhiều va chạm hơn. Bạn sẽ phải tìm kiếm các hàm băm riêng biệt để đảm bảo bạn có 1 ở tất cả các hàm băm. Tôi không hiểu đó là lợi thế so với việc sử dụng một hàm băm.
nhức đầu

19
Hàm băm là mã, không phải dữ liệu. Bạn định sử dụng hàm băm với mục đích gì? Một bảng băm? Trong trường hợp đó, bảng của bạn sẽ cần lưu trữ các khóa, có thể có kích thước tùy ý, không giống như bộ lọc nở. Đoạn trích có đề cập đến điều này.
Alex Budovski

3
Hãy xem xét một bộ lọc nở chỉ có một hàm băm, thay vì k. Lợi thế của việc thêm nhiều hàm băm là gì? Điều này đơn giản sẽ tạo ra nhiều va chạm hơn. Hoặc là tôi sai?
nhức đầu

2
Điều đó được trả lời bởi đoạn cuối trong "Lợi thế về không gian và thời gian" trong bài viết trên Wikipedia, và phần "Xác suất dương tính giả".
Alex Budovski

4
Nó vừa nhấp. Cảm ơn bạn rất nhiều, điều này đã làm tôi nghe trộm một thời gian. Nó làm giảm số lượng dương tính giả bởi vì dương tính giả sẽ cần phải a) là một xung đột trên tất cả các hàm băm của bạn hoặc b) tất cả các khoảng trống đã được lấp đầy bởi các giá trị khác. Tôi đoán là việc chọn kích cỡ phải là một quá trình phức tạp. Hãy sửa cho tôi nếu tôi sai, nhưng tôi nghĩ rằng tôi đã hiểu. Cảm ơn tất cả mọi người.
nhức đầu

156

Alex đã giải thích nó khá tốt. Đối với những người vẫn chưa hiểu rõ về nó, hy vọng ví dụ này sẽ giúp bạn hiểu:

Giả sử tôi làm việc cho Google, trong nhóm Chrome và tôi muốn thêm một tính năng vào trình duyệt để thông báo cho người dùng nếu url anh ta đã nhập là một URL độc hại. Vì vậy, tôi có một tập dữ liệu khoảng 1 triệu URL độc hại, kích thước của tệp này là khoảng 25MB. Vì kích thước khá lớn, (lớn so với kích thước của chính trình duyệt), tôi lưu trữ dữ liệu này trên một máy chủ từ xa.

Trường hợp 1: Tôi sử dụng hàm băm với bảng băm. Tôi quyết định chọn một hàm băm hiệu quả và chạy tất cả 1 triệu url thông qua hàm băm để nhận các khóa băm. Sau đó, tôi tạo một bảng băm (một mảng), trong đó khóa băm sẽ cung cấp cho tôi chỉ mục để đặt URL đó. Vì vậy, bây giờ khi tôi đã băm và lấp đầy bảng băm, tôi kiểm tra kích thước của nó. Tôi đã lưu trữ tất cả 1 triệu URL trong bảng băm cùng với các khóa của chúng. Vì vậy, kích thước tối thiểu là 25 MB. Bảng băm này, do kích thước của nó sẽ được lưu trữ trên một máy chủ từ xa. Khi một người dùng đến và nhập một URL vào thanh địa chỉ, tôi cần kiểm tra xem nó có độc hại không. Vì vậy, tôi chạy URL thông qua hàm băm (bản thân trình duyệt có thể làm điều này) và tôi nhận được khóa băm cho URL đó. Bây giờ tôi phải đưa ra yêu cầu tới máy chủ từ xa của mình bằng khóa băm đó, để kiểm tra xem URL cụ thể trong bảng băm của tôi với khóa cụ thể đó có giống với những gì người dùng đã nhập hay không. Nếu có thì nó là độc hại và nếu không thì nó không độc. Vì vậy, mỗi khi người dùng nhập một URL, một yêu cầu tới máy chủ từ xa phải được thực hiện để kiểm tra xem đó có phải là một URL độc hại hay không. Điều này sẽ mất rất nhiều thời gian và do đó làm cho trình duyệt của tôi chậm đi.

Trường hợp 2: Tôi sử dụng bộ lọc nở. Toàn bộ danh sách 1 triệu URL được chạy qua bộ lọc bloom bằng cách sử dụng nhiều hàm băm và các vị trí tương ứng được đánh dấu là 1, trong một mảng lớn các số 0. Giả sử chúng tôi muốn tỷ lệ dương tính giả là 1%, sử dụng máy tính bộ lọc nở ( http://hur.st/bloomfilter?n=1000000&p=0.01), chúng tôi nhận được kích thước của bộ lọc nở được yêu cầu chỉ là 1,13 MB. Kích thước nhỏ này được mong đợi là, mặc dù kích thước của mảng rất lớn, chúng tôi chỉ lưu trữ các số 1 hoặc 0 chứ không phải các URL như trong trường hợp bảng băm. Mảng này có thể được coi là một mảng bit. Đó là, vì chúng ta chỉ có hai giá trị 1 và 0, chúng ta có thể đặt các bit riêng lẻ thay vì các byte. Điều này sẽ làm giảm không gian được sử dụng 8 lần. Bộ lọc bloom 1,13 MB này, do kích thước nhỏ, có thể được lưu trữ trong chính trình duyệt web !! Do đó, khi người dùng truy cập và nhập URL, chúng tôi chỉ cần áp dụng các hàm băm cần thiết (trong chính trình duyệt) và kiểm tra tất cả các vị trí trong bộ lọc bloom (được lưu trữ trong trình duyệt). Giá trị 0 ở bất kỳ vị trí nào cho chúng tôi biết rằng URL này HOÀN TOÀN KHÔNG nằm trong danh sách các URL độc hại và người dùng có thể tiếp tục tự do. Vì vậy, chúng tôi đã không thực hiện cuộc gọi đến máy chủ và do đó tiết kiệm thời gian. Giá trị 1 cho chúng ta biết rằng URL CÓ THỂ nằm trong danh sách các URL độc hại. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. bộ lọc nhỏ trong trình duyệt hiển thị và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. bộ lọc nhỏ trong trình duyệt hiển thị và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%.

Vì vậy, bằng cách sử dụng bộ lọc nở nhỏ trong trình duyệt, chúng tôi đã tiết kiệm được rất nhiều thời gian vì chúng tôi không cần thực hiện lệnh gọi máy chủ cho mỗi URL được nhập.

Chúng ta có thể thấy rằng bảng băm với một hàm băm duy nhất được sử dụng cho một mục đích khác hoàn toàn so với một bộ lọc nở. Hy vọng rằng điều này xóa nghi ngờ của bạn :)

chỉnh sửa :

Tôi đã triển khai một bộ lọc nở cho nhiệm vụ kiểm tra URL độc hại bằng Python. Bạn có thể tìm thấy mã tại đây - https://github.com/tarunsharma1/Bloom-Filter Mã rất đơn giản để hiểu và mô tả chi tiết được cung cấp trong tệp readme.


3
Cảm ơn vì một tình huống sử dụng.
con sóc.

1
Tôi không hiểu được phần băm và liên kết giá trị 0 hoặc 1. Nếu chúng tôi đang sử dụng một mảng và lưu trữ 0 và 1 trong những mảng đó, làm cách nào để chúng tôi tìm kiếm giá trị băm của một url khi chúng tôi thực hiện kiểm tra ?
divinedragon

1
Vì vậy, về cơ bản, chúng tôi sử dụng một cái gì đó được gọi là hàm băm..trong đó URL dưới dạng chuỗi..và đưa ra một số..chúng tôi sử dụng số này và đặt giá trị chỉ số mảng tương ứng thành 1. Tồn tại một số hàm băm khác nhau, nhưng điều quan trọng là mỗi khi cùng một URL được chuyển qua một hàm băm, nó phải tạo ra cùng một số. Một ví dụ về hàm băm có thể là thêm các giá trị ascii của tất cả các ký tự trong một URL. Trong bộ lọc bloom, chúng tôi sử dụng nhiều hàm băm và đặt tất cả các giá trị chỉ số mảng đó thành 1. Hy vọng điều này đã giải tỏa được nghi ngờ của bạn.
Tarun

1
Một bảng băm thông thường như C # HashSet<String>sẽ sử dụng 16 byte cho mỗi phần tử phần tử trong trường hợp tốt nhất trong đó bảng băm hoàn toàn đầy: 4 byte ánh xạ từ một "thùng" đến một mục trong bảng mục (một mảng được liên kết đơn lẻ danh sách), 4 byte cho mã băm được lưu trong bộ nhớ cache, 4 byte cho con trỏ "tiếp theo", 4 byte cho một con trỏ tới khóa. Và đó là không tính kích thước chuỗi. Trong trường hợp xấu nhất, đó là 40 byte: một nửa mục nhập không được sử dụng và 20 byte cho mỗi mục nhập khi Stringcon trỏ mở rộng thành 8 byte cho kiến ​​trúc 64 bit.
Qwertie

Bạn không cần phải lưu chính Chuỗi trong tập băm. Bạn có thể lưu hàm băm của nó dưới dạng giá trị, làm cho bộ băm nhỏ hơn nhiều. Sau đó, bạn có thể chơi với kích thước băm - kích thước càng lớn thì tỷ lệ dương tính giả càng nhỏ.
user1028741

24

Tôi sẽ bắt đầu với phần giải thích về bộ lọc bloom là gì, nó có thể làm gì và không thể làm gì, tại sao chúng ta cần nó, hiển thị mô tả trực quan cách nó hoạt động và sau đó đưa ra một số ví dụ khi chúng có thể hữu ích.

Vì vậy, một bộ lọc nở tiêu chuẩn là một cấu trúc dữ liệu xác suấtcó thể * :


  • thêm phần tử vào một tập hợp
  • kiểm tra xem một phần tử có trong tập hợp hay không bằng cách nói definitely not in the sethoặcpossibly in the set

Đây possibly in the setchính là lý do tại sao nó được gọi là xác suất. Sử dụng các từ thông minh, nó có nghĩa là dương tính giả là có thể (có thể có trường hợp nó nghĩ sai rằng nguyên tố là tích cực) nhưng âm tính giả là không thể.

Nhưng nó không thể * :

  • xóa một mục khỏi tập hợp
  • cung cấp cho bạn danh sách tất cả các phần tử hiện có trong tập hợp của bạn

* Bộ lon / không này dành cho bộ lọc nở cơ bản. Bởi vì đây là một cấu trúc dữ liệu hữu ích đã được tạo ra cách đây rất lâu, mọi người đã tìm thấy cách tăng cường nó với các tính năng hữu ích khác.


Nhưng chờ một chút: chúng ta đã biết một cấu trúc dữ liệu có thể trả lời tất cả những điều này mà không mơ hồ 'có thể' và cũng không có tất cả các giới hạn (không thể xóa, không thể hiển thị tất cả). Và nó được gọi là tập hợp . Và đây là một ưu điểm chính của bộ lọc nở: nó tiết kiệm không gian và không đổi .

Điều này có nghĩa là không quan trọng chúng ta lưu trữ bao nhiêu phần tử ở đó, không gian sẽ giống nhau. Có, một bộ lọc nở có 10^6các phần tử (bộ lọc nở vô dụng) sẽ lấy cùng một lượng không gian như một bộ lọc nở có 10^20các phần tử và cùng một không gian với bộ lọc nở có 0các phần tử. Vậy nó sẽ chiếm bao nhiêu dung lượng? Điều đó là do bạn quyết định (nhưng có một sự đánh đổi: bạn càng có nhiều yếu tố thì bạn càng không chắc chắn về bạnpossible in the set câu trả lời của .

Một điều thú vị nữa là nó là không gian không đổi. Khi bạn lưu dữ liệu vào một tập hợp, bạn phải thực sự lưu dữ liệu này. Vì vậy, nếu bạn lưu trữthis long string in the set bạn phải sử dụng ít nhất 27 byte không gian. Nhưng đối với lỗi 1% và giá trị tối ưu của k ** , bạn sẽ cần ~ 9,6 bit (<2 byte) cho mỗi phần tử bất kỳ (cho dù đó là một số nguyên ngắn hay một bức tường văn bản lớn).

Một thuộc tính khác là tất cả các hoạt động đều sử dụng thời gian không đổi, hoàn toàn không giống với thời gian không đổi được khấu hao trong trường hợp của các bộ (hãy nhớ rằng nếu bộ có xung đột, nó có thể xấu đi trong O(n) thời gian).

** k là giá trị của các hàm băm được sử dụng trong bộ lọc nở


Tôi sẽ không mô tả cách hoạt động của bộ lọc nở (bài báo wikipedia làm rất tốt công việc giải thích mọi thứ). Ở đây tôi sẽ chỉ nói ngắn gọn những điều cơ bản.

  • bạn bắt đầu một mảng bit trống có độ dài m
  • bạn chon k các hàm băm khác nhau (càng độc lập càng tốt)
  • nếu bạn muốn thêm phần tử, bạn tính toán tất cả k băm của giá trị này và đặt các bit tương ứng thành 1
  • Nếu bạn muốn kiểm tra xem phần tử có tồn tại hay không, bạn cũng tính toán tất cả các hàm kbăm và nếu ít nhất một trong số chúng không được đặt, thì nó chắc chắn không có trong tập hợp. Nếu không, nó có thể nằm trong tập hợp.

Ngay cả mô tả này cũng đủ để hiểu tại sao chúng tôi không thể chắc chắn (bạn có thể lấy tất cả các bit được đặt từ nhiều giá trị khác nhau). Đây là một hình ảnh rất đẹp về cách nó hoạt động .

nhập mô tả hình ảnh ở đây


Vì vậy, khi nào bộ lọc bloom có ​​thể hữu ích? Câu trả lời ngắn gọn là ở mọi nơi có thể chấp nhận dương tính giả và nơi bạn muốn kiểm tra xem có thứ gì trong bộ , nhưng ngay cả khi chúng không, thì đó có thể là tuyến phòng thủ đầu tiên để loại trừ các cuộc gọi đắt tiền cho người xác minh.

Dưới đây là danh sách các mô tả cụ thể hơn:

  • một ví dụ tiêu chuẩn về các trang web độc hại và một trình duyệt được mô tả ở hầu hết mọi nơi đâu người ta nói về bộ lọc nở
  • mật khẩu yếu: thay vì có một bộ khổng lồ gồm tất cả các mật khẩu yếu có thể xảy ra, bạn chỉ có thể kiểm tra xem mật khẩu có chắc chắn không yếu hay không bằng một cách nhỏ hơn.
  • nếu bạn có danh sách các bài báo và danh sách người dùng, bạn có thể sử dụng bộ lọc bloom để hiển thị các bài viết của người dùng mà họ chưa đọc. Điều thú vị là bạn chỉ có thể có một bộ lọc (bạn kiểm tra xem có kết hợp user_id + article_id hay không)
  • bitcoin sử dụng bộ lọc bloom để đồng bộ hóa ví
  • Máy chủ web của Akamai sử dụng bộ lọc Bloom để ngăn "kỳ quan một lần" được lưu trữ trong bộ nhớ đệm đĩa của nó. One-hit-wonder là các đối tượng web được người dùng yêu cầu chỉ một lần, điều mà Akamai nhận thấy đã áp dụng cho gần 3/4 cơ sở hạ tầng bộ nhớ đệm của họ. Việc sử dụng bộ lọc Bloom để phát hiện yêu cầu thứ hai cho một đối tượng web và chỉ lưu vào bộ nhớ đệm đối tượng đó theo yêu cầu thứ hai của nó ngăn các kỳ quan một lần truy cập vào bộ nhớ cache của đĩa, giảm đáng kể khối lượng công việc của đĩa và tăng tỷ lệ truy cập bộ nhớ cache của đĩa (lấy từ các ví dụ trong bộ lọc của bloom bài viết tại wiki)

13

Bộ lọc Bloom khá hữu ích trong tin sinh học. Chúng có thể hiệu quả hơn về không gian so với việc sử dụng hàm băm thông thường, đặc biệt khi kích thước của các chuỗi bạn đang làm việc có thể lên đến hàng trăm triệu chữ cái với một bảng chữ cái rất nhỏ, tức là {A, G, T, C}. Chúng thường được sử dụng để đánh giá liệu một k-mer nhất định có hay không có trong bộ gen. Có một ví dụ về một cái được sử dụng cho một cái gì đó có liên quan ở đây .

BIÊN TẬP:

Nhiều hàm băm được sử dụng để giảm thiểu các kết quả dương tính giả. Hy vọng rằng giữa tất cả các hàm băm k, mỗi giá trị sẽ có một chữ ký duy nhất trong mảng bit so với mọi giá trị có thể có khác. Tuy nhiên, dương tính giả vẫn tồn tại, nhưng chúng có thể được giảm thiểu đến mức có thể quản lý được. Sử dụng kỹ thuật này, bạn băm các phần tử độc lập với kích thước của chúng. Khi bạn tìm kiếm chúng, bạn sử dụng từng hàm băm và kiểm tra để đảm bảo các giá trị bit của chúng đều là 1.

So sánh điều này với bộ gen người, trong đó sự gia tăng kích thước của phần tử sẽ làm tăng kích thước của bảng băm lên đáng kể (Kích thước bảng là 4 * 4 k ). Điều này giả sử bạn mã hóa các phần tử bằng cách sử dụng 2 bit / ký tự.


1
Xin lỗi, có thể tôi đang hiểu nhầm nhưng làm thế nào chúng có thể tiết kiệm không gian hơn so với một hàm băm thông thường? Hàm băm của một chuỗi là đầu ra có độ dài cố định và bạn chỉ cần đặt giá trị đó thành 0 hoặc 1. Đây cũng là những gì các bộ lọc bloom sẽ làm, nhưng các bộ lọc bloom sẽ làm điều đó trên nhiều hàm băm. Tôi đang hiểu sai ở đâu?
nhức đầu

Nó không có ích gì nhiều nếu chỉ lưu trữ một hàm băm. Sau đó, nó sẽ không có cách nào để xử lý xung đột băm. Hầu hết các triển khai bảng băm đều có cách xử lý vấn đề này gây ra chi phí. Ví dụ, từ điển Python lưu trữ khóa cùng với mã băm và bắt đầu thăm dò tuyến tính khi va chạm. Bộ lọc nở cắt bỏ điều đó và cố gắng giảm thiểu thiệt hại vốn có để làm như vậy bằng cách sử dụng nhiều hàm băm.
Bret Fontecchio

1
Tại sao không tạo bộ lọc nở mà chỉ với một hàm băm? có thể là hàm băm "tương đối lớn". Nhưng một thay vì nhiều
giorgim

7

Nếu bộ lọc Bloom trả về một mục là thành viên của tập hợp, thì có một xác suất nhất định cho dương tính giả. Nếu chỉ một hàm băm duy nhất được sử dụng để chỉ ra thành viên trong tập hợp, xác suất dương tính giả sẽ cao hơn so với việc sử dụng nhiều hàm băm.


Cần một số chi tiết nghiêm túc về câu trả lời: " xác suất dương tính giả sẽ cao hơn so với việc sử dụng nhiều hàm băm " ...
Pacerier
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.