ฟิลเตอร์บลูมนั้นเร็วกว่าแฮชหรือไม่?


16

ตัวกรอง Bloom ดูดีมากเมื่อคุณพิจารณาว่าคุณสามารถตรวจสอบว่า Int อยู่ในชุดที่มีความมั่นใจ 99% ในเวลาคงที่หรือไม่ แต่สามารถแฮชได้โดยมีความแตกต่างเพียงอย่างเดียวคือส่วนใหญ่เวลาที่คุณเข้าถึงหน่วยความจำเพียงครั้งเดียว ด้วยตัวกรองบานคุณต้องเข้าถึงพวกเขา ~ 7 ครั้งต่อคำขอในสถานที่ห่างไกลอย่างสมบูรณ์ดังนั้นคุณจะพลาดแคชหลายครั้งต่อคำขอ

ฉันพลาดอะไรไปรึเปล่า?


สถานที่ที่ห่างไกลอย่างสมบูรณ์อะไร มีเพียง m บิต ซึ่งอาจเหมาะกับการลงทะเบียนครั้งเดียวหรืออย่างน้อยที่สุดบรรทัดแคชเดียว

1
@delnan AFAIK มันใช้อะไรประมาณ 10 บิต / องค์ประกอบใช่ไหม? ดังนั้นสำหรับองค์ประกอบหลายพันรายการ - เช่นดาต้าสโตร์ขนาดใหญ่ - มันจะไม่พอดีกับแคช ดังนั้นหากคุณใช้kแฮชคุณอาจจะkพลาดแคชต่อการอ่าน ตารางแฮชในอีกทางหนึ่งรับประกันได้ว่าคุณจะได้รับคำตอบด้วย 0 แคชส่วนใหญ่แล้วการชนจะหายาก
MaiaVictor

คุณมี k บิตเป็นคาบ องค์ประกอบทั้งหมดมีผลต่อจำนวนบิตคงที่เหมือนกันนั่นคือสาเหตุที่อัตราบวกผิดพลาดขึ้นอยู่กับจำนวนรายการ

คำตอบ:


33

คุณพลาดวิธีที่โครงสร้างข้อมูลสองข้อจัดการกับการชนกันของแฮช ฟิลเตอร์บลูมไม่ได้เก็บค่าจริงดังนั้นพื้นที่ที่ต้องการคือขนาดคงที่ของอาเรย์ที่กำหนด แต่ถ้าคุณใช้แฮชแบบดั้งเดิมมันจะพยายามเก็บค่าทั้งหมดที่คุณให้มาแทนดังนั้นมันจึงเติบโตตามกาลเวลา

พิจารณาฟังก์ชั่นแฮชที่เรียบง่าย (เพื่อเป็นตัวอย่างเท่านั้น!) f(x) = x % 2(เพื่อประโยชน์ของตัวอย่างเท่านั้น!) 2, 3, 4, 5, 6, 7ตอนนี้คุณป้อนข้อมูลจำนวนเต็มต่อไปนี้:

แฮมาตรฐาน:ค่าที่กำหนดจะได้รับการถกกันและเราจบลงด้วยจำนวนมากของการชนกันเนื่องจากการและf(2) = f(4) = f(6) = 0 f(3) = f(5) = f(7) = 1อย่างไรก็ตามแฮชจะเก็บค่าเหล่านี้ทั้งหมดและจะสามารถบอกคุณ8ได้ว่าไม่ได้เก็บไว้ในนั้น มันทำอย่างไร มันจะติดตามการชนกันและเก็บค่าทั้งหมดด้วยค่าแฮชที่เหมือนกันจากนั้นเมื่อคุณทำการค้นหามันจะเปรียบเทียบการสืบค้นของคุณเพิ่มเติม ลองค้นหาแผนที่สำหรับ8: f(8) = 0ดังนั้นมันจะดูเป็นที่เก็บข้อมูลที่เราแทรกไว้แล้ว2, 4, 6และต้องทำการเปรียบเทียบ 3 ครั้งเพื่อบอกคุณว่า8ไม่ใช่ส่วนหนึ่งของอินพุต

ตัวกรอง Bloom:โดยปกติค่าอินพุตแต่ละค่าจะถูกแฮชกับkฟังก์ชันแฮชที่แตกต่างกัน อีกครั้งเพื่อความง่ายเราจะสมมติว่าเราใช้ฟังก์ชันแฮชเพียงครั้งเดียวfเท่านั้น เราจำเป็นต้องมีอาร์เรย์ของ 2 ค่าแล้วและเมื่อเราพบการป้อนข้อมูล2ก็หมายความว่าเกิดจากการf(2) = 0ที่เราตั้งค่าอาร์เรย์ที่ตำแหน่งค่า0 1เช่นเดียวกับที่เกิดขึ้นและ4 6ในทำนองเดียวกันปัจจัยการผลิต3, 5, 7แต่ละชุดตำแหน่งอาร์เรย์จะคุ้มค่า1 1ตอนนี้เราค้นหาว่า8เป็นส่วนหนึ่งของอินพุตหรือไม่f(8) = 0และอาร์เรย์ที่ตำแหน่ง0นั้น1ดังนั้นตัวกรอง Bloom จะอ้างว่า8เป็นส่วนหนึ่งของอินพุตอย่างไม่ถูกต้อง

g(x) = x % 10ที่จะได้รับบิตสมจริงมากขึ้นให้พิจารณาว่าเราเพิ่มฟังก์ชันแฮชที่สอง กับที่มูลค่าการป้อนข้อมูล2นำไปสู่สองค่าแฮชf(2) = 0และทั้งสองที่สอดคล้องตำแหน่งอาร์เรย์จะถูกตั้งค่าg(2) = 2 แน่นอนอาร์เรย์ตอนนี้ควรมีอย่างน้อยขนาด1 10แต่เมื่อเราสอบถาม8เราจะตรวจสอบอาร์เรย์ที่ตำแหน่ง8เนื่องจากg(8) = 80และตำแหน่งที่จะยังคงอยู่ นั่นเป็นเหตุผลที่ฟังก์ชั่นแฮชเพิ่มเติมช่วยลดผลบวกปลอมที่คุณจะได้รับ

เปรียบเทียบ:ฟิลเตอร์บลูมใช้kฟังก์ชั่นแฮชซึ่งหมายถึงkการเข้าถึงตำแหน่งอาเรย์สูงสุดแบบสุ่ม แต่ตัวเลขนั้นแน่นอน แฮชจะรับประกันเฉพาะเวลาเข้าใช้งานที่คงที่ของคุณ แต่อาจยกเลิกการสร้างขึ้นอยู่กับลักษณะของฟังก์ชันแฮชและข้อมูลอินพุตของคุณ ดังนั้นโดยทั่วไปจะเร็วกว่ายกเว้นกรณีที่ถูกยกเลิก

อย่างไรก็ตามเมื่อคุณมีการชนกันของแฮชแฮชมาตรฐานจะต้องตรวจสอบความเท่าเทียมกันของค่าที่เก็บไว้กับค่าของแบบสอบถาม การตรวจสอบความเท่าเทียมกันนี้อาจมีราคาแพงโดยพลการและจะไม่เกิดขึ้นกับฟิลเตอร์บลูม

ในแง่ของพื้นที่ตัวกรองการเบ่งบานคงที่เนื่องจากไม่จำเป็นต้องใช้หน่วยความจำมากกว่าอาเรย์ที่กำหนด ในทางกลับกันแฮชจะเติบโตแบบไดนามิกและอาจมีขนาดใหญ่ขึ้นเนื่องจากต้องติดตามค่าการชนกัน

การแลกเปลี่ยน:ตอนนี้เมื่อคุณรู้ว่าอะไรถูกและอะไรไม่และภายใต้สถานการณ์ใดคุณควรเห็นการแลกเปลี่ยน บลูมตัวกรองนั้นยอดเยี่ยมหากคุณต้องการตรวจจับอย่างรวดเร็วว่ามีการเห็นค่าก่อนหน้านี้ แต่สามารถมีชีวิตอยู่กับผลบวกที่ผิดพลาด ในทางกลับกันคุณสามารถเลือกแผนที่แฮชได้หากคุณต้องการรับประกันความถูกต้องในราคาที่ไม่สามารถตัดสินรันไทม์ของคุณได้อย่างแน่นอน แต่สามารถยอมรับกรณีที่เสื่อมโทรมเป็นครั้งคราวซึ่งอาจช้ากว่าค่าเฉลี่ยมาก

ในทำนองเดียวกันหากคุณอยู่ในสภาพแวดล้อมหน่วยความจำที่ จำกัด คุณอาจต้องการใช้ฟิลเตอร์บลูมเพื่อรับประกันการใช้หน่วยความจำ


คำตอบที่ดี นี่คือสิ่งที่ฉันสับสน จริงๆแล้วทุกโครงสร้างข้อมูลมีกรณีการใช้งานที่ดีที่สุดและการพิจารณาที่แตกต่างกันขึ้นอยู่กับการแลกเปลี่ยน
Richard

มันเป็นคำอธิบายที่ดีมากพร้อมตัวอย่างที่เหมาะสม แล้วเราจะไปกับค่า 'k' ได้อย่างไร มันขึ้นอยู่กับจำนวนทั้งหมดของสิ่งที่เรามี?
itsraghz

5

กรณีใช้งานสำหรับฟิลเตอร์บลูมและแฮชจะแตกต่างกันและส่วนใหญ่จะแยกจากกันดังนั้นการเปรียบเทียบโดยตรงจึงไม่สมเหตุสมผล นอกจากนี้ยังขึ้นอยู่กับรายละเอียดทางเทคนิคของการใช้งานเนื่องจากมีหลายวิธีในการจัดการการชนกันของแฮชที่มีการแลกเปลี่ยนที่แตกต่างกัน

ฟิลเตอร์บลูมสามารถตอบได้ว่าองค์ประกอบอยู่ในชุดสำหรับเซตขนาดใหญ่ด้วยความน่าจะเป็นที่สมเหตุสมผล แต่ไม่แน่นอนโดยใช้หน่วยความจำจำนวนเล็กน้อย มีขนาดมหึมาเช่นล้านล้านองค์ประกอบ แต่พวกเขาไม่แน่นอน คุณสามารถลดจำนวนผลบวกปลอมโดยใช้หน่วยความจำมากขึ้นหรือฟังก์ชั่นแฮชเพิ่มเติม

ในอีกทางหนึ่งตารางแฮชแน่นอน แต่พวกเขาต้องเก็บชุด ดังนั้นองค์ประกอบหลายล้านล้านล้านหน่วยต้องการหน่วยความจำ (และนั่นเป็นเพียงล้านล้านอเมริกัน) พวกเขายังสามารถเก็บข้อมูลเพิ่มเติมสำหรับแต่ละองค์ประกอบซึ่งตัวกรองที่บานไม่สามารถทำได้

ดังนั้นตัวกรองบลูมจะถูกใช้เมื่อคุณมีวิธีการช้าในการรับข้อมูลสำหรับสมาชิกบางคน (ที่เกี่ยวข้องกับเซิร์ฟเวอร์การสืบค้นอ่านจากดิสก์และอื่น ๆ ) ของชุดขนาดใหญ่ (ที่จะไม่พอดีกับหน่วยความจำ หรือเช่น) และต้องการหลีกเลี่ยงการรันการทำงานช้าสำหรับวัตถุที่ไม่ได้อยู่ในชุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.