ให้ฉันลองยิงดูนี้เพื่อดูว่าฉันสามารถฆ่ามันได้มากแค่ไหน :-)
ดังนั้นในการเริ่มต้นคุณจะต้องสามารถสร้างตัวกรองบลูมปกติที่อนุญาตให้มีองค์ประกอบจำนวน จำกัด ที่มีความน่าจะเป็นสูงสุดที่เป็นค่าบวก จำเป็นต้องเพิ่มคุณสมบัติเหล่านี้ในตัวกรองพื้นฐานของคุณก่อนที่จะพยายามสร้างการปรับใช้ที่ปรับขนาดได้
ก่อนที่เราจะพยายามควบคุมและปรับความน่าจะเป็นให้ดีที่สุดให้ลองคิดว่าความน่าจะเป็นของขนาดตัวกรองบลูมที่กำหนด
ก่อนอื่นเราแบ่ง 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 มีที่นี่ )