ดังที่มีการชี้ให้เห็นปัญหานี้คล้ายกับปัญหาระยะทางแก้ไขที่รู้จักกันมากกว่าปกติ (พื้นฐานระยะทาง Levenshtein ) นอกจากนี้ยังมี commonalities ด้วยเช่นระยะเวลาการแปรปรวนเวลาแบบไดนามิก (การทำซ้ำหรือ "การพูดติดอ่าง" ในข้อกำหนดล่าสุดของคุณ)
ขั้นตอนในการเขียนโปรแกรมแบบไดนามิก
ความพยายามครั้งแรกของฉันที่สลายตัว recursive ตามสายของ Levenshtein ระยะทางและ Dynamic เวลาแปรปรวนระยะทางเป็นสิ่งที่ต้องการต่อไปนี้ (สำหรับและY = Y 1 ... Y ม. ) กับd ( x , Y )เป็นอยู่ ตั้งค่าเป็น
min { d ( x , y 1 … y m - 1 ) + 1x = x1… xnY= y1… yม.d(x , y)
ขั้นต่ำ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪d( x , y1… ym - 1) + 1d( x , y2… yม.) + 1d( x , y1… ym / 2) + 1d( x1… xn / 2, y) + 1d( x1… xn, y) + 1d( x1… xn - 1, y1… ym - 1)ถ้า y= y1… ym / 2Y1… ym / 2ถ้า x = x1… xn / 2x1… xn / 2ถ้า yn=yม.▻เพิ่มจดหมายท้าย▻เพิ่มตัวอักษรที่จุดเริ่มต้น▻เสแสร้ง▻ครึ่งหนึ่ง▻การลบ▻ ละเว้น elt ล่าสุด
ที่นี่ตัวเลือกสุดท้ายโดยทั่วไปบอกว่าการแปลง FOOX เป็น BARX เทียบเท่ากับการแปลง FOO เป็น BAR ซึ่งหมายความว่าคุณสามารถใช้ตัวเลือก“ เพิ่มจดหมายท้าย” เพื่อให้ได้เอฟเฟกต์การพูดติดอ่าง (ซ้ำ) และการลบ ณ จุดหนึ่ง ปัญหาคือว่ามันจะช่วยให้คุณเพิ่มพลตัวละครในช่วงกลางของสตริงเช่นเดียวกับสิ่งที่คุณอาจไม่ต้องการ (นี่“ ไม่สนใจองค์ประกอบสุดท้ายที่เหมือนกัน” เป็นวิธีมาตรฐานในการลบและพูดติดอ่างในตำแหน่งที่กำหนดเองมันทำให้การห้ามการแทรกโดยพลการในขณะที่อนุญาตให้เพิ่มเติมที่ปลายทั้งสองเป็นเรื่องยุ่งยากเล็กน้อย…)
ฉันได้รวมรายละเอียดนี้ไว้แล้วแม้ว่าจะไม่ได้ทำงานอย่างสมบูรณ์ในกรณีที่คนอื่นสามารถ "ช่วยเหลือ" มันได้ แต่อย่างใด - และเนื่องจากฉันใช้มันในโซลูชันแบบแก้ปัญหาด้านล่าง
(แน่นอนถ้าคุณสามารถแยกย่อยแบบนี้ซึ่งกำหนดระยะทางของคุณจริง ๆ คุณจะต้องเพิ่มการบันทึกและคุณมีวิธีแก้ปัญหาอย่างไรก็ตามเนื่องจากคุณไม่ได้ทำงานกับคำนำหน้าเท่านั้น ไม่คิดว่าคุณสามารถใช้เพียงดัชนีสำหรับบันทึกช่วยจำของคุณคุณอาจต้องจัดเก็บสตริงที่ถูกต้องจริงสำหรับการโทรแต่ละครั้งซึ่งจะได้รับมากหากสตริงของคุณมีขนาดใหญ่)
ขั้นตอนสู่การแก้ปัญหาด้วยการเรียนรู้
A* * * * A* * * *
A* * * *A* * * *A* * * *วิ่ง. (เวลา - / พื้นที่การแลกเปลี่ยนที่นั่น)
ดังนั้น…
ประสิทธิภาพของวิธีแก้ปัญหาที่เสนอของฉันดูเหมือนจะขึ้นอยู่กับ (1) ความยาวของสายอักขระและ (2) ขนาดตัวอักษรของคุณ ถ้าไม่ใหญ่ก็อาจใช้ได้ นั่นคือ:
- ใช้ขอบเขตล่างกับระยะทางของคุณโดยใช้การย่อยสลายแบบเรียกซ้ำและการเขียนโปรแกรมแบบไดนามิก (ตัวอย่างเช่นการใช้ฟังก์ชั่นบันทึกความจำแบบเรียกซ้ำ)
- A* * * *A* * * *
ฉันไม่สามารถรับประกันได้ว่ามันจะมีประสิทธิภาพแค่ไหน แต่ควรจะถูกต้องและมันอาจจะดีกว่าวิธีการแก้ปัญหาแบบไร้เดียงสา
หากไม่มีอะไรอื่นฉันหวังว่านี่จะช่วยให้คุณมีความคิดในการตรวจสอบเพิ่มเติม