Micro-optimization สำหรับการคำนวณระยะทางแก้ไข: ถูกต้องหรือไม่


10

บนWikipedia จะมีการติดตั้งชุดรูปแบบการเขียนโปรแกรมแบบไดนามิกจากล่างขึ้นบนสำหรับระยะแก้ไข ไม่ปฏิบัติตามคำจำกัดความอย่างสมบูรณ์ เซลล์ภายในจะถูกคำนวณดังนี้:

if s[i] = t[j] then  
  d[i, j] := d[i-1, j-1]       // no operation required
else
  d[i, j] := minimum
             (
               d[i-1, j] + 1,  // a deletion
               d[i, j-1] + 1,  // an insertion
               d[i-1, j-1] + 1 // a substitution
             )
}

อย่างที่คุณเห็นอัลกอริทึมจะเลือกค่าจากเพื่อนบ้านบนซ้ายถ้ามีการจับคู่การบันทึกการเข้าถึงหน่วยความจำการดำเนินการ ALU และการเปรียบเทียบ

อย่างไรก็ตามการลบ (หรือการแทรก) อาจส่งผลให้มีค่าน้อยลงดังนั้นอัลกอริทึมนั้นไม่ถูกต้องในตัวเครื่องนั่นคือการแบ่งตามเกณฑ์ optimality แต่ความผิดพลาดอาจไม่เปลี่ยนผลลัพธ์สุดท้าย - มันอาจถูกยกเลิก

นี่เป็นการเพิ่มประสิทธิภาพขนาดเล็กที่ถูกต้องและทำไม (ไม่)?

คำตอบ:


6

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

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้เป็นไปไม่ได้เนื่องจากลูกศรไม่ได้รับอนุญาตให้ "ข้าม" การจับคู่tทำให้เกิดการแทรกหลายครั้ง (กล่องสีเขียวในรูป) ตามที่ปรากฎทางด้านซ้าย:

ป้อนคำอธิบายรูปภาพที่นี่

แต่จากนั้นคุณสามารถหาการจัดตำแหน่งที่ดีเท่า ๆ กันซึ่งปรากฎทางด้านขวา ในทั้งสองกรณีคุณจับคู่ a tและคุณมีส่วนแทรกสองอัน

อาร์กิวเมนต์สำหรับการทดแทนหนึ่งในts สุดท้ายจะเหมือนกัน ดังนั้นหากคุณแทนที่หนึ่งในts สุดท้ายคุณสามารถจับคู่ t สองตัวสุดท้ายแทนและรับการจัดตำแหน่งที่ดีขึ้น (ดูรูป)

ป้อนคำอธิบายรูปภาพที่นี่


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