ความซับซ้อนของการทำให้เป็นเนื้อเดียวกันสตริง


10

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

ปัญหา : เราได้รับสตริงคือลำดับของตัวอักษรและเป้าหมายของเราคือ ทำให้เป็นเนื้อเดียวกันในราคาต่ำสุด นั่นคือเราต้องการลำดับการจัดเรียงใหม่เพื่อให้ตัวอักษรทั้งหมดที่เหมือนกันอยู่ติดกัน

การดำเนินการเดียวที่ได้รับอนุญาตคือการเลือกลำดับของตัวอักษรที่เหมือนกันและย้ายลำดับที่ใดก็ได้และนั่นทำให้ฉันเสียค่าใช้จ่าย 1 หน่วย

ความช่วยเหลือใด ๆ ที่บ่งบอกถึงความซับซ้อนของปัญหานี้จะได้รับการชื่นชมมาก!

ตัวอย่าง :

  • aabcdab: อินพุต
  • bcd aa ab: หลังจากย้ายaa ตัวแรกไปยังตำแหน่งหลังจาก "d"
  • b bcdaaa: หลังจากย้ายbต่อท้ายไปยังตำแหน่งแรก

เนื่องจากสตริงผลลัพธ์เป็นเนื้อเดียวกันเราจึงมีราคาเท่ากับ 2

โปรดทราบว่าเราไม่ได้ถูก จำกัด แต่อย่างใดเกี่ยวกับผลลัพธ์: ตราบใดที่มันเป็นเนื้อเดียวกันเราไม่จำเป็นต้องตรวจสอบคำสั่งซื้อใด ๆ

คำตอบ:


6

ปัญหานี้เป็น NP-สมบูรณ์จากการลดลงจากชุดตีขั้นต่ำ

USsS,sUHUsS,hHhs

การลดมีดังนี้:

  • uUussSusu

  • s|s|1suusu

  • ususssSssu

  • |s|+|H|H

เนื่องจากชุดการกดปุ่มต่ำสุดคือ NP-Hard การปรับสตริงให้เข้ากันเป็นเนื้อเดียวกันก็เหมาะสมเช่นกัน เนื่องจากการเคลื่อนไหวเป็นพยานจึงเป็น NP-Complete


นี่คือการลดความสง่างาม - ขอบคุณ!
Aditya Parameswaran

2

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

ดังนั้นสำหรับสตริงที่มีการเปลี่ยนแปลง k คุณต้องการอย่างมากที่k - l + 1 ย้ายโดยที่ l คือจำนวนตัวอักษรที่แตกต่างกันในสตริงเพราะในตอนท้ายl - 1การเปลี่ยนแปลงจะยังคงอยู่ เนื่องจากสตริงที่มีความยาว n สามารถมีการเปลี่ยนแปลงตัวอักษรได้ไม่เกิน n-1 จึงสามารถเคลื่อนที่ได้มากที่สุดn - l จำนวนที่น้อยที่สุดคือครึ่งหนึ่งของจำนวนนี้

กลยุทธ์ที่ดีที่สุดดูเหมือนว่าจะมองหาส่วนประกอบของรูปแบบ abbba และย้าย bbb ออกไปจากที่นั่น เมื่อไม่มีใครเหลือให้ย้ายอะไร คุณยังสามารถลองดำเนินการเหล่านั้นที่สร้างสถานการณ์ abbba ใหม่ แต่ฉันคิดว่ากำไรจะน้อยมาก เนื่องจากกลยุทธ์ที่เลวร้ายที่สุด (โดยไม่ต้องย้ายโง่ที่เพิ่ม inhomogenity) ในการใช้งานที่มากที่สุดเป็นครั้งที่สองเป็นจำนวนมากย้ายที่ดีที่สุดหนึ่งเล็ก ๆ น้อย ๆ ที่คุณอาจได้รับความน่าจะเป็นในกรณีที่ไม่มีความเหมาะสมที่จะใช้ความพยายามเป็นคำตอบโดยisaacgมีลักษณะเป็น NP-hard แนะนำ เว้นแต่คุณจะนับจำนวนการดำเนินการย้ายเท่านั้นและไม่สนใจเวลาที่จะตัดสินใจว่าจะย้ายที่ใด

กรณีที่เลวร้ายที่สุดคือสตริงที่ตัวอักษรทุกตัวแตกต่างจากรุ่นก่อน (และคุณไม่ได้รับโบนัส abbba) ที่นี่คุณต้องการจำนวนของการดำเนินการเชิงเส้นในความยาวของสตริงและเกือบเท่ากับความยาวนี้

ในตัวอย่างของคุณคุณมีการเปลี่ยนแปลง 5 -> 4 -> 3 และ 3 เท่ากับจำนวนตัวอักษร (4) ลบ 1

หมายเหตุด้านข้าง: สำหรับตัวอักษรที่มีขนาดเพียงสองตัวการเคลื่อนไหวทุกครั้งที่ไม่ได้ย้ายส่วนนำหน้าหรือคำต่อท้ายของสตริงจะลดการ inhomogenity ลงสองและทำให้ลำดับการเคลื่อนไหวที่เหมาะสมทุกลำดับนั้นดีที่สุด


คุณอ้างว่าการย้ายสามารถลดจำนวนการเปลี่ยนแปลงได้มากที่สุด 2 แต่จริงๆแล้วมันสามารถลดจำนวนการเปลี่ยนแปลงได้สูงสุด 3 ตัวอย่างเช่นการแปลง "aabcabc" เป็น "aaabbcc" โดยการย้ายสตริงย่อย "bc" แรกเป็น ตรงกลางของสตริงย่อยที่สอง "bc" ส่งผลให้จำนวนการเปลี่ยนแปลงในสตริงลดลงจาก 5 เป็น 2
Mikhail Rudoy

สวัสดี @MikailRudoy คำถามระบุว่าการดำเนินการคือ "รับลำดับของตัวอักษรที่เหมือนกัน" ดังนั้น bc ไม่ได้รับอนุญาตเท่าที่ฉันเข้าใจ
Peter Leupold

ฉันพลาดรายละเอียดไปอย่างสิ้นเชิง คุณถูกต้องในกรณีนั้น
Mikhail Rudoy

ปีเตอร์ถูกต้อง: ไม่อนุญาตให้ทำการเคลื่อนย้ายเหล่านั้น
Aditya Parameswaran

Re: คำตอบที่เหลือ - แน่นอนการสังเกตเหล่านี้อีกครั้ง: ขอบเขตที่ต่ำกว่าการมองโลกในแง่ดีของขนาดตัวอักษร 2 ตัวและฮิวริสติกสำหรับสิ่งที่ต้องทำในทุกจุดมีค่า เนื่องจากการย้ายในกรณีที่เลวร้ายที่สุดจะได้รับประโยชน์เพียงลำดับของตัวอักษรและในกรณีที่ดีที่สุดจะรวมกันมากที่สุดสองตัวอักษรเช่นเดียวกับใน abbba ของคุณการประมาณ 2 แบบจึงดูเหมือนเป็นธรรมชาติ
Aditya Parameswaran
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.