นี่คือปัญหาที่ทำให้ฉันดักฟังมาระยะหนึ่งแล้ว สมมุติว่าสตริงเป็นลำดับ 1 และ 0 และสตริงตัวแทนคือ 1 และ 0 สตริงและสตริงตัวแทนทั้งหมดมีความยาวเท่ากัน นี่คือสัญลักษณ์ตัวแทน UNIX มาตรฐาน 10 ?? 1 การแข่งขัน 10011, 10111, ฯลฯ -? ตรงกับ 1 หรือ 0 ในตำแหน่งนั้น ถ้า และ เป็นสตริงไวด์การ์ดจากนั้นเราเขียน ถ้าทุกสายจับคู่ด้วย ถูกจับคู่โดย .
ปัญหา : ได้รับชุด ของสายอักขระตัวแทนและแบบสอบถาม (เช่นสตริงตัวแทน) ซึ่งมีอยู่ ดังนั้น ? และถ้าไม่เราสามารถเพิ่ม ถึง ได้อย่างมีประสิทธิภาพ?
นี่คือสิ่งที่ชัดเจน วิธีแก้ปัญหา (ที่ไหน คือขนาดของสตริง คือขนาดคำของ RAM (ปกติคือ 32 หรือ 64)): ผ่านแต่ละองค์ประกอบของรายการและทดสอบเงื่อนไข (ซึ่งสามารถทำได้ใน 2 หรือ 3 การดำเนินการโดยใช้การบิดสองบิต) ทดสอบด้วยถ้า ถือสำหรับรายการใด ๆ ในขณะที่เรากำลังสแกน ถ้า ล้มเหลวในการทดสอบของเราแล้วเพิ่ม ไปที่การตั้งค่าและลบ เราทำเครื่องหมายไว้
แต่นั่นไม่เร็วพอ มันจะเจ๋งจริงๆถ้ามี วิธีการแก้ปัญหาหรือในโลกที่สมบูรณ์แบบความซับซ้อนคล้ายกับต้นไม้ Radix () นอกจากนี้ยังตกลงสำหรับแบบสอบถามที่จะถูกต้องประมาณ : นั่นคือถ้าจากนั้นส่งคืนใช่หรือไม่; แต่ถ้าเงื่อนไขไม่ถือกลับไม่แน่นอน
แม้ว่าสิ่งนี้จะไม่ช่วยให้เกิดความซับซ้อนของกรณีที่เลวร้ายที่สุด แต่คุณสามารถสันนิษฐานได้ว่าองค์ประกอบทั้งหมดใน ถูก จำกัด ด้วยสตริงตัวแทน นั่นคือมีบางส่วน เช่นนั้นสำหรับทุกคน , .
ไอเดียที่ฉันได้ลอง
- สตริงตัวแทนในรูปแบบเข้าร่วม semilattice เราสามารถมีต้นไม้ n-ary ที่เก็บสายอักขระไวด์การ์ด ใบไม้จะเป็นสายอักขระตัวแทนและสาขาจะเป็นตัวแทนของเด็กทุกคน หากการสืบค้นและการเข้าร่วมนั้นหาที่เปรียบมิได้เราไม่ต้องเสียเวลาลองเปรียบเทียบกับลูก ๆ ของสาขานั้น ๆ นอกจากนี้หากเราทำการอัปเดตและการอัปเดตนั้นยิ่งใหญ่กว่าการเข้าร่วมเราสามารถลบทั้งสาขาได้ น่าเสียดายที่นี่ยังอยู่ ในกรณีที่เลวร้ายที่สุดและเราไม่พบการรวมที่ดีที่สุดเสมอเมื่อทำการสแกนผ่านต้นไม้เพื่อเพิ่มองค์ประกอบ
- หนึ่งสามารถสร้าง trie radix ของ . เรารู้ว่าถูก จำกัด โดยสตริงตัวแทนบางรายการ สมมติว่าเป็น 0 0 จากนั้นกิ่งก้านของทั้งคู่จะต้องอยู่บนสายที่ 1 และ 3 เท่านั้น หากบิตปัจจุบันที่เรากำลังแยกในแบบสอบถามเป็น 1 เราต้องตรวจสอบ? และ 1 กิ่ง; ถ้าเป็น 0 เราจะตรวจสอบหรือไม่ และ 0 สาขา; ถ้าใช่เราตรวจสอบเท่านั้น สาขา. เนื่องจากเราต้องใช้หลายสาขาจึงไม่ดีมาก (เป็นการยากที่จะอัปเดตทั้งคู่ด้วยเหตุผลเดียวกัน) เนื่องจากการจับคู่เป็นการดำเนินการที่รวดเร็วมากมันเจ็บเมื่อเปรียบเทียบกับกลยุทธ์ที่ไร้เดียงสาเพื่อทำการสำรวจภายในต้นไม้ (การติดตามตัวชี้จำนวนมากมีราคาแพงกว่าการทำ OR และ AND
งานที่เกี่ยวข้อง
ในชุมชนเครือข่ายปัญหานี้ปรากฏว่า "การจัดหมวดหมู่แพ็คเก็ต" ที่นี่คือการสำรวจที่ดีของขั้นตอนวิธีและโครงสร้างข้อมูลที่รู้จักกัน น่าเสียดายที่ข้อสันนิษฐานนั้นเกือบทุกครั้งที่สตริงอักขระตัวแทนตรงกับคำนำหน้าเท่านั้นและแบบสอบถามนั้นเป็นสิ่งอันดับของสตริงดังกล่าว แน่นอนเราสามารถแปลงสตริงตัวแทนทั่วไปเพื่อให้ตรงกับเกณฑ์เหล่านี้: 1? 00? 1 ?? คือ (1,?, 0, 0,?, 1,?,?) แม้ว่ามันจะไม่ได้ผล ข้อสันนิษฐานอื่นที่ทำคือสิ่งอันดับเหล่านี้เกี่ยวข้องกับ "สี" และการสืบค้นควรส่งคืนสี (ไม่ใช่แค่ที่มันจับคู่) สิ่งนี้ทำให้ปัญหายากขึ้นมากเพราะเราต้องเรียงลำดับสิ่งอันดับ
ในชุมชนอัลกอริทึมฉันได้พบผลลัพธ์จำนวนมากที่เกี่ยวข้องกับการค้นหาสตริงย่อยที่ตรงกับ "ไม่สนใจ" นี่เป็นปัญหาที่หนักกว่ามากและฉันก็ใช้เทคนิคไม่ได้เลย
สรุปแล้ว
ขอบคุณสำหรับความช่วยเหลือใด ๆ !