Bloom Filter
Kiểm tra sự tồn tại của một phần tử mà không dùng đến bất kỳ vòng lặp nào???
Bài toán
Tèo: Cho bạn một mảng các phần tử
let A = ['Teoflio', 'Tun', 'Cuden',...]
Làm thế nào để kiểm tra xem phần tử X = 'Joseph' có ở trong mảng A này hay không?
Tủn: Quá dễ! For cái vèo là xong
let x = 'Joseph';
for (let i = 0; i < A.length; i++){
if ( A[i] == x ){
// Tìm thấy rồi nè! hehe
break;
}
}
Tèo: Ok! Khá lắm, vậy bây giờ không dùng vòng lặp, bạn làm được không???
Tủn: Ummm,... chắc không được! hahaha
Tèo: Vậy đây là lúc mà Bloom Filter phát huy tác dụng!
Thuật toán
Triển khai thuật toán Bloom Filter rất tiết kiệm về mặt bộ nhớ lưu trữ, vì bản chất Bloom Filter chỉ là một dãy các bit 0 1 (aka Mảng boolean,...).
Bloom Filter chỉ có nhiệm vụ đơn giản là bật bit 1 tại những vị trí "Đặc trưng cho phần tử X". Những dấu hiệu đặc trưng này có thể được tính toán và tìm ra bởi những Hàm băm Phi mã hóa (Non-cryptographic hash functions).
Hàm băm phi mã hóa
Giải thích sơ lược, khi nhét một phần tử bất kỳ vô hàm băm, kết quả trả về sẽ là một con số đại diện cho phần tử đó. Hàm băm sẽ cố gắng tìm ra những con số khác nhau cho mỗi phần tử khác nhau. Nhưng đôi khi, vẫn có sự trùng lặp con số này ở những phần tử khác nhau (Collision).
Last updated
Was this helpful?