การตัดสินใจว่าสตริง wildcard ถูกจับคู่โดยสตริง wildcard อื่นในชุดหรือไม่


9

นี่คือปัญหาที่ทำให้ฉันดักฟังมาระยะหนึ่งแล้ว สมมุติว่าสตริงเป็นลำดับ 1 และ 0 และสตริงตัวแทนคือ 1 และ 0 สตริงและสตริงตัวแทนทั้งหมดมีความยาวเท่ากัน นี่คือสัญลักษณ์ตัวแทน UNIX มาตรฐาน 10 ?? 1 การแข่งขัน 10011, 10111, ฯลฯ -? ตรงกับ 1 หรือ 0 ในตำแหน่งนั้น ถ้าโวลต์ และ W เป็นสตริงไวด์การ์ดจากนั้นเราเขียน โวลต์W ถ้าทุกสายจับคู่ด้วย โวลต์ ถูกจับคู่โดย W.

ปัญหา : ได้รับชุดS ของสายอักขระตัวแทนและแบบสอบถาม โวลต์ (เช่นสตริงตัวแทน) ซึ่งมีอยู่ WS ดังนั้น โวลต์W? และถ้าไม่เราสามารถเพิ่มโวลต์ ถึง S ได้อย่างมีประสิทธิภาพ?

นี่คือสิ่งที่ชัดเจน O(kม.n) วิธีแก้ปัญหา (ที่ไหน k คือขนาดของสตริง ม.คือขนาดคำของ RAM (ปกติคือ 32 หรือ 64)): ผ่านแต่ละองค์ประกอบของรายการและทดสอบเงื่อนไข (ซึ่งสามารถทำได้ใน 2 หรือ 3 การดำเนินการโดยใช้การบิดสองบิต) ทดสอบด้วยถ้าโวลต์W ถือสำหรับรายการใด ๆ Wในขณะที่เรากำลังสแกน ถ้าโวลต์ ล้มเหลวในการทดสอบของเราแล้วเพิ่ม โวลต์ ไปที่การตั้งค่าและลบ Wเราทำเครื่องหมายไว้

แต่นั่นไม่เร็วพอ มันจะเจ๋งจริงๆถ้ามีO(เข้าสู่ระบบn) วิธีการแก้ปัญหาหรือในโลกที่สมบูรณ์แบบความซับซ้อนคล้ายกับต้นไม้ Radix (O(k)) นอกจากนี้ยังตกลงสำหรับแบบสอบถามที่จะถูกต้องประมาณ : นั่นคือถ้าโวลต์Wจากนั้นส่งคืนใช่หรือไม่; แต่ถ้าเงื่อนไขไม่ถือกลับไม่แน่นอน

แม้ว่าสิ่งนี้จะไม่ช่วยให้เกิดความซับซ้อนของกรณีที่เลวร้ายที่สุด แต่คุณสามารถสันนิษฐานได้ว่าองค์ประกอบทั้งหมดใน Sถูก จำกัด ด้วยสตริงตัวแทน นั่นคือมีบางส่วนโวลต์ เช่นนั้นสำหรับทุกคน WS, โวลต์W.

ไอเดียที่ฉันได้ลอง

  • สตริงตัวแทนในรูปแบบเข้าร่วม semilattice เราสามารถมีต้นไม้ n-ary ที่เก็บสายอักขระไวด์การ์ด ใบไม้จะเป็นสายอักขระตัวแทนและสาขาจะเป็นตัวแทนของเด็กทุกคน หากการสืบค้นและการเข้าร่วมนั้นหาที่เปรียบมิได้เราไม่ต้องเสียเวลาลองเปรียบเทียบกับลูก ๆ ของสาขานั้น ๆ นอกจากนี้หากเราทำการอัปเดตและการอัปเดตนั้นยิ่งใหญ่กว่าการเข้าร่วมเราสามารถลบทั้งสาขาได้ น่าเสียดายที่นี่ยังอยู่O(n) ในกรณีที่เลวร้ายที่สุดและเราไม่พบการรวมที่ดีที่สุดเสมอเมื่อทำการสแกนผ่านต้นไม้เพื่อเพิ่มองค์ประกอบ
  • หนึ่งสามารถสร้าง trie radix ของ S. เรารู้ว่าSถูก จำกัด โดยสตริงตัวแทนบางรายการ สมมติว่าเป็น 0 0 จากนั้นกิ่งก้านของทั้งคู่จะต้องอยู่บนสายที่ 1 และ 3 เท่านั้น หากบิตปัจจุบันที่เรากำลังแยกในแบบสอบถามเป็น 1 เราต้องตรวจสอบ? และ 1 กิ่ง; ถ้าเป็น 0 เราจะตรวจสอบหรือไม่ และ 0 สาขา; ถ้าใช่เราตรวจสอบเท่านั้น สาขา. เนื่องจากเราต้องใช้หลายสาขาจึงไม่ดีมาก (เป็นการยากที่จะอัปเดตทั้งคู่ด้วยเหตุผลเดียวกัน) เนื่องจากการจับคู่เป็นการดำเนินการที่รวดเร็วมากมันเจ็บเมื่อเปรียบเทียบกับกลยุทธ์ที่ไร้เดียงสาเพื่อทำการสำรวจภายในต้นไม้ (การติดตามตัวชี้จำนวนมากมีราคาแพงกว่าการทำ OR และ AND

งานที่เกี่ยวข้อง

  • ในชุมชนเครือข่ายปัญหานี้ปรากฏว่า "การจัดหมวดหมู่แพ็คเก็ต" ที่นี่คือการสำรวจที่ดีของขั้นตอนวิธีและโครงสร้างข้อมูลที่รู้จักกัน น่าเสียดายที่ข้อสันนิษฐานนั้นเกือบทุกครั้งที่สตริงอักขระตัวแทนตรงกับคำนำหน้าเท่านั้นและแบบสอบถามนั้นเป็นสิ่งอันดับของสตริงดังกล่าว แน่นอนเราสามารถแปลงสตริงตัวแทนทั่วไปเพื่อให้ตรงกับเกณฑ์เหล่านี้: 1? 00? 1 ?? คือ (1,?, 0, 0,?, 1,?,?) แม้ว่ามันจะไม่ได้ผล ข้อสันนิษฐานอื่นที่ทำคือสิ่งอันดับเหล่านี้เกี่ยวข้องกับ "สี" และการสืบค้นควรส่งคืนสี (ไม่ใช่แค่ที่มันจับคู่) สิ่งนี้ทำให้ปัญหายากขึ้นมากเพราะเราต้องเรียงลำดับสิ่งอันดับ

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

สรุปแล้ว

ขอบคุณสำหรับความช่วยเหลือใด ๆ !


1
อนุญาตให้สตริงมีขนาดเท่าใด และทำไมคุณถึงไม่เข้าใจความยาวของมันในความซับซ้อน? เห็นได้ชัดว่าคุณต้องการสตริงที่จะΩ(logn) มิฉะนั้นคุณก็จะไม่มี nสตริงที่แตกต่างเพื่อทำงานกับ นอกจากนี้ยังดูเหมือนง่ายถ้าคุณอนุญาตO(n)- ความยาวสตริงจากนั้นคุณจะต้องดูสตริงทั้งหมดของคุณในโครงสร้างข้อมูลของคุณในกรณีที่เลวร้ายที่สุด ... มีขอบเขตความยาวสตริงหรือไม่? โพลีลอการิทึม?o(n)?
Artem Kaznatcheev

ขออภัยถ้าฉันไม่ชัดเจน สตริงมีO(1)ขนาด; สำหรับความตั้งใจและจุดประสงค์ทั้งหมดคุณสามารถนึกได้ว่าพวกมันมีความยาว 32 ตัวอักษร "String" เป็นเพียงนามธรรมที่สะดวกสำหรับการกำหนดปัญหา - พวกมันจะแสดงเป็น tuples (จำนวนเต็ม, bitmask) เพื่อให้ฉันสามารถคำนวณการเข้าร่วมและvwในการดำเนินงานของเครื่องเพียงไม่กี่ (แน่นอนปัญหาสามารถขยายได้ตามธรรมชาติไปยังสตริงขนาดคงที่ที่มีขนาดใหญ่ขึ้นโดยการเพิ่มจำนวนฟิลด์จำนวนเต็มและ bitmask)
Christopher Monsanto

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

คำตอบ:


3

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

รอยย่นเป็นวิธีจัดการกับตัวดำเนินการตัวแทน:. อักขระตัวแทนในสตริงอักขระตัวแทนตรงกับ 0 หรือ 1 ในสตริงทดสอบ แต่เนื่องจากเราพยายามรับรู้สตริงไวด์การ์ดไวด์การ์ดในสตริงไวด์การ์ดจึงตรงกับ 0, 1 หรือ? ในสตริงไวด์การ์ดอื่น ชุดนี้ยังคงปกติดังนั้นเราจึงเปลี่ยนทุกสิ่งที่เกิดขึ้น? ไปที่นิพจน์ทั่วไป (0 | 1 |?) โดยที่แถบแนวตั้งเป็นตัวดำเนินการสำรองตามปกติ ดังนั้นถ้าครบทั้งชุดS คือ {10 ?? 1, 0? 1? 0} นิพจน์ทั่วไปที่ได้จะเป็น (10 (0 | 1 |?) (0 | 1 |?) 1 | 0 (0 | 1 |?) 1 (0 | 1 |?) 0)

สำหรับการเพิ่มสตริงลงในเครื่องมีงานล่าสุดเกี่ยวกับการเปลี่ยนออโตเมติก จำกัด แบบเพิ่มหน่วย ดูบทความนี้โดย Daciuk et al: "การก่อสร้างที่เพิ่มขึ้นของออโตมาตะ Acyclic Finite-State Automata"

สิ่งนี้ช่วยได้ไหม?


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

ฉันอ้างถึง Daciuk และคณะเพราะมันดูใกล้เคียงกับสิ่งที่คุณพยายามจะทำ แต่ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงว่าปัญหาได้รับการแก้ไขเร็ว ๆ นี้สำหรับ Cariteco และ Forcada โดยพลการของ Arras ในเอกสารของพวกเขา "การก่อสร้างที่เพิ่มขึ้นและการบำรุงรักษาของAutomite
ShyPerson

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