สามารถใช้ต้นไม้ต่อท้ายเพื่อค้นหาสตริงย่อยทั่วไปได้หรือไม่?


10

ฉันพยายามใช้ต้นไม้ต่อท้ายเพื่อเปรียบเทียบลำดับของสตริง ฉันได้พบการใช้งาน / ทฤษฎีสำหรับปัญหาสตริงย่อยทั่วไปที่ยาวที่สุดโดยใช้ต้นไม้ต่อท้าย อย่างไรก็ตามสิ่งที่ฉันกำลังมองหาคือการอภิปรายปัญหาที่เกี่ยวข้อง - "สตริงย่อยทั่วไป" โดยเฉพาะฉันมีปัญหาที่ฉันต้องการค้นหาสตริงย่อยทั่วไปที่ยาวที่สุดก่อนจากนั้นค้นหาสตริงย่อยทั่วไปที่ยาวที่สุดถัดไปที่ไม่รวมดัชนี lcs ที่พบแล้วและจนถึงความยาวต่ำสุด ปัญหานี้แก้ไขได้หรือไม่โดยการสร้างทรีต่อท้าย Generalized (GST) เพียงครั้งเดียวสำหรับสองซีเควนซ์ ฉันรู้ว่ามันสามารถแก้ไขได้โดยการสร้าง GST ซ้ำหลายครั้งหลังจากการค้นหาและการถอด LCS ซ้ำทุกครั้ง แต่ฉันสงสัยว่าถ้าฉันขาดเล่ห์เหลี่ยมเรียบร้อยซึ่งใน GST ถูกสร้างขึ้นเพียงครั้งเดียว


มันเป็นคำถามที่น่าสนใจ ปัญหาคือว่าถ้าเรามีและเราพบว่าคือ LCS wrtเราไม่สามารถ "ลบ"ออกจากต้นไม้ต่อท้ายได้อย่างง่ายดาย(หรืออาร์เรย์ส่วนต่อท้ายอะไรก็ตาม) เราต้องการมีบางอย่างเช่นหลังจากขั้นตอนแรกใช่มั้ย β T β S ' = α $ γS=αβγβTβS=α$γ
Dmytro Korduban

คำตอบ:


3

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

รับข้อความ , ส่วนต่อท้ายสำหรับคืออาร์เรย์ของจำนวนเต็มของช่วงถึงระบุการเรียงลำดับพจนานุกรมของคำต่อท้ายของสตริง $ S 0 n n + 1 SS=s1,...,snS0nn+1S

เราต้องการเชื่อมต่ออาร์เรย์ต่อท้ายกับซึ่งเป็นคำนำหน้าทั่วไปที่ยาวที่สุด เราสามารถสร้างอาร์เรย์ของเส้นเวลาตามที่กล่าวไว้ในกระดาษโดย Kasai et al, คำต่อท้ายอาร์เรย์และอาร์เรย์ lcp ของพวกเขาเข้าด้วยกันในวิธีที่กำหนดดัชนีให้กับอาร์เรย์ lcp พูดโดยที่คือหมายเลขดัชนีจากนั้นจะเป็นจุดเริ่มต้นของอินสแตนซ์ย่อยทั่วไปและจะเป็นดัชนีเริ่มต้นของอินสแตนซ์ที่สอง ความยาวแน่นอนค่าในอาร์เรย์ lcpL C P s l c p [ k ] k s a [ k ]LCPsLCPslcp[k]ksa[k]sa[k1]


3

ฉันมีความคิดที่อาจใช้งานได้ เราเริ่มต้นด้วยต้นไม้ต่อท้ายทั่วไปสำหรับลำดับและT แต่ละโหนดภายในที่มีคำต่อท้ายของทั้งSและTในทรีย่อยของมันสอดคล้องกับสตริงย่อยทั่วไปของลำดับ ให้เราเรียกโหนดดังกล่าวว่าไม่ใช่เรื่องไร้สาระ สตริงย่อยทั่วไปคือสูงสุดถ้าโหนดที่เกี่ยวข้องไม่มีชายน์ที่ไม่สำคัญ ถ้าโหนดโวลต์เป็นที่ไม่น่ารำคาญเราเก็บสตริงเชิงลึกที่ใหญ่ที่สุดของโหนดที่ไม่น่ารำคาญในทรีย่อยที่เป็นลิตรs ( วี ) ถ้าrคือรูตแล้วl c sSTSTvlcs(v)rlcs(r)คือความยาวของสตริงย่อยทั่วไปที่ยาวที่สุดของและTST

การอัปเดตต้นไม้หลังจากลบสตริงย่อยจากหนึ่งในลำดับไม่ควรยากเกินไป ก่อนอื่นเราจะลบใบไม้ที่สอดคล้องกับคำต่อท้ายที่ถูกลบอัปเดตบรรพบุรุษของพวกเขาเมื่อต้องการ จากนั้นเราเริ่มประมวลผลคำต่อท้ายก่อนสตริงย่อยที่ถูกลบ ให้เป็นบรรพบุรุษที่ไม่ใช่เรื่องไร้สาระที่สุดของใบไม้ปัจจุบัน หากความยาวของคำต่อท้ายคือk (เราเป็นขั้นตอนkจากการลบ) และk < l c s ( v )เราต้องย้ายคำต่อท้ายไปยังตำแหน่งที่เหมาะสมในต้นไม้อัปเดตบรรพบุรุษเมื่อจำเป็น ถ้าk l c s ( v )vkkk<lcs(v)klcs(v)เราทำเสร็จแล้วเพราะเราไม่สนใจรากต้นไม้ที่มีรากเล็กน้อย

อัลกอริทึมโดยรวมพบว่าสตริงย่อยทั่วไปที่ยาวที่สุดของและTซ้ำแล้วซ้ำอีกและลบหนึ่งในเหตุการณ์ที่เกิดขึ้นจากทั้งสองลำดับตราบใดที่ความยาวของ LCS มีขนาดใหญ่พอST

มีเทคนิคบางอย่าง แต่แนวคิดทั่วไปควรใช้งานได้


0

เริ่มต้นด้วยการตัดแบ่งข้อความS $ Tที่ $ เกิดขึ้นไม่มีที่ไหนใน * หรือT สร้างต้นไม้ / อาร์เรย์ต่อท้ายจากข้อความนี้ ตอนนี้มันเป็นเรื่องง่ายที่จะสำรวจโครงสร้างข้อมูลต่อท้ายนี้เพื่อรวบรวมการทำซ้ำสูงสุดที่เหมาะสมทั้งหมด โดยการตรวจสอบบริบทด้านซ้ายให้กรองการทำซ้ำสูงสุดที่ไม่เหลืออยู่ออก การกรองทางซ้ายนี้อาจถูกนำมาใช้โดยใช้ตาราง Burrows-Wheeler เช่นเดียวกับใน Abouelhoda และคณะถึงแม้ว่าฉันไม่เชื่อว่านี่เป็นสิ่งจำเป็น ทำซ้ำเกิดขึ้นเฉพาะใน SหรือเฉพาะในTควรกำจัด olso ณ จุดนี้ การทำซ้ำที่ไม่ได้ถูกกำจัดออกจะถูกจัดลำดับความสำคัญตามลำดับความสำคัญที่กำหนดโดยความยาว หลังจากการแวะผ่านการทำซ้ำที่บันทึกไว้จะถูกลบออกจากลำดับความสำคัญการกรองขั้นสุดท้าย (สำหรับการบรรจุสตริงย่อย) สามารถดำเนินการได้ อย่างไรก็ตามด้วยการใช้วลีสูงสุด แต่ฉันคิดว่าจำเป็นต้องใช้ตัวกรองนี้น้อยมาก

อัลกอริทึมนี้เป็นสิ่งประดิษฐ์ของฉันเอง ฉันจะไม่จัดว่ามันฉลาด แต่มันควรจะทำงาน


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