แสดงการเปลี่ยนแปลงโดยพลการเป็นลำดับของการดำเนินการ (แทรกย้ายลบ)


9

สมมติว่าฉันมีสองสาย โทรหาพวกเขาA และ B. ไม่มีสตริงที่มีอักขระซ้ำ ๆ กัน

ฉันจะค้นหาลำดับการแทรกย้ายและลบที่สั้นที่สุดที่เปลี่ยนไปได้อย่างไร A เข้าไป Bที่ไหน:

  • insert(char, offset)แทรกcharที่กำหนดoffsetในสตริง
  • move(from_offset, to_offset)ย้ายอักขระปัจจุบันที่ออฟเซ็ตfrom_offsetไปยังตำแหน่งใหม่เพื่อให้ออฟเซ็ตto_offset
  • delete(offset) ลบอักขระที่ offset

แอปพลิเคชันตัวอย่าง: คุณทำการสืบค้นฐานข้อมูลและแสดงผลลัพธ์บนเว็บไซต์ของคุณ ในภายหลังคุณรันการสืบค้นฐานข้อมูลอีกครั้งและค้นพบว่าผลลัพธ์มีการเปลี่ยนแปลง คุณต้องการเปลี่ยนสิ่งที่อยู่บนหน้าเพื่อให้ตรงกับสิ่งที่อยู่ในฐานข้อมูลโดยใช้การดำเนินการ DOM ขั้นต่ำ มีสองเหตุผลที่คุณต้องการให้ลำดับการทำงานสั้นที่สุด ครั้งแรกที่มีประสิทธิภาพ เมื่อมีการเปลี่ยนแปลงระเบียนเพียงไม่กี่คุณต้องการให้แน่ใจว่าคุณทำO(1) ค่อนข้างมากกว่า O(n)การทำงานของ DOM เนื่องจากมีราคาแพง ประการที่สองความถูกต้อง หากรายการถูกย้ายจากตำแหน่งหนึ่งไปอีกตำแหน่งหนึ่งคุณต้องการย้ายโหนด DOM ที่เกี่ยวข้องในการดำเนินการครั้งเดียวโดยไม่ต้องทำลายและสร้างใหม่อีกครั้ง มิฉะนั้นคุณจะสูญเสียสถานะโฟกัสเนื้อหาของ<input>องค์ประกอบและอื่น ๆ

คำตอบ:


10

ผมขอแนะนำการดูที่เป็นขั้นตอนวิธีการแก้ไขระยะ แทนที่จะคำนวณระยะทางคุณจะต้องการบันทึกเส้นทางน้ำหนักขั้นต่ำผ่านอาร์เรย์และส่งคืน


5
ในความเป็นจริงเนื่องจากไม่มีการทำซ้ำนี่เป็นปัญหาที่ง่ายกว่าเล็กน้อยที่เรียกว่าปัญหาระยะทาง Ulam แม้ว่าคุณจะสามารถใช้อัลกอริทึมแก้ไขระยะทางได้ แต่ก็มีวิธีที่รวดเร็วกว่าเช่นกัน: mit.edu/~andoni/papers/ulamSublinear.pdf
Suresh

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