ชุดความน่าจะเป็นที่ไม่มีผลบวกปลอมใช่ไหม


35

ดังนั้นตัวกรองของ Bloomนั้นยอดเยี่ยมมาก - เป็นชุดที่รองรับการตรวจสอบการเป็นสมาชิกโดยไม่มีข้อผิดพลาดที่ผิดพลาด แต่มีโอกาสเล็กน้อยที่จะมีผลบวกเป็นลบ แม้ว่าเมื่อเร็ว ๆ นี้ฉันต้องการ "ตัวกรอง Bloom" ที่รับประกันสิ่งที่ตรงกันข้าม: ไม่มีผลบวกปลอม แต่อาจเป็นเชิงลบที่ผิดพลาด

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

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

ใครเห็นอะไรเช่นนี้ :)


3
ความสมบูรณ์ของฉากที่ฉันสนใจไม่มีที่สิ้นสุด ฉันจะเก็บมันได้อย่างไร
Christopher Monsanto

11
ฉันเห็นปัญหา (ดิสก์ที่ทันสมัยยังไม่ใหญ่พอ)
Dave Clarke

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

1
@ MarkReitblatt ทั้งตัวกรองและแคชของ Bloom นั้นมีความน่าจะเป็นและชุดค่าผสมใด ๆ ที่เป็นไปได้นั้นอาจเป็นไปได้เช่นไม่สามารถทำการทดสอบการเป็นสมาชิกชุดที่แน่นอนได้ :)
awdz9nld

คำตอบ:


25

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


ขอบคุณสำหรับคำตอบ. ใช่นั่นคือทางออกที่ชัดเจน - หากเป็นโซลูชันมาตรฐานดูเหมือนว่าฉันจะโชคไม่ดี โอ้ดี
Christopher Monsanto

2
สิ่งนี้เรียกว่าแคชที่แมปโดยตรงและมักใช้ในซีพียู (ชุดแคชหรือแฮชใด ๆ ที่เหมาะกับความต้องการในการเปลี่ยนแปลงองศา) อัตราความผิดพลาดเป็นฟังก์ชั่นการแจกแจงของฟังก์ชันแฮช (หิมะถล่ม) และจำนวนของสล็อตที่มีอยู่ในแคช / ชุด - ปรับตามนั้น :)
awdz9nld

นอกจากนี้ยังทราบว่าคีย์คำต่อคำเดียวที่สามารถเก็บไว้ได้โดยไม่ต้องแนะนำบวกเท็จ (เช่นการจัดเก็บคีย์แฮช)
awdz9nld

20

คำตอบสำหรับคำถามนี้คือ "ไม่" เพื่อดูว่าทำไมเราสามารถนึกถึงกรณีที่รุนแรงมากและวิธีการทำงานของฟิลเตอร์บลูมปกติกับฟิลเตอร์บลูม "Bizzaro World" ในทางทฤษฎีซึ่งเราเรียกว่า "ฟิลเตอร์มืดมน"

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

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

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


ชำระเงินsomethingsimilar.com/2012/05/21/the-opposite-of-a-bloom-filter - สิ่งที่ผิดพลาดในการใช้งานนี้ /
Yehosef

@Yeofaf มันใช้ได้และอาจทำงานได้ตามความต้องการของคุณ แต่คุณจะสังเกตเห็นว่าผู้เขียนพูดถึงว่ามี "ID ไม่กี่ตัวที่ระบุเหตุการณ์" ดังนั้นสิ่งที่ได้รับการใช้งานอย่างมีประสิทธิภาพยังคงเก็บวัตถุทั้งหมด ดังนั้นมันจึงแตกต่างจากแคช "ตรงกันข้ามกับฟิลเตอร์บลูม" ที่แท้จริงหากมีอยู่จะไม่จำเป็นต้องเก็บวัตถุทั้งหมด
pents90

เขากล่าวถึงรหัสสองสามตัวที่ระบุเหตุการณ์ - ไม่ใช่วัตถุทั้งหมด ฉันแค่ต้องเก็บ "แคช" ไว้ใน session_id ไม่ใช่บันทึกการโต้ตอบทั้งหมด แต่ฉันได้ยินมาว่ามันไม่ใช่วิธีการแบบเดียวกันกับดอกไม้หรือไฮเปอร์บล็อก
Yehosef

ใน "หลักฐาน" ของคุณคุณคิดว่ามีรายการที่เป็นไปได้ไม่ จำกัด จำนวน อย่างไรก็ตามมีหลายกรณีที่ทราบชุดของรายการที่เป็นไปได้ล่วงหน้า ตัวอย่างเช่นสำหรับการรวบรวมขยะของหน้าหน่วยความจำ: คุณรู้ว่ามันมีรายการใด ตอนนี้คุณสร้าง "ตัวกรองมืดมน" ที่แมปรายการที่เป็นไปได้แต่ละรายการกับดัชนี 0..n ตอนนี้เมื่อรายการถูกลบออกให้ตั้งค่าบิตเป็นดัชนีนั้น เมื่อตั้งค่าบิตทั้งหมดแล้วคุณสามารถเก็บรวบรวมขยะในหน้าได้ "ตัวกรองมืดมน" เป็น MPHF หากต้องการอนุญาตการลบที่ผิดให้เปลี่ยน MPHF เพื่อให้รายการบางรายการถูกแมปเป็น n + 1
โทมัสมูลเลอร์

@ThomasMueller ถูกต้องฉันสมมติว่าเป็นกรณีที่เลวร้ายที่สุด / adversarial ซึ่งเป็นมุมมองทฤษฎี CS มาตรฐาน เป็นความจริงที่ว่าถ้าคุณมีรายการที่เป็นไปได้ N แบบคงที่ดังนั้นจึงมีวิธีแก้ปัญหาที่ตรงไปตรงมาจำนวนมากโดยมีเพียงบันทึก N ช่องว่างที่จำเป็นสำหรับแต่ละรายการ แม้ว่าตัวกรองการบานไม่มีข้อ จำกัด ดังกล่าว
pents90

13

คุณเพียงแค่ต้องการแคชแต่กำลังคิดเกี่ยวกับมันในทางที่แปลก


1
... สนใจที่จะทำอย่างละเอียด? แน่นอนแคชจะทำงานได้ แต่ก็ไม่เหมาะดังนั้นคำถามเกี่ยวกับสถานะของศิลปะในโครงสร้างข้อมูลที่น่าจะเป็น มีความเฉพาะเจาะจงมากขึ้น: เทคนิคการแคชฉันรู้ว่าต้องใช้พื้นที่เก็บข้อมูลจำนวนมาก ยิ่งระดับแคชยิ่งใช้พื้นที่เก็บข้อมูลมากเท่าไหร่ เราสามารถวางองค์ประกอบที่เก็บไว้ในแคชทำเลเยอร์กับรูปแบบการใช้งาน ฯลฯ แต่ก็ยังไม่ได้ใกล้เคียงกับประสิทธิภาพของพื้นที่ต่ออัตราส่วนคำตอบที่ผิดที่ตัวกรองของ Bloom ให้
Christopher Monsanto

1
(ต่อ) ที่ถูกกล่าวว่าฉันอาจจะลืมเกี่ยวกับเทคนิคการแคชที่ชัดเจนที่แก้ปัญหาทั้งหมดของฉัน ในกรณีนี้คุณสามารถอธิบายได้อย่างชัดเจนว่าเทคนิคแทนที่จะให้ลิงก์ไปยังหมวดหมู่ทั่วไปใน Wikipedia หรือไม่
Christopher Monsanto

2

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

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


0

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


ฉันต้องการลองด้วยข้อมูลสตริง แต่ข้อมูลของฉันมีแนวโน้มที่จะบรรจุโครงสร้างไบนารี
JRideout

0

ฉันคิดว่าสามารถพิสูจน์ขอบเขตที่ต่ำกว่าที่ระบุว่าโครงสร้างข้อมูลข้างต้นไม่สามารถอยู่ได้ โดยทั่วไปถ้าโครงสร้างข้อมูลใช้บิต m ดังนั้นบิตบิตเวกเตอร์คงที่ (การแทนค่าของอินพุต) สามารถสอดคล้องกับที่มากที่สุด ((un) + n eps) \ select (un) ชุดโดยอาร์กิวเมนต์การนับ เนื่องจากว่า 2 ^ m คูณจำนวนนี้ต้องมีอย่างน้อย (u \ select n) (ทุกชุดจะต้องเป็นตัวแทน) เราจะได้ขอบเขตที่ต่ำกว่าซึ่งโดยพื้นฐานแล้วใกล้เคียงกับการจัดเก็บชุด S อย่างแม่นยำ

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