จำนวนการแก้ไขสั้นที่สุดย้ายระหว่างสองคำ


11

ฉันกำลังมองหาโครงสร้างข้อมูลและอัลกอริทึมในการคำนวณจำนวนการเปลี่ยนแปลงขั้นต่ำที่จำเป็นในการแปลงคำหนึ่งเป็นอีกคำหนึ่งโดยให้ทั้งสองคำเป็นอินพุตซึ่งการเปลี่ยนแปลงที่อนุญาตเท่านั้นคือ

  • เพิ่มตัวอักษรที่หนึ่งในขา (เช่น AB -> ABC)
  • ทำซ้ำและต่อคำทั้งหมด (ตัวอย่างเช่น ABC -> ABCABC)
  • ตัดคำในสอง (คู่ของการย้ายซ้ำ, ABCABC -> ABC + ABC)
  • ลบตัวอักษรตัวใดตัวหนึ่ง (เช่น ABC -> AC) และ
  • ทำซ้ำตัวอักษรตัวใดตัวหนึ่ง (เช่น ABC -> ABBC)

ตัวอย่างเช่นลำดับขั้นต่ำของการย้ายจาก ABC ไปยัง BCBC คือ ABC -> BC (ลบ A) -> BCBC (การทำซ้ำ)

ฉันไม่มีพื้นฐานด้านวิทยาการคอมพิวเตอร์ บางทีนี่อาจเป็นปัญหาที่รู้จักกันดี แต่การค้นหาโดย Google ของฉันไม่ได้ให้อะไรเลย

คุณรู้หรือไม่ว่าปัญหาที่เกี่ยวข้องและกำหนดชัดเจน?

แก้ไข : ตามที่แนะนำในคำตอบโดย Anthony Labarre ฉันอ่านเอกสารบางอย่างเกี่ยวกับปัญหาการเปลี่ยนแปลง / การจัดการโพสต์ซึ่งคล้ายกับปัญหาที่อธิบายไว้ข้างต้น ไม่มีใครรู้เพิ่มเติมเกี่ยวกับปัญหานี้หรือไม่? สิ่งนี้เกี่ยวข้องหรือไม่


1
สันนิษฐานว่าไม่มีผู้ใดออกจากรายการที่en.wikipedia.org/wiki/String_metricใช้ไม่เป็นมันในsourceforge.net/projects/simmetrics ?
András Salamon

ฉันไม่ทราบทั้งหมด แต่ส่วนใหญ่เป้าหมายของวิธีการเหล่านี้คือการจัดสายอักขระที่อนุญาตให้มีการเปลี่ยนแปลงตัวอักษรเดียวเท่านั้นและไม่อนุญาตให้มีการเคลื่อนไหวที่ซับซ้อนมากขึ้น
cz3rk

1
การทำซ้ำจะใช้กับทั้งสตริง ABC -> ABCABC ดังนั้นทิศทางไม่สำคัญ แต่ทิศทางของการทำซ้ำจะอยู่ในลำดับที่ถูกต้องเช่นเดียวกับการพูดติดอ่าง
cz3rk

2
ทำไมมันถึงสำคัญถ้าคำที่ป้อนไม่แบ่งปันตัวอักษร? (ควรมีสตริงว่างระหว่างAและBในลำดับของ @ reinerpost)
Jeffε

2
คุณเพิ่มการดำเนินการ "ตัดคำสองคำ"; คุณหมายถึงการดำเนินการซึ่งแผนที่เพื่อW ? WWW
argentpepper

คำตอบ:


3

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

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


ขอบคุณฉันจะดูงานของพวกเขา ฉันเห็นความสัมพันธ์ระหว่างสองปัญหา
cz3rk

2

ดังที่มีการชี้ให้เห็นปัญหานี้คล้ายกับปัญหาระยะทางแก้ไขที่รู้จักกันมากกว่าปกติ (พื้นฐานระยะทาง Levenshtein ) นอกจากนี้ยังมี commonalities ด้วยเช่นระยะเวลาการแปรปรวนเวลาแบบไดนามิก (การทำซ้ำหรือ "การพูดติดอ่าง" ในข้อกำหนดล่าสุดของคุณ)

ขั้นตอนในการเขียนโปรแกรมแบบไดนามิก

ความพยายามครั้งแรกของฉันที่สลายตัว recursive ตามสายของ Levenshtein ระยะทางและ Dynamic เวลาแปรปรวนระยะทางเป็นสิ่งที่ต้องการต่อไปนี้ (สำหรับและY = Y 1 ... Y ม. ) กับd ( x , Y )เป็นอยู่ ตั้งค่าเป็น min { d ( x , y 1y m - 1 ) + 1x=x1...xnY=Y1...Yม.d(x,Y)

นาที{d(x,Y1...Yม.-1)+1▻เพิ่มจดหมายท้ายd(x,Y2...Yม.)+1▻เพิ่มตัวอักษรที่จุดเริ่มต้นd(x,Y1...Yม./2)+1ถ้า Y=Y1...Yม./2Y1...Yม./2▻ทวีคูณd(x1...xn/2,Y)+1ถ้า x=x1...xn/2x1...xn/2▻ลดลงครึ่งหนึ่งd(x1...xn,Y)+1▻การลบd(x1...xn-1,Y1...Yม.-1)ถ้า Yn=Yม.▻ละเว้น elt ล่าสุด

ที่นี่ตัวเลือกสุดท้ายโดยทั่วไปบอกว่าการแปลง FOOX เป็น BARX เทียบเท่ากับการแปลง FOO เป็น BAR ซึ่งหมายความว่าคุณสามารถใช้ตัวเลือก“ เพิ่มจดหมายท้าย” เพื่อให้ได้เอฟเฟกต์การพูดติดอ่าง (ซ้ำ) และการลบ ณ จุดหนึ่ง ปัญหาคือว่ามันจะช่วยให้คุณเพิ่มพลตัวละครในช่วงกลางของสตริงเช่นเดียวกับสิ่งที่คุณอาจไม่ต้องการ (นี่“ ไม่สนใจองค์ประกอบสุดท้ายที่เหมือนกัน” เป็นวิธีมาตรฐานในการลบและพูดติดอ่างในตำแหน่งที่กำหนดเองมันทำให้การห้ามการแทรกโดยพลการในขณะที่อนุญาตให้เพิ่มเติมที่ปลายทั้งสองเป็นเรื่องยุ่งยากเล็กน้อย…)

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

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

ขั้นตอนสู่การแก้ปัญหาด้วยการเรียนรู้

A* * * * A* * * *

A* * * *A* * * *A* * * *วิ่ง. (เวลา - / พื้นที่การแลกเปลี่ยนที่นั่น)

ดังนั้น…

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

  • ใช้ขอบเขตล่างกับระยะทางของคุณโดยใช้การย่อยสลายแบบเรียกซ้ำและการเขียนโปรแกรมแบบไดนามิก (ตัวอย่างเช่นการใช้ฟังก์ชั่นบันทึกความจำแบบเรียกซ้ำ)
  • A* * * *A* * * *

ฉันไม่สามารถรับประกันได้ว่ามันจะมีประสิทธิภาพแค่ไหน แต่ควรจะถูกต้องและมันอาจจะดีกว่าวิธีการแก้ปัญหาแบบไร้เดียงสา

หากไม่มีอะไรอื่นฉันหวังว่านี่จะช่วยให้คุณมีความคิดในการตรวจสอบเพิ่มเติม


0

บางคนที่เกี่ยวข้องกับปัญหาที่กำหนดไว้อย่างดีจะเป็นปัญหาของลำดับการจัดเรียง มันแตกต่างเพราะไม่ได้ใช้การทำซ้ำ การดำเนินการที่กำหนดคือ: การแทรกตัวละคร, การลบตัวละคร, การแปลงตัวละคร ขั้นตอนวิธีการที่เป็นที่นิยมสำหรับการแก้ปัญหานี้คือNeedleman-Wunsch


ฉันรู้สิ่งนี้ แต่ฉันต้องการทำงานกับชุดของการเคลื่อนไหวที่กำหนด วิธีเดียวที่ฉันได้พบทำด้วยอัลกอริทึมแบบเรียกซ้ำแบบ brute-force ไม่ค่อยดีนักและเขาสามารถใช้คอมพิวเตอร์ได้อย่างเข้มข้นหากขนาดของคำเพิ่มขึ้น
cz3rk

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