ข้อดีของการใช้ตัวกรองบลูมคืออะไร?


109

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


5
คุณอ่านบทความวิกิพีเดียแล้วหรือยัง อธิบายข้อดีได้ดีทีเดียว en.wikipedia.org/wiki/Bloom_filter
Alex Budovski

@david ที่ดูเหมือนไม่น่าเป็นไปได้ ฟังก์ชันแฮชในปริภูมิคงที่จะมีการชนกันมากกว่าฟังก์ชันแฮชเดียวในปริภูมิคงที่
ปวดหัว

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

นักเขียนนี้ไม่ได้งานที่ดีกับมันmichaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo บทความที่เชื่อมโยงjasondavies.com/bloomfilterจะดีกว่า
Pacerier

คำตอบ:


157

จากWikipedia :

ตัวกรอง Bloom มีข้อได้เปรียบด้านพื้นที่ที่เหนือกว่าโครงสร้างข้อมูลอื่น ๆ สำหรับการแสดงชุดเช่นการปรับสมดุลต้นไม้การค้นหาแบบไบนารีการพยายามตารางแฮชหรืออาร์เรย์แบบง่ายหรือรายการที่เชื่อมโยงของรายการ สิ่งเหล่านี้ส่วนใหญ่ต้องการการจัดเก็บอย่างน้อยรายการข้อมูลด้วยตัวเองซึ่งสามารถต้องการได้ทุกที่ตั้งแต่บิตจำนวนน้อยสำหรับจำนวนเต็มขนาดเล็กไปจนถึงจำนวนบิตตามอำเภอใจเช่นสำหรับสตริง (การพยายามเป็นข้อยกเว้นเนื่องจากสามารถแชร์ที่เก็บข้อมูลระหว่าง องค์ประกอบที่มีคำนำหน้าเท่ากัน) โครงสร้างที่เชื่อมโยงจะมีพื้นที่เชิงเส้นเพิ่มเติมเหนือศีรษะสำหรับตัวชี้ ในทางกลับกันตัวกรอง Bloom ที่มีข้อผิดพลาด 1% และค่าที่เหมาะสมที่สุดคือ k ต้องการเพียง 9.6 บิตต่อองค์ประกอบโดยไม่คำนึงถึงขนาดขององค์ประกอบ ข้อได้เปรียบนี้ส่วนหนึ่งมาจากความกะทัดรัดซึ่งสืบทอดมาจากอาร์เรย์ และส่วนหนึ่งมาจากลักษณะความน่าจะเป็นของมัน หากอัตราการบวกเท็จ 1% ดูเหมือนสูงเกินไปทุกครั้งที่เราเพิ่มประมาณ 4.8 บิตต่อองค์ประกอบเราจะลดลงสิบครั้ง

ค่อนข้างชัดเจนสำหรับฉัน

ตัวกรองบานไม่ได้เก็บองค์ประกอบไว้ด้วยตัวเองนี่คือจุดสำคัญ คุณไม่ได้ใช้ตัวกรองบลูมเพื่อทดสอบว่ามีองค์ประกอบอยู่หรือไม่คุณใช้เพื่อทดสอบว่าไม่มีองค์ประกอบจริงหรือไม่เนื่องจากรับประกันว่าไม่มีผลลบเท็จ สิ่งนี้ช่วยให้คุณไม่ต้องทำงานพิเศษสำหรับองค์ประกอบที่ไม่มีอยู่ในชุด (เช่นดิสก์ IO เพื่อค้นหา)

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

ตัวอย่างรูปแบบการใช้งานอาจเป็น:

คุณได้มีจำนวนมากของข้อมูลบนดิสก์ - คุณตัดสินใจในสิ่งที่ผิดพลาดถูกผูกไว้ที่คุณต้องการ (เช่น 1%) ที่กำหนดค่าของม. แล้วเหมาะสมที่สุด k ที่ (จากสูตรที่ระบุในบทความ) คุณเติมตัวกรองของคุณจากข้อมูลที่ผูกกับดิสก์นี้ครั้งเดียว

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

มิฉะนั้นหากตัวกรองระบุว่า "ใช่มีอยู่ในนั้น" มีโอกาส 1% ที่จะผิดพลาดคุณจึงต้องทำงานที่จำเป็นเพื่อหาคำตอบ 99% ของเวลาจะอยู่ที่นั่นจริงๆดังนั้นงานจึงไม่ได้มีไว้เพื่อความว่างเปล่า


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

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

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

2
คำตอบคือย่อหน้าสุดท้ายใน "ข้อได้เปรียบของพื้นที่และเวลา" ในบทความ Wikipedia และส่วน "ความน่าจะเป็นของผลบวกปลอม"
Alex Budovski

4
มันก็คลิก ขอบคุณมากสิ่งนี้รบกวนฉันมาระยะหนึ่งแล้ว จะลดจำนวนผลบวกปลอมเนื่องจากผลบวกเท็จจะต้อง a) เป็นการชนกันของฟังก์ชันแฮชทั้งหมดของคุณหรือ b) ช่องว่างทั้งหมดถูกเติมเต็มด้วยค่าอื่น ๆ การเลือกขนาดต้องเป็นขั้นตอนที่ยุ่งยาก แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่าฉันเข้าใจแล้ว ขอบคุณทุกๆคน.
ปวดหัว

156

อเล็กซ์อธิบายได้ดีทีเดียว สำหรับผู้ที่ยังไม่เข้าใจมันหวังว่าตัวอย่างนี้จะช่วยให้คุณเข้าใจ:

สมมติว่าฉันทำงานให้ Google ในทีม Chrome และฉันต้องการเพิ่มคุณลักษณะให้กับเบราว์เซอร์ซึ่งจะแจ้งให้ผู้ใช้ทราบว่า URL ที่เขาป้อนเป็น URL ที่เป็นอันตรายหรือไม่ ดังนั้นฉันจึงมีชุดข้อมูลประมาณ 1 ล้าน URL ที่เป็นอันตรายขนาดของไฟล์นี้อยู่ที่ประมาณ 25MB เนื่องจากขนาดค่อนข้างใหญ่ (ใหญ่เมื่อเทียบกับขนาดของเบราว์เซอร์เอง) ฉันจึงเก็บข้อมูลนี้ไว้ในเซิร์ฟเวอร์ระยะไกล

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

กรณีที่ 2: ฉันใช้ตัวกรองบาน รายการ URL 1 ล้านรายการทั้งหมดถูกเรียกใช้ผ่านตัวกรองบลูมโดยใช้ฟังก์ชันแฮชหลายตัวและตำแหน่งตามลำดับจะถูกทำเครื่องหมายเป็น 1 ในอาร์เรย์ขนาดใหญ่ที่มีค่า 0 สมมติว่าเราต้องการอัตราผลบวกเท็จ 1% โดยใช้เครื่องคำนวณตัวกรองบาน ( http://hur.st/bloomfilter?n=1000000&p=0.01) เราได้ขนาดของบานกรองที่ต้องการเพียง 1.13 MB คาดว่าขนาดเล็กนี้แม้ว่าขนาดของอาร์เรย์จะใหญ่ แต่เราจะจัดเก็บเพียง 1s หรือ 0s เท่านั้นและไม่ใช่ URL ในกรณีของตารางแฮชอาร์เรย์นี้สามารถถือเป็นบิตอาร์เรย์ได้ นั่นคือเนื่องจากเรามีค่า 1 และ 0 เพียง 2 ค่าเราจึงสามารถตั้งค่าแต่ละบิตแทนไบต์ได้ วิธีนี้จะช่วยลดพื้นที่ที่ใช้ลง 8 เท่า ฟิลเตอร์บลูม 1.13 MB นี้เนื่องจากมีขนาดเล็กสามารถเก็บไว้ในเว็บเบราว์เซอร์ได้เอง !! ดังนั้นเมื่อผู้ใช้เข้ามาและป้อน URL เราเพียงแค่ใช้ฟังก์ชันแฮชที่ต้องการ (ในเบราว์เซอร์เอง) และตรวจสอบตำแหน่งทั้งหมดในตัวกรองบลูม (ซึ่งเก็บไว้ในเบราว์เซอร์) ค่า 0 ในตำแหน่งใด ๆ จะบอกเราว่า URL นี้ไม่แน่นอนอยู่ในรายการ URL ที่เป็นอันตรายและผู้ใช้สามารถดำเนินการได้อย่างอิสระ ดังนั้นเราจึงไม่โทรไปที่เซิร์ฟเวอร์และด้วยเหตุนี้จึงช่วยประหยัดเวลา ค่า 1 บอกเราว่า URL อาจอยู่ในรายการ URL ที่เป็นอันตราย ในกรณีเหล่านี้เราโทรไปยังเซิร์ฟเวอร์ระยะไกลและที่นั่นเราสามารถใช้ฟังก์ชันแฮชอื่น ๆ กับตารางแฮชบางตารางได้เช่นเดียวกับในกรณีแรกเพื่อดึงข้อมูลและตรวจสอบว่ามี URL อยู่หรือไม่ เนื่องจากส่วนใหญ่แล้ว URL ไม่น่าจะเป็นอันตรายตัวกรองบลูมเล็ก ๆ ในเบราว์เซอร์จึงช่วยประหยัดเวลาโดยหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกล ในบางกรณีเท่านั้นหากตัวกรองบลูมแจ้งให้เราทราบว่า URL อาจเป็นอันตรายเฉพาะในกรณีที่เราโทรไปยังเซิร์ฟเวอร์ 'MIGHT' นั้นถูกต้อง 99% ในกรณีเหล่านี้เราโทรไปยังเซิร์ฟเวอร์ระยะไกลและที่นั่นเราสามารถใช้ฟังก์ชันแฮชอื่น ๆ กับตารางแฮชบางตารางได้เช่นเดียวกับในกรณีแรกเพื่อดึงข้อมูลและตรวจสอบว่ามี URL อยู่หรือไม่ เนื่องจากส่วนใหญ่แล้ว URL ไม่น่าจะเป็นอันตรายตัวกรองบลูมเล็ก ๆ ในเบราว์เซอร์จึงช่วยประหยัดเวลาโดยหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกล ในบางกรณีเท่านั้นหากตัวกรองบลูมบอกเราว่า URL อาจเป็นอันตรายเฉพาะในกรณีเหล่านั้นที่เราโทรไปยังเซิร์ฟเวอร์ 'MIGHT' นั้นถูกต้อง 99% ในกรณีเหล่านี้เราโทรไปยังเซิร์ฟเวอร์ระยะไกลและที่นั่นเราสามารถใช้ฟังก์ชันแฮชอื่น ๆ กับตารางแฮชบางตารางได้เช่นเดียวกับในกรณีแรกเพื่อดึงข้อมูลและตรวจสอบว่ามี URL อยู่หรือไม่ เนื่องจากส่วนใหญ่แล้ว URL ไม่น่าจะเป็นอันตรายตัวกรองบลูมเล็ก ๆ ในเบราว์เซอร์จึงช่วยประหยัดเวลาโดยหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกล ในบางกรณีเท่านั้นหากตัวกรองบลูมแจ้งให้เราทราบว่า URL อาจเป็นอันตรายเฉพาะในกรณีที่เราโทรไปยังเซิร์ฟเวอร์ 'MIGHT' นั้นถูกต้อง 99% ตัวกรองบลูมขนาดเล็กในเบราว์เซอร์เป็นตัวเลขที่ออกมาจึงช่วยประหยัดเวลาโดยหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกล ในบางกรณีเท่านั้นหากตัวกรองบลูมบอกเราว่า URL อาจเป็นอันตรายเฉพาะในกรณีเหล่านั้นที่เราโทรไปยังเซิร์ฟเวอร์ 'MIGHT' นั้นถูกต้อง 99% ตัวกรองบลูมขนาดเล็กในเบราว์เซอร์เป็นตัวเลขที่ออกมาจึงช่วยประหยัดเวลาโดยหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกล ในบางกรณีเท่านั้นหากตัวกรองบลูมบอกเราว่า URL อาจเป็นอันตรายเฉพาะในกรณีเหล่านั้นที่เราโทรไปยังเซิร์ฟเวอร์ 'MIGHT' นั้นถูกต้อง 99%

ดังนั้นด้วยการใช้ตัวกรองบลูมขนาดเล็กในเบราว์เซอร์เราจึงประหยัดเวลาได้มากเนื่องจากเราไม่จำเป็นต้องเรียกเซิร์ฟเวอร์สำหรับทุก URL ที่ป้อน

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

แก้ไข :

ฉันได้ติดตั้งตัวกรองบลูมสำหรับงานทดสอบ URL ที่เป็นอันตรายใน Python รหัสสามารถพบได้ที่นี่ - https://github.com/tarunsharma1/Bloom-Filter รหัสนี้เข้าใจง่ายมากและมีคำอธิบายโดยละเอียดอยู่ในไฟล์ readme


3
ขอบคุณสำหรับสถานการณ์การใช้งาน
วิกส์

1
ฉันไม่ได้รับส่วนของการแฮชและเชื่อมโยงค่า 0 หรือ 1 หากเราใช้อาร์เรย์และเก็บ 0 และ 1 ไว้ในนั้นเราจะค้นหาค่าแฮชของ url ได้อย่างไรเมื่อเราทำการทดสอบ เหรอ?
divinedragon

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

1
แฮชแท็กแบบเดิมเช่น C # HashSet<String>จะใช้ 16 ไบต์ต่อองค์ประกอบองค์ประกอบในกรณีที่ดีที่สุดที่แฮชแท็กเต็มสมบูรณ์: 4 ไบต์แมปจาก "ที่เก็บข้อมูล" ไปยังรายการในตารางรายการ (ลิงก์เดียวที่บรรจุอาร์เรย์ list), 4 ไบต์สำหรับแฮชโค้ดที่แคช, 4 ไบต์สำหรับตัวชี้ "ถัดไป", 4 ไบต์สำหรับตัวชี้ไปที่คีย์ และนั่นยังไม่นับขนาดสตริง ในกรณีที่แย่ที่สุดคือ 40 ไบต์: ครึ่งหนึ่งของรายการไม่ได้ใช้และ 20 ไบต์ต่อรายการเมื่อStringตัวชี้ขยายเป็น 8 ไบต์สำหรับสถาปัตยกรรม 64 บิต
Qwertie

คุณไม่จำเป็นต้องบันทึก String ในชุดแฮช คุณสามารถบันทึกแฮชเป็นค่าได้ทำให้แฮชมีขนาดเล็กลงมาก จากนั้นคุณสามารถเล่นกับขนาดแฮช - ยิ่งมีขนาดใหญ่เท่าใดอัตราการบวกเท็จก็จะน้อยลงเท่านั้น
user1028741

24

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

ดังนั้นตัวกรองบานมาตรฐานจึงเป็นโครงสร้างข้อมูลที่น่าจะเป็นที่สามารถ* :


  • เพิ่มองค์ประกอบให้กับชุด
  • ตรวจสอบว่าองค์ประกอบอยู่ในชุดโดยการบอกdefinitely not in the setหรือpossibly in the set

นี่possibly in the setคือเหตุผลที่เรียกว่าน่าจะเป็น การใช้คำพูดที่ฉลาดมันหมายความว่าผลบวกเท็จเป็นไปได้ (อาจมีบางกรณีที่คิดว่าองค์ประกอบนั้นเป็นบวกอย่างไม่ถูกต้อง) แต่ผลลบเท็จนั้นเป็นไปไม่ได้

แต่มันทำไม่ได้ * :

  • ลบรายการออกจากชุด
  • ให้รายการองค์ประกอบทั้งหมดที่อยู่ในชุดของคุณ

* ชุดกระป๋อง / ไม่ได้นี้มีไว้สำหรับตัวกรองบานขั้นพื้นฐาน เนื่องจากเป็นโครงสร้างข้อมูลที่มีประโยชน์ซึ่งสร้างขึ้นเมื่อนานมาแล้วผู้คนจึงค้นพบวิธีการเพิ่มคุณสมบัติที่มีประโยชน์อื่น ๆ


แต่เดี๋ยวก่อนเรารู้โครงสร้างข้อมูลที่สามารถตอบโจทย์ทั้งหมดนี้ได้โดยไม่ 'เป็นไปได้' ที่คลุมเครือและไม่มีข้อ จำกัด ทั้งหมด (ไม่สามารถลบออกไม่สามารถแสดงทั้งหมดได้) และมันจะเรียกว่าเป็นชุด และนี่คือข้อได้เปรียบหลักของตัวกรองบลูมนั่นคือประสิทธิภาพของพื้นที่และค่าคงที่ของพื้นที่พื้นที่ที่มีประสิทธิภาพและพื้นที่ต่อเนื่อง

ซึ่งหมายความว่าไม่ว่าเราจะเก็บองค์ประกอบไว้ที่นั่นกี่ชิ้นพื้นที่ก็จะเท่ากัน ใช่ตัวกรองบานที่มี10^6องค์ประกอบ (ตัวกรองบานที่ไม่มีประโยชน์) จะใช้พื้นที่เท่ากันกับตัวกรองบานที่มี10^20องค์ประกอบและช่องว่างเดียวกับตัวกรองบานที่มี0องค์ประกอบ แล้วจะใช้พื้นที่เท่าไหร่? ขึ้นอยู่กับคุณที่จะตัดสินใจ (แต่มีการแลกเปลี่ยน: ยิ่งคุณมีองค์ประกอบมากเท่าไหร่คุณก็ยิ่งไม่แน่ใจมากขึ้นเท่านั้นpossible in the setเท่านั้น

ที่เด็ดอีกอย่างคือค่าคงที่ของอวกาศ เมื่อคุณบันทึกข้อมูลลงในชุดคุณต้องบันทึกข้อมูลนี้จริงๆ ดังนั้นหากคุณจัดเก็บthis long string in the setคุณต้องใช้พื้นที่อย่างน้อย 27 ไบต์ แต่สำหรับข้อผิดพลาด 1% และค่าที่เหมาะสมที่สุดคือ k **คุณจะต้องมี ~ 9.6 บิต (<2 ไบต์) ต่อองค์ประกอบใด ๆ (ไม่ว่าจะเป็น int สั้น ๆ หรือข้อความขนาดใหญ่)

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

** k คือค่าของฟังก์ชันแฮชที่ใช้ในตัวกรองบลูม


ฉันจะไม่อธิบายว่าตัวกรองบลูมทำงานอย่างไร (บทความวิกิพีเดียอธิบายทุกอย่างได้ดีมาก) ที่นี่ฉันจะบอกพื้นฐานสั้น ๆ

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

แม้แต่คำอธิบายนี้ก็เพียงพอที่จะเข้าใจว่าเหตุใดเราจึงไม่แน่ใจ (คุณสามารถรับบิตทั้งหมดที่กำหนดจากค่าอื่น ๆ ) นี่คือการสร้างภาพที่ดีมากของวิธีการทำงาน

ป้อนคำอธิบายภาพที่นี่


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

นี่คือรายการคำอธิบายที่เป็นรูปธรรมมากขึ้น:

  • มีการอธิบายตัวอย่างมาตรฐานของเว็บไซต์ที่เป็นอันตรายและเบราว์เซอร์ในเกือบทุกที่ที่ผู้คนพูดคุยเกี่ยวกับฟิลเตอร์บาน
  • เป็นรหัสผ่านที่อ่อนแอ: แทนที่จะมีชุดรหัสผ่านที่คาดเดายากทั้งหมดที่เป็นไปได้จำนวนมากคุณสามารถตรวจสอบได้ว่ารหัสผ่านนั้นไม่ได้อ่อนแออย่างแน่นอนด้วยตัวกรองบานเล็ก ๆ
  • หากคุณมีรายชื่อบทความและรายชื่อผู้ใช้คุณสามารถใช้ตัวกรองบลูมเพื่อแสดงบทความของผู้ใช้ที่พวกเขายังไม่ได้อ่าน สิ่งที่น่าสนใจคือคุณสามารถมีตัวกรองได้เพียงตัวเดียว (คุณตรวจสอบว่ามีการรวม user_id + article_id หรือไม่)
  • bitcoin ใช้ตัวกรองบานสำหรับการซิงโครไนซ์กระเป๋าสตางค์
  • เว็บเซิร์ฟเวอร์ของ Akamai ใช้ตัวกรอง Bloom เพื่อป้องกันไม่ให้ "one-hit-Wonders" ถูกเก็บไว้ในดิสก์แคช One-hit-Wonders คือเว็บออบเจ็กต์ที่ผู้ใช้ร้องขอเพียงครั้งเดียวสิ่งที่ Akamai พบใช้กับโครงสร้างพื้นฐานการแคชเกือบสามในสี่ของพวกเขา การใช้ตัวกรอง Bloom เพื่อตรวจจับคำขอที่สองสำหรับเว็บอ็อบเจ็กต์และแคชอ็อบเจ็กต์นั้นเฉพาะในคำขอที่สองจะป้องกันไม่ให้สิ่งมหัศจรรย์ที่เกิดขึ้นเพียงครั้งเดียวเข้าสู่แคชของดิสก์ลดภาระงานดิสก์ลงอย่างมากและเพิ่มอัตราการเข้าถึงแคชของดิสก์ (นำมาจากตัวอย่างในตัวกรองของบลูม บทความที่ wiki)

13

บลูมฟิลเตอร์มีประโยชน์มากในด้านชีวสารสนเทศ สามารถเพิ่มพื้นที่ได้อย่างมีประสิทธิภาพเมื่อเทียบกับการใช้แฮชทั่วไปโดยเฉพาะอย่างยิ่งเมื่อขนาดของสตริงที่คุณใช้งานอาจเป็นตัวอักษรหลายร้อยล้านตัวที่มีตัวอักษรขนาดเล็กมากเช่น {A, G, T, C} โดยปกติจะใช้เพื่อประเมินว่ามี k-mer อยู่หรือไม่มีในจีโนม มีตัวอย่างหนึ่งที่ใช้สำหรับบางสิ่งบางอย่างที่เกี่ยวข้องเป็นที่นี่

แก้ไข:

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

เปรียบเทียบสิ่งนี้กับจีโนมของมนุษย์ซึ่งการเพิ่มขนาดขององค์ประกอบจะทำให้ขนาดของตารางแฮชเพิ่มขึ้นอย่างมาก (ขนาดตารางคือ 4 * 4 k ) สมมติว่าคุณเข้ารหัสองค์ประกอบโดยใช้ 2 บิต / ตัวอักษร


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

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

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

7

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


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