แก้ไขระยะทางของรายการด้วยองค์ประกอบเฉพาะ


12

Levenshtein-Distance ระยะทางแก้ไขระหว่างรายการเป็นปัญหาที่ศึกษากันดี แต่ฉันไม่สามารถหามากเกี่ยวกับการปรับปรุงไปได้ถ้า มันเป็นที่รู้จักกันว่าองค์ประกอบไม่มีไม่เกิดขึ้นมากกว่าหนึ่งครั้งในแต่ละรายการ

ลองสมมติว่าองค์ประกอบนั้นสามารถเปรียบเทียบได้ / เรียงลำดับได้ (แต่รายการที่จะเปรียบเทียบจะไม่เรียงลำดับเพื่อเริ่มต้นด้วย)

O(min(m,n)s)O(min(s,m,n)s)s

เป็นทางการมากขึ้น

เราสามารถคำนวณระยะทางในการแก้ไขระหว่างสองสายที่กำหนด มีประสิทธิภาพด้วยคำสัญญาที่ว่าพวกเขาไม่มีตัวอักษรซ้ำ ๆ กันหรือไม่?s,tΣ

Σเป็นตัวอักษรที่มีขนาดใหญ่มาก


ตอนนี้คุณมีคำถามอะไร วิธีเพิ่มความเร็วในการแก้ไขระยะทางในแบบคู่หรือวิธีการคำนวณระยะทางแบบคู่ทั้งหมดในรายการของสตริง?
กราฟิลส์

2
ฉันสงสัยว่าคำถามคือ: วิธีคำนวณระยะทางแก้ไขระหว่าง , โดยที่เป็นสายอักขระที่มีขนาดใหญ่มากและเรารับประกันว่าไม่มีจดหมายปรากฏสองครั้งในหรือ ใน (OP หมายถึงแต่ละสตริงเป็นรายการของตัวอักษรเช่นรายการขององค์ประกอบ) แต่สิ่งนี้ต้องการการยืนยัน s,ts,tΣΣst
DW

ใช่ในกรณีนี้ตัวอักษรขนาดใหญ่ประกอบด้วยดัชนีฐานข้อมูลและ "สตริง", s และ t เป็นรายการที่มีดัชนีเหล่านี้
user362178

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

คำตอบ:


3

TL; DR: ระยะทางแก้ไขที่ จำกัด มากขึ้นซึ่งเราสามารถแทรกและลบอักขระแต่ละตัวเท่านั้นสามารถคำนวณได้ในเวลาเชิงเส้นตรงเมื่อทั้งสอง (หรือแม้แต่เพียงหนึ่ง) ของสตริงมีอักขระที่ไม่ซ้ำกัน สิ่งนี้จะช่วยให้ขอบเขตด้านบนและล่างที่เป็นประโยชน์ของระยะทางแก้ไขของ Levenshtein

แทรก / ลบระยะทางแก้ไขและลำดับที่ยาวที่สุดที่พบบ่อย

Levenshtein edit distance ช่วยให้การแทรก, การลบและการเปลี่ยนตัวอักขระเดี่ยว, การกำหนดค่าใช้จ่ายแต่ละ 1 ถ้าเรา จำกัด เพียงแค่การแทรกและการลบเราได้รับการวัดระยะทางที่คล้ายกันซึ่งตอนนี้การทดแทนมีค่าใช้จ่าย 2 เลียนแบบโดยใช้การแทรกและการลบ) ฉันไม่ทราบชื่อมาตรฐานสำหรับระยะทางแก้ไขที่ จำกัด มากขึ้นดังนั้นฉันจะเรียกมันว่า "แทรก / ลบระยะแก้ไข" มันสอดคล้องอย่างใกล้ชิดกับปัญหาการเรียงลำดับทั่วไปที่ยาวที่สุดซึ่งเราได้รับสองสายคือความยาวและตามลำดับและต้องการทราบความยาวของการเรียงลำดับที่ยาวที่สุดที่ปรากฏในทั้งสอง ถ้าสองสายมี LCSmnLดังนั้นพวกเขาจึงมีการแทรก / ลบแก้ไขระยะทางn+m2L : วิธีที่ง่ายที่สุดในการดูคือการจัดเรียงสตริงเพื่อให้อักขระใน LCS ปรากฏซ้อนกันอยู่ด้านบนของกันและกันขณะที่อักขระที่ไม่อยู่ใน LCS ปรากฏตรงข้าม-ช่องว่าง ตัวละคร จากนั้นจะเห็นได้ชัดว่าเราสามารถแก้ไขสตริงแรกเป็นสตริงที่สองโดยทำการแทรกทุกที่ที่มี-ในแถวบนสุดและการลบที่ใดก็ตามที่มี-ในแถวล่าง ตัวอย่างเช่น:

-C-IRC-LE
T-RI-CKLE

นี่ LCS ของCIRCLEและTRICKLE, ICLEมีความยาว 4 และแก้ไขระยะทางที่แน่นอน 56+724=5

การเรียงลำดับที่เพิ่มขึ้นที่ยาวที่สุด

เหตุผลสำหรับการอ้อมนี้คือมีวิธีที่มีประสิทธิภาพมากในการคำนวณ LCS (และระยะทางแทรก / ลบแก้ไข) เมื่ออย่างน้อยหนึ่งในลำดับที่มีตัวละครที่แตกต่างกันเท่านั้น: ในกรณีนี้ปัญหา LCS สามารถเปลี่ยนเป็น ปัญหาการหาที่subsequence เพิ่มขึ้นที่ยาวที่สุดซึ่งสามารถแก้ไขได้ในเวลาn) สมมติว่าเราได้รับสองสตริงและและสตริงมีอักขระที่แตกต่างกัน เราสามารถเปลี่ยนชื่อตัวละครตัวแรกในถึง 1, ที่สองถึง 2 และอื่น ๆ การติดตามของจำนวนที่เราได้รับมอบหมายให้ตัวละครแต่ละตัวในตาราง จากนั้นในO(nlogn)ABAABเราเปลี่ยนชื่อตัวละครโดยใช้ตารางนี้ (เช่นทุกครั้งที่มีสิ่งใดก็ตามที่เป็นตัวอักษรตัวแรกในAถูกเปลี่ยนเป็น 1 ฯลฯ ) สุดท้ายเรามองหาที่เพิ่มขึ้น subsequence Bที่ยาวที่สุดใน สิ่งนี้สอดคล้องกับ LCS ระหว่างAและBจากนั้นเราสามารถคำนวณระยะแทรก / ลบแก้ไขได้ทันที เวลาทั้งหมดที่ต้องการคือเพียงถ้าและมีความยาวและตามลำดับO(n+mlogm)ABnm

ขอบเขตในการแก้ไขระยะ Levenshtein

ระยะแทรก / ลบให้ชัดเจนขอบเขตบนระยะทาง Levenshtein (เนื่องจากลำดับการดำเนินการแก้ไขใด ๆ ที่ถูกต้องภายใต้ระยะแทรก / ลบยังเป็นลำดับที่ถูกต้องของการดำเนินการแก้ไข Levenshtein) การแบ่งระยะห่างของการแก้ไขการแทรก / ลบด้วย 2 ยังให้ขอบเขตที่ต่ำกว่าเนื่องจากในกรณีที่เลวร้ายที่สุดการดำเนินการแก้ไขของ Levenshtein ใด ๆ ก็สามารถเปลี่ยนเป็น 2 การแทรก / ลบการแก้ไขได้

ภาพรวม

ในปี 1977 Hunt และ Szymanski ได้คิดค้นอัลกอริธึมที่สามารถมองได้ว่าเป็นลักษณะทั่วไปของอัลกอริธึมที่เพิ่มขึ้นที่ยาวที่สุด มันจะมีประสิทธิภาพเมื่อใดก็ตามที่จำนวนคู่ของตำแหน่งอักขระที่ตรงกันระหว่างสองสตริงนั้นมีขนาดเล็ก หากมีคู่ดังกล่าวขั้นตอนวิธีการของพวกเขาใช้เวลาเวลา (โปรดสังเกตว่าหากอักขระทั้งหมดในหนึ่งสตริงมีความแตกต่างกัน) อัลกอริทึมนี้เป็นพื้นฐานของโปรแกรมต้นฉบับซึ่งถือว่าข้อความทั้งหมดในบรรทัดเป็นอักขระแต่ละตัว ต่อมาเปลี่ยนเป็นการใช้อัลกอริทึม - Myers's time โดยที่rO((r+n)logn)rndiffdiffO(nd)d คือระยะแทรก / ลบแก้ไขเนื่องจากจะมีประสิทธิภาพดีกว่าเมื่อความแตกต่างโดยรวมมีขนาดเล็ก แต่ "ตัวอักษร" (บรรทัดข้อความ) ปรากฏขึ้นบ่อยครั้ง (เช่นบรรทัดที่มีวงเล็บปีกกาเปิดในรหัสโปรแกรม C)

ล่า, J.; Szymanski, T. (1977), "อัลกอริทึมที่รวดเร็วสำหรับการคำนวณองค์ประกอบทั่วไปที่ยาวที่สุด", การสื่อสารของ ACM, 20 (5): 350–353, ดอย: 10.1145 / 359581.359603

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