ฟิลเตอร์บลูมที่ปรับขนาดได้ทำงานอย่างไร


15

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

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

ฉันเข้าใจตัวกรองบลูมพื้นฐาน อย่างไรก็ตามฉันไม่สามารถคลุมศีรษะด้วยฟิลเตอร์บลูมแบบไดนามิก

คำตอบ:


7

ให้ฉันลองยิงดูนี้เพื่อดูว่าฉันสามารถฆ่ามันได้มากแค่ไหน :-)

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

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

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

หากคุณเพิ่มจำนวนชิ้นหรือจำนวนบิตต่อชิ้นความน่าจะเป็นของการบวกผิดจะลดลง

นอกจากนี้ยังตามด้วยองค์ประกอบที่เพิ่มบิตเพิ่มเติมจะถูกตั้งค่าเป็น 1 ดังนั้นผลบวกที่ผิดพลาดจึงเพิ่มขึ้น เราอ้างถึงสิ่งนี้ว่า "อัตราส่วนการเติม" ของแต่ละส่วน

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

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

เพื่อหาจำนวนชิ้นที่เราควรมีเราเริ่มด้วยการหาอัตราส่วนการเติมที่เหมาะสมสำหรับชิ้น เนื่องจากอัตราส่วนการเติมถูกกำหนดโดยจำนวนบิตในชิ้นซึ่งเท่ากับ 1 ต่อจำนวนบิตที่เป็น 0 เราจึงสามารถกำหนดได้ว่าแต่ละบิตจะยังคงไม่มีการตั้งค่าด้วยความน่าจะเป็น (100% - (1 / บิตในชิ้น) ) เนื่องจากเรากำลังจะใส่หลายรายการเราจึงมีการเปลี่ยนแปลงอีกครั้งกับปัญหาเรื่องชื่อเสียงและเราขยายสิ่งต่าง ๆ ออกมาเป็นอัตราส่วนการเติมที่คาดหวังซึ่งก็คือ (100% - ((100% - (1 / บิตต่อชิ้น)) ^ "องค์ประกอบที่แทรก")) ปรากฎว่านี่คล้ายกับสมการอื่นมาก ในกระดาษพวกมันเกี่ยวข้องกับอัตราส่วนการเติมกับสมการอื่นดังนั้นมันจึงเหมาะกับเทย์เลอร์ซีรีย์ (1-e ^ (- n / m)) หลังจากเปลี่ยนมาซักเล็กน้อยด้วยสิ่งนี้ปรากฎว่าอัตราส่วนการเติมที่เหมาะสมอยู่ที่ประมาณ 50% เสมอ

ดังนั้นเนื่องจากความน่าจะเป็นของตัวกรองคืออัตราการเติมที่เพิ่มขึ้นตามจำนวนของชิ้นเราจึงสามารถเติมได้ 50% และรับ P = (50%) ^ k หรือ k = log_2 (1 / P) จากนั้นเราสามารถใช้ฟังก์ชันนี้เพื่อคำนวณจำนวนชิ้นที่เราควรสร้างให้กับตัวกรองที่ระบุในรายการตัวกรองสำหรับตัวกรอง Bloom ที่ปรับขนาดได้

    def slices_count(false_positive_probability):
        return math.ceil(math.log(1 / false_positive_probability, 2))

แก้ไข:หลังจากเขียนสิ่งนี้ฉันได้พูดถึง "กฎห้าสิบเปอร์เซ็นต์" เมื่ออ่านบนการจัดสรรหน่วยความจำแบบไดนามิกตามระบบบัดดี้ใน TAoCP เล่ม 1, pp 442-445 ด้วยเหตุผลที่สะอาดกว่าเมื่อเทียบกับเส้นโค้งที่เหมาะสม (1 -e ^ (- n / m)) Knuth ยังอ้างอิงกระดาษ "กฎห้าสิบเปอร์เซ็นต์มาเยือน" พร้อมกับพื้นหลังเล็กน้อยในแนวคิด ( pdf มีที่นี่ )


ไม่มีการอภิปรายเกี่ยวกับตัวกรอง Bloom ในกระดาษนั้นดังนั้นไม่เห็นเหตุผลใด ๆ สำหรับ "กฎห้าสิบเปอร์เซ็นต์" ที่นี่ ก่อนหน้านี้ฉันคาดหวังว่า "กฎห้าสิบเปอร์เซ็นต์" เป็นเพียงแค่บางคนที่มุ่งเน้นไปที่คนรอบตัวเพราะคำตอบที่แท้จริงเกี่ยวข้องกับการพิจารณาหลายอย่างที่เกินกว่าเกณฑ์การออกแบบโมดูลของพวกเขา
Jeff Burdges

1
เฮ้ @JeffBurdges คุณไม่คิดว่าอย่างน้อยก็อยากรู้ว่าทั้งสองแนวคิดมีความคล้ายคลึงกันหรือไม่?
Jon Bringhurst

4

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

เพื่อให้แน่ใจว่าคุณยังมีการรับประกันที่ผิดพลาดในกรณีที่เลวร้ายที่สุดตัวกรองใหม่จะถูกเพิ่มด้วยอัตราการบวกที่ผิดพลาดซึ่งจะลดลงในเชิงเรขาคณิต ยกตัวอย่างเช่นการกรองแรกมีอัตราการบวกปลอมpที่สองrp, สามr^2p, ฯลฯ sum_{k>=0} r^k p = p/(1-r)น่าจะเป็นของเท็จบวกมากกว่ากรองบานขยายขีดความสามารถเป็นที่สิ้นสุดแล้วโดยสหภาพผูกพัน:


3
'r' แสดงถึงอะไรในสูตรเหล่านี้
zslayton

1

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

องค์ประกอบที่สนับสนุนการตั้งค่าบิตในตัวกรองที่สร้างขึ้นครั้งแรกไม่สามารถค้นหาการปรากฏตัว บางทีฉันอาจเข้าใจผิดในเรื่องนี้?

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

จากจุดอิ่มตัวรายการใหม่ใด ๆ จะไม่ถูกเพิ่มไปยังตัวกรองอิ่มตัว แต่ไปยังตัวกรองย่อยใหม่และใหญ่กว่า (ตัวกรองระดับที่สอง)

ในการค้นหาค่าคุณจะต้องค้นหาในตัวกรองระดับแรกและหากคุณไม่พบค่านั้นคุณจะค้นหาในตัวกรองระดับที่สอง หากคุณสามารถค้นหาได้ในตัวกรองใด ๆ เหล่านี้มันเป็น (โดยมีโอกาสดี) สำหรับตัวกรอง "รู้จัก" (อาจเกิดผลบวกที่ผิดพลาดอันเป็นผลมาจากลักษณะของตัวกรองของ Bloom) หากคุณไม่พบค่าในตัวกรองใด ๆ ตัวกรองจะรับประกันว่าจะไม่เห็น แน่นอนว่าสิ่งนี้สามารถแสดงเป็นโครงสร้างข้อมูลแบบเรียกซ้ำได้

คุณอาจต้องการอ่านโพสต์บล็อกของฉันที่มีการปรับใช้ตัวกรอง Bloom ที่ปรับขนาดได้ใน Java และคำอธิบายวิธีการทำงานโดยละเอียด

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