การคลายสตริงทำได้ยากเพียงใด


117

การสับเปลี่ยนของสองสายจะเกิดขึ้นโดยการกระจายอักขระเป็นสตริงใหม่โดยรักษาอักขระของแต่ละสตริงตามลำดับ ยกตัวอย่างเช่นMISSISSIPPIเป็นสับเปลี่ยนของและMISIPP SSISIขอผมเรียกรูปสี่เหลี่ยมจัตุรัสถ้ามันเป็นการสลับของสองสายเหมือนกัน ตัวอย่างเช่นABCABDCDเป็นรูปสี่เหลี่ยมเนื่องจากเป็นแบบสลับABCDและABCDสตริงABCDDCBAจะไม่เป็นแบบสี่เหลี่ยม

มีอัลกอริทึมที่รวดเร็วในการพิจารณาว่าสตริงเป็นสแควร์หรือมันเป็น NP-hard หรือไม่? วิธีการเขียนโปรแกรมแบบไดนามิกที่เห็นได้ชัดดูเหมือนจะไม่ทำงาน

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


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

พิจารณากราฟ G ที่จุดยอดเป็นจำนวนเต็ม 1 ถึง n ระบุแต่ละขอบด้วยช่วงเวลาจริงระหว่างจุดปลาย เราบอกว่าขอบสองด้านของ G ซ้อนกันถ้าช่วงเวลาหนึ่งบรรจุอีกด้านหนึ่งอย่างเหมาะสม ตัวอย่างเช่นขอบ (1,5) และ (2,3) ซ้อนกัน แต่ (1,3) และ (5,6) ไม่และและ (1,5) และ (2,8) ไม่ใช่ การจับคู่ใน G ไม่ซ้อนกันถ้าไม่มีคู่ของขอบซ้อนกัน มีอัลกอริธึมที่รวดเร็วในการพิจารณาว่า G มีการจับคู่ที่สมบูรณ์แบบที่ไม่ซ้อนกันหรือไม่หรือเป็นปัญหาที่ NP-hard

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

  • มีอัลกอริธึมเวลาพหุนามที่ง่ายในการค้นหาการจับคู่แบบไม่ข้ามที่สมบูรณ์แบบ


Update (24 มิ.ย. 2556): ปัญหาได้รับการแก้ไขแล้ว! ขณะนี้มีการพิสูจน์อิสระสองรายการที่การระบุสตริงสแควร์คือ NP-complete

นอกจากนี้ยังมีหลักฐานที่ง่ายกว่าว่าการค้นหาการจับคู่ที่สมบูรณ์แบบที่ไม่ซ้อนกันคือ NP-hard เนื่องจาก Shuai Cheng Li และ Ming Li ในปี 2009 ดูที่ " ปัญหาสองประการของรูปแบบ 2 ช่วงเวลา " ทฤษฎีวิทยาศาสตร์คอมพิวเตอร์ 410 (24–25) ): 2410–2423, 2009


2
ไม่ใช่ลำดับเพียง A000984 "จำนวนค่าที่เป็นไปได้ของเลขฐานสอง 2 * n บิตซึ่งบิตครึ่งหนึ่งอยู่และครึ่งปิดอยู่"
เทรวิสบราวน์

5
@ Travis ยกเว้นว่าฉันเข้าใจผิด: สำหรับ n = 4, 10000111 เป็นเลขฐานสองบิต 2 * n ที่ครึ่งบิตเปิดอยู่และครึ่งปิดอยู่ แต่ไม่ใช่ตารางตามที่กำหนดไว้ ตามตรรกะนั้นเนื่องจากสแควร์สเป็นเซตย่อยที่เข้มงวดของชุดที่สร้าง A000984 ค่าสำหรับสแควร์สบนตัวอักษรไบนารีควรจะต่ำกว่าที่ดัชนีเท่ากันผ่านลำดับ - ไม่?
Daniel Apon

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

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

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

คำตอบ:


66

Michael Soltys และฉันประสบความสำเร็จในการพิสูจน์ว่าปัญหาในการพิจารณาว่าสายอักขระสามารถเขียนเป็นแบบจัตุรัสแบบสุ่มได้หรือไม่ สิ่งนี้ใช้กับตัวอักษรที่ จำกัด ด้วยสัญลักษณ์ที่ต่างกันเพียงตัวแม้ว่าการพิสูจน์ของเราจะเขียนสำหรับตัวอักษรที่มีสัญลักษณ์ คำถามนี้ยังคงเปิดสำหรับตัวอักษรขนาดเล็กพูดด้วยสัญลักษณ์เพียงเรายังไม่ได้ดูปัญหาภายใต้ข้อ จำกัด ที่แต่ละสัญลักษณ์ปรากฏเพียงครั้ง (หรือโดยทั่วไปแล้วจำนวนครั้งคงที่); ดังนั้นคำถามนั้นยังคงเปิดอยู่7926

หลักฐานใช้การลดลงจาก -Partition มันยาวเกินไปที่จะโพสต์ที่นี่ แต่พิมพ์ล่วงหน้า "Unshuffling สตริงคือ -hard" สามารถใช้ได้จากหน้าเว็บของเราที่:NP3NP

http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/

และ

http://www.cas.mcmaster.ca/~soltys/#Papers

กระดาษได้รับการตีพิมพ์ในวารสารวิทยาศาสตร์ระบบคอมพิวเตอร์:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


11
น่ากลัว !! (และเพื่อการบรรเทาของฉันอันยิ่งใหญ่, ไม่จริงจังอย่างจริงจัง )
Jeffε

15
ขอบคุณ StackExchange เป็นแหล่งข้อมูลของเราสำหรับคำถามนี้ มันเป็นทรัพยากรที่ยอดเยี่ยม!
Sam Buss

9
@ SamBuss มีคำขอขนาดเล็ก: ในขณะที่คุณตอบคำถามของ Jeff คุณพูดถึงวิธีการแก้ปัญหาของ Per Austrin ในข้อความเท่านั้น หากคุณดูคำตอบมีวิธีสร้างการอ้างอิงอย่างเป็นทางการสำหรับคำตอบด้วยเช่นกัน (คลิกที่ปุ่มแชร์แล้วกดลิงค์ 'อ้างอิง') ด้วยวิธีนี้คุณสามารถสร้างการอ้างอิงที่เหมาะสมสำหรับคำตอบของ Per เช่นกัน ฉันแค่พูดถึงสิ่งนี้เพื่อให้ผู้ที่มีส่วนร่วมอย่างเป็นทางการในไซต์สามารถรับการยอมรับอย่างเป็นทางการ ขอบคุณมาก! และขอแสดงความยินดีที่แคร็กปัญหานี้
Suresh Venkat

2
@SureshVenkat ขอบคุณสำหรับเคล็ดลับ: สิ่งนี้มีประโยชน์ ฉันได้เพิ่มสิ่งนี้ลงในกระดาษเวอร์ชันออนไลน์
Sam Buss

ปัญหาของการจดจำการสลับแบบสี่เหลี่ยมได้แสดงให้เห็นว่าเป็นเรื่องยากแม้ในตัวอักษรไบนารี: sciencedirect.com/science/article/pii/S0304397519300258
a3nm

58

สำหรับกรณีพิเศษที่คุณพูดถึงเมื่อตัวละครแต่ละตัวปรากฏตัวมากที่สุดสี่ครั้งจะมีการลด 2-SAT อย่างง่าย (เว้นแต่ฉันจะหายไปบางสิ่งบางอย่าง ... ) ดังนี้:

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


ดี ความคิดแบบเดียวกันทำให้สายอักขระแต่ละตัวเกิดขึ้นมากที่สุดหกครั้ง แต่ผลลัพธ์นั้นเป็นตัวอย่างของ 5-SAT :-(
Jeffε

2
คำตอบนี้เป็นที่ชื่นชอบที่จะชนะรางวัล
Jeffε

ดังนั้นนี่จึงเป็นการพิสูจน์ว่าปัญหาคือ NPC และทำไมเราต้องมีการประชุมที่ยาวนานและการพิสูจน์ในวารสาร
T ....

@ Turbo ล่าช้ามาก แต่นี่ไม่ได้พิสูจน์ว่าเป็น NPC เนื่องจาก 2-SAT ไม่ใช่ NPC มันอยู่ใน P.
Steven Stadnicki

การลดลงเป็น 2-SAT นี้จะใช้งานได้หรือไม่หากขนาดตัวอักษรไม่ได้ จำกัด ขนาด?
Mohammad Al-Turkistany

11

นี่คืออัลกอริทึมที่อาจมีโอกาสถูกต้องแม้ว่ามันจะเป็นเรื่องยากที่จะพิสูจน์และฉันจะไม่วางเดิมพันในบ้าน ...

ให้เราบอกว่าจะถูกลบออกถ้าทุกขอบอีมีอยู่ (อาจจะซ้อนกัน) การจับคู่ที่สมบูรณ์แบบของGที่ใช้อีและไม่ได้ใช้ขอบใด ๆ ที่มีอยู่ในหรือมีอีGอีGอีอี

มันง่ายที่จะทดสอบว่าถูกกำจัดไปแล้วหรือไม่และหากไม่พบขอบที่ละเมิด เห็นได้ชัดว่าไม่มีการละเมิดขอบเหล่านี้ในการจับคู่ที่สมบูรณ์แบบของGดังนั้นจึงปลอดภัยที่จะลบออกจากการพิจารณา ทำซ้ำขั้นตอนนี้เราได้รับ subgraph (เฉพาะ) purged ของGซึ่งมีการจับคู่ที่สมบูรณ์แบบที่ไม่ซ้อนกัน iff GมีGGGG

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

หลังจากตัวเลือกโลภที่เราล้างกราฟอีกครั้งและอื่น ๆ และกระบวนการสิ้นสุดลงเมื่อกราฟ (หวังว่า) การจับคู่ที่สมบูรณ์แบบที่ไม่ใช่การทำรัง

ในตอนแรกฉันคิดว่านี่น่าจะเป็นเรื่องเล็กน้อยที่มีการมองไปข้างหน้าในอัลกอริทึมโลภและไม่ได้ผลจริงๆ แต่ฉันพบว่ามันยากที่จะเกิดขึ้นกับตัวอย่างแบบโต้ตอบ


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

2
สำหรับคำถามที่สองพิจารณาสตริง 'aaaa' การล้างมันจะกำจัดขอบ 1-4 และ 2-3 ออกไปทำให้เป็นรอบที่ 4 สองขั้นตอนของความโลภที่สองนั้นก็เพียงพอแล้วและฉันก็ไม่สามารถหาตัวอย่างการโต้กลับได้ดังนี้: 1) กราฟที่ถูกลบมีการจับคู่ที่สมบูรณ์แบบที่ไม่ซ้อนกันถ้ามันมีการจับคู่ที่สมบูรณ์แบบ . 2) ในกราฟล้างด้วยการจับคู่ที่สมบูรณ์แบบที่ไม่ใช่การทำรังทุกขอบที่ใช้ในบางการจับคู่ที่สมบูรณ์แบบที่ไม่ใช่การทำรัง (นี้จะแข็งแกร่งกว่าทั้งสองขั้นตอนโลภและรายการแรกดังนั้นจึงควรจะง่ายต่อการหักล้าง)
ต่อ Austrin

11

วิธีการแก้ปัญหาที่ Sam Buss และฉันเสนอในเดือนพฤศจิกายน 2012 (แสดงให้เห็นว่าการคลายสี่เหลี่ยมใน NP-hard โดยการลดลงจาก 3-Partition) ตอนนี้เป็นบทความที่ตีพิมพ์ในวารสารวิทยาศาสตร์ระบบคอมพิวเตอร์:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


2
นี่น่าจะเป็นการแก้ไขคำตอบก่อนหน้าของ Sam Buss มากกว่าคำตอบที่แยกต่างหาก คุณสามารถคลิก "แก้ไข" เพื่อแนะนำการแก้ไขคำตอบของผู้อื่นและการแก้ไขของคุณจะได้รับการตรวจสอบโดยผู้ใช้รายอื่นของไซต์
DW

11

Romeo Rizzi และStéphane Vialette พิสูจน์ให้เห็นว่าการจำสตริงสแควร์นั้นสมบูรณ์แบบในปี 2556 ของพวกเขาใน " การจดจำคำที่เป็นสี่เหลี่ยมสำหรับผลิตภัณฑ์สุ่ม " โดยการลดปัญหาไบนารีที่ยาวที่สุด พวกเขาระบุว่าความซับซ้อนของการคลายสตริงไบนารียังคงเปิดอยู่

หลักฐานได้ง่ายว่าการหาที่ไม่ซ้อนกันจับคู่ที่สมบูรณ์แบบเป็น NP-สมบูรณ์จะได้รับโดย Shuai เฉิงหลี่หมิงและหลี่ในปี 2009 กระดาษของพวกเขา " เมื่อวันที่สองปัญหาเปิดรูปแบบ 2 ช่วงเวลา " อย่างไรก็ตามพวกเขาใช้คำศัพท์ที่สืบทอดมาจากชีวสารสนเทศศาสตร์ แทนที่จะเป็น "การจับคู่ที่ไม่ซ้อนกันแบบสมบูรณ์แบบ" พวกเขาเรียกมันว่า "DIS-2-IP- {<,}ปัญหา" ความเท่าเทียมกันระหว่างสองปัญหานี้อธิบายโดยBlin, Fertin และ Vialette :

ปัญหา 2-IP-DIS- {<,}มีการกำหนดทันทีในแง่ของการจับคู่ที่ จำกัด ในกราฟทั่วไป: จากกราฟGพร้อมกับการเรียงลำดับเชิงเส้นπของจุดยอดของG , 2-IP-DIS- {<,}ปัญหาจะเทียบเท่ากับการหาสูงสุด cardinality จับคู่MในGกับทรัพย์สินที่สำหรับการใด ๆ ที่แตกต่างกันสองขอบ{ยู,โวลต์} และ{ยู',โวลต์'}ของMค่าม.ผมn{π(ยู),π(โวลต์)}<ม.ผมn{π(ยู'),π(โวลต์')} และmax{π(u),π(v)<max{π(u),π(v)}และmin{π(u),π(v)}<min{π(u),π(v)}และmax{π(u),π(v)}<max{π(u),π(v)}เกิดขึ้น

Update (25 กุมภาพันธ์ 2019): Bulteau และ VIALETTE แสดงให้เห็นว่าปัญหาการตัดสินใจของ unshuffling สตริงไบนารี NP-สมบูรณ์ในกระดาษของพวกเขาตระหนักถึงสี่เหลี่ยมสับเปลี่ยนไบนารี NP-ยาก


ฉันไม่เห็นการเชื่อมต่อและฉันไม่เห็นว่าผู้เขียนอ้างว่าการคลายสตริงเป็นปัญหาของพวกเขาหรือไม่
Suresh Venkat

2
พวกเขาไม่ได้บอกว่ามันเทียบเท่ากับการคลายตัว มันเป็นปัญหาทั่วไปมากขึ้น
Jeffε

@SureshVenkat ฉันแก้ไขคำตอบของฉันฉันหวังว่ามันชัดเจน โดยพื้นฐานแล้วสิ่งที่พวกเขาพูดในเชิงอรรถคือขอบสองอันในการจับคู่ ( ) ไม่ซ้อนกัน M
Mohammad Al-Turkistany

ในรุ่นที่ตีพิมพ์จริงความเท่าเทียมกันจะระบุไว้ในหน้า 320 books.google.co.th/?hl=th
Mohammad Al-Turkistany

แก้ไขเพื่อยกเลิกการฝัง Lede
Jeffε

9

สิ่งนี้ช่วยได้ไหม?

http://users.soe.ucsc.edu/~manfred/pubs/J1.pdf


7
การอ้างอิงที่ดี เป็นการยากที่จะดูว่าผลลัพธ์จะนำไปใช้กับปัญหาของฉันได้อย่างไร แต่บางทีเทคนิคอาจช่วยได้ มันง่ายที่จะบอกว่าสตริง X ที่กำหนดนั้นเป็นการสุ่มสองชุดของสตริงที่ Y อีกอันหรือไม่กระดาษที่แนบมาพิสูจน์ให้เห็นว่ามันยากที่จะตัดสินใจว่าสตริง X ที่กำหนดนั้นเป็นการสุ่มของสำเนาใด ๆ ของสตริงที่ระบุ Y ใด ๆ ฉันต้องการทราบว่าสตริง X ที่กำหนดเป็นการสลับของ SOME UNKNOWN string Y. สองชุดหรือไม่
Jeffε

5

ไม่เคยมีคำตอบคำตอบนี้ผิด มันล้มเหลวในการป้อนข้อมูล "AABAAB": จับคู่โลภสอง A แรกเข้าด้วยกันอย่างละโมบทำให้เป็นไปไม่ได้ที่จะจับคู่สัญลักษณ์ที่เหลืออยู่ ฉันปล่อยมันไว้แทนที่จะลบมันเพื่อช่วยให้ผู้อื่นหลีกเลี่ยงการทำผิดพลาดแบบเดียวกัน

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

วนซ้ำแต่ละตำแหน่ง i ในสตริงอินพุต i = 0, 1, 2, ... n สำหรับแต่ละตำแหน่ง i ตรวจสอบว่าตำแหน่งนั้นได้รับการจับคู่กับตำแหน่งก่อนหน้านี้บางส่วนในสตริงหรือไม่ หากไม่ใช่ให้จับคู่กับอักขระที่เท่ากันซึ่งมาหลังตำแหน่งที่จับคู่ล่าสุดและมิฉะนั้นเร็วที่สุดเท่าที่จะทำได้ในสตริง หากไม่พบคู่ที่ตรงกันสำหรับตัวละครบางตัวให้ประกาศว่าอินพุตนั้นไม่ใช่รูปสี่เหลี่ยมจัตุรัส มิฉะนั้นจะเป็นชุดของตัวละครในคู่แรกของแต่ละคู่

นี่คือใน Python:

def sqrt (S):
    การแข่งขัน = []
    i, j = 0, 0
    ในขณะที่ฉัน <len (S):
        ถ้า j <len (ไม้ขีดไฟ) และไม้ขีด [j] [1] == i:
            ฉัน + = 1
            j + = 1
            ต่อ
        หากการแข่งขัน:
            k = การแข่งขัน [-1] [1] + 1
        อื่น:
            k = 1
        ในขณะที่ k <len (S) และ S [k]! = S [i]:
            k + = 1
        ถ้า k> = len (S):
            ยกข้อยกเว้น ("ไม่ใช่ตาราง")
        matches.append ((i, k))
        ฉัน + = 1
    กลับ "" .join (S [a] สำหรับ a, b ในการแข่งขัน)

พิมพ์ sqrt ("ABCABDCD")

นี่คือตัวแปรลูปหลัก (ตำแหน่งที่เราพยายามจับคู่) j คือตัวชี้ไปยังอาร์เรย์ของคู่ที่จับคู่กันซึ่งจะตรวจสอบว่าตำแหน่งที่ฉันจับคู่อยู่นั้นเร็วขึ้นหรือไม่และ k เป็นดัชนีที่ใช้ค้นหา ตัวละครที่ตรงกับตำแหน่งที่ i เป็นเวลาเชิงเส้นเพราะ i, j และ k เพิ่มขึ้นแบบ monotonically ผ่านสายอักขระและการวนซ้ำภายในแต่ละวงจะเพิ่มหนึ่งในนั้น


4
เคยไปที่นั่น. เสร็จแล้ว :-)
Jeffε

5

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


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

ฉันจะเริ่มต้นด้วยปัญหาที่แตกต่างกันเล็กน้อย เมื่อกำหนดกราฟซึ่งมีขอบสีด้วยสีkและจุดยอดถูกติดป้ายจาก1ถึงnมีการจับคู่แบบแยกส่วนที่ประกอบด้วยขอบหนึ่งสีของแต่ละสีหรือไม่ ปัญหานี้ดูเหมือนว่าจะเป็นปัญหาหนัก (อาร์กิวเมนต์สำหรับเรื่องนี้ทั้งสมบูรณ์และตรงไปตรงมา - เว้นแต่ฉันจะหายไปบางสิ่งบางอย่าง) การลดลงจะทำให้กราฟออกมาซึ่งเป็นการรวมกลุ่มของกลุ่มโบราณGk1n

kk

a1,,akk

nn1nuvai(u,v)i

kkk

หากต้องการกำจัดสีและทำให้การจับคู่สมบูรณ์แบบแม้ว่าจะอยู่ในช่วงที่ใหญ่กว่าก็ตามให้ทำการแก้ไขกราฟดังต่อไปนี้:

UaaUaA(A2)Ua

Ua

[1] ในปัญหาที่ไม่มีเมล็ดพหุนามฮันส์ลิตรบอดลาเดอร์, ร็อดนีย์จีดาวนีย์, ไมเคิลอาร์เฟลโลว์และแดนนี่เฮอร์เมลิน, เจคอมพิวเต Syst วิทย์


3
ฉันสับสน ไม่ใช่ (1,2), (3,4), (5,6), ... , (n-1, n) การจับคู่ไม่ลงตัวที่สมบูรณ์แบบเท่านั้นหรือไม่
Jeff

เมื่อฉันย้ายไปยังสถานการณ์ 'จับคู่ที่สมบูรณ์แบบ' ฉันจะแก้ไขสิ่งปลูกสร้างและเพิ่มจุดยอดใหม่จำนวนมาก (โปรดทราบว่าฉันเพิ่ม | U_a | -2 จุดยอดใหม่สำหรับตัวอักษรทุกตัว) ดังนั้น n จะระเบิดตามลำดับ - ประมาณ 2n-2k สำหรับตัวอักษร k-sized ฉันหวังว่าฉันจะทำให้ชัดเจนว่าการลดไม่สมบูรณ์ในที่ฉันไม่ได้ระบุจำนวนที่จัดสรรให้กับจุดยอดใหม่ แต่ฉันหวังว่ามันสามารถขยายได้โดยไม่ยากเกินไป อย่างไรก็ตามฉันต้องคิดเกี่ยวกับมันก่อนที่จะพูดอะไรอีก
Neeldhara

1
ฉันคิดว่าประเด็นของความคิดเห็นของ JeffE ก็คือมันเป็นเรื่องง่ายที่จะหาการจับคู่ที่สมบูรณ์แบบที่ไม่ใช่การซ้อนและไม่ข้าม (หรือรายงานการขาดงาน) เพราะมีความเป็นไปได้เพียงทางเดียวเท่านั้น
Tsuyoshi Ito

2
ฉันไม่ได้พูดถึงเนื้อหาของแนวคิดการพิสูจน์ของคุณ แต่ฉันกำลังพูดถึงประโยคแรกของคำตอบของคุณ:“ ฉันสามารถคิดได้ว่าทำไมมันอาจเป็นเรื่องยากที่จะหาคู่ที่สมบูรณ์แบบที่ไม่ซ้อนกันและไม่ข้าม” งานนี้เป็นเรื่องง่ายสำหรับเหตุผลที่เจฟฟ์เขียน
Tsuyoshi Ito

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

1

วิธีการใช้งานไม่ได้: การแยกสี่เหลี่ยมจัตุรัสแบบสับโดยใช้ตัวอักษรสองตัวที่ตรงกันจะไม่ส่งผลให้เกิดช่องสี่เหลี่ยมแบบสับ ... ดูความคิดเห็นของ Radu ด้านล่าง


Σ

S(XY)A(X,Y)(1)A(aX1,aX2Y1Y2)A(X1,Y1)A(X2,Y2)(2)A(ε,ε)ε(3)
aΣε

X1Y1Y1X2Y2Y1Y2X1X2

aadd

S(abcabdcd)A(abc,abdcd)(by 1,X=abc,Y=abdcd)A(bc,bdcd)A(ε,ε)(by 2,X1=bc,Y1=bdcd,X2=Y2=ε)A(c,c)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(ε,ε)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(d,d)A(ε,ε)(by 3)A(d,d)A(ε,ε)(by 3)A(ε,ε)A(ε,ε)A(ε,ε)(by 2)3εi.e. success

0011

S(0011)A(0,011)A(ε,ε)A(1,1)A(1,1)ε

XY


ε

ฉันไม่คิดอย่างนั้น
Serge Gaspers

ε

ขอบคุณสำหรับการกลับมา; ฉันเปลี่ยนไวยากรณ์เล็กน้อยแล้วและยังมีปรีชาญาณขนาดเล็กซึ่งมันอาจใช้งานได้
Sylvain

3
ϵ

1

ปรับปรุง: เมื่อ Tsuyoshi Ito ชี้ให้เห็นในความคิดเห็นอัลกอริทึมนี้มีเวลาทำงานแบบเอ็กซ์โปเนนเชียล

โพสต์ต้นฉบับ:

นี่คือวิธีที่ฉันจะเขียนโปรแกรมนี้ในโลกแห่งความจริง

เราจะได้รับสตริง S = (S [1], ... , S [n]) สำหรับแต่ละคำนำหน้า S_r = (S [1], ... , S [r]) มีชุด {(T_i, U_i)} ของคู่ของสตริงเช่น S_r เป็นแบบสุ่มของ (T_i, U_i) และ T_i เป็นส่วนนำหน้าของ U_i (เช่น U_i 'ขึ้นต้นด้วย' T_i) S_r เป็นจตุรัสหากว่าชุดนี้มีคู่ (T_i, U_i) กับ T_i = U_i

ตอนนี้เราไม่จำเป็นต้องสร้างคู่เหล่านี้ทั้งหมด เราเพียงแค่ต้องสร้างคำต่อท้าย V_i ของแต่ละสตริง U_i ที่ได้รับโดยการลบสำเนาของ T_i สิ่งนี้จะกำจัดจำนวนรายการซ้ำที่ไม่เกี่ยวข้อง ตอนนี้ S_r เป็นรูปสี่เหลี่ยมถ้าหากส่วนต่อท้ายชุดนี้มีสตริงว่าง ดังนั้นอัลกอริทึมจะกลายเป็น:

Initialise: SuffixSet = {<empty string>} ; r = 0
Loop: while (r < n) {
  r = r + 1
  NextSuffixSet = {}
  for each V in SuffixSet {
    if (V[1] == S[r]) Add V[2...] to NextSuffixSet // Remove first character of V
    Add V||S[r] to NextSuffixSet // Append character S[r] to V
    }
  SuffixSet = NextSuffixSet
  }
Now S is a square if and only if SuffixSet contains the empty string.

ตัวอย่างเช่นถ้า S คือ AABAAB:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB, AABA}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA, AABAA}
r=6: S[r] = B; SuffixSet = {AA, BAAB, <empty string>, BB, ABAB, AABAAB}

เราสามารถทิ้งคำต่อท้ายทั้งหมดที่มีมากกว่าครึ่งได้ตราบเท่าที่สตริงอินพุตดังนั้นสิ่งนี้จะช่วยลดความยุ่งยากในการ:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA}
r=6: S[r] = B; SuffixSet = {AA, <empty string>, BB}

ฉันได้เขียนโปรแกรมนี้ใน C ++ และทำงานบนตัวอย่างทั้งหมดที่ได้รับที่นี่ ฉันสามารถโพสต์รหัสได้ถ้าใครสนใจ คำถามคือ: ขนาดของ SuffixSet สามารถเติบโตได้เร็วกว่าพหุนามหรือไม่?


3
ฉันลองสิ่งนี้เช่นกัน แต่การทดลองแสดงให้เห็นว่าขนาดของ SuffixSet ดูเหมือนจะเพิ่มขึ้นอย่างมากใน n หากสตริงเดิมคือ (AB) ^ n
Tsuyoshi Ito

1

แก้ไข: นี่คือคำตอบที่ไม่ถูกต้อง


Sylvain แนะนำ RCG ซึ่งน่าเสียดายที่ไม่เหมาะกับ "สี่เหลี่ยมสุ่ม" เหล่านี้ อย่างไรก็ตามฉันคิดว่ามีอยู่หนึ่งรายการ(แก้ไข: ไม่ใช่ RCG โปรดดูความคิดเห็นของ Kurt ด้านล่าง!)ซึ่งมีลักษณะดังนี้:

S(Y)A(ε,Y)(1)A(X,ZY)A(XZ,Y)(2)A(aX,aY)A(X,Y) สำหรับทุกคน aΣ(3)A(ε,ε)ε(4)

aa''aa''(1,2)(3)(2)

100110101010

S(100110101010)A(ε,100110101010)(1)A(1001,10101010)(2)* * * *A(01,101010)(3)A(011,01010)(2)* * * *A(1,010)(3)A(10,10)(2)* * * *A(ε,ε)(3)ε(4)

ฉันไม่ได้พิสูจน์หลักฐานอย่างเป็นทางการว่าไวยากรณ์นี้จับได้อย่างแน่นอนว่า "กำลังสองสลับ" แต่ก็ไม่ควรยากเกินไป Sylvain ได้กล่าวไปแล้วว่าปัญหาการตัดสินใจของ RCG นั้นเป็นพหุนาม


A(x,ε)23

5
@DaniCL ตามความคิดที่สอง ... พารามิเตอร์ใน RHS ของกฎการผลิตจำเป็นต้องมีช่วงที่ต่อเนื่องกันของอินพุตหรือไม่ ฉันไม่เห็นว่ามีการระบุไว้อย่างชัดเจนในคำจำกัดความในกระดาษ Boullier แต่ดูเหมือนจะเป็นวิธีการใช้งาน ในการวิเคราะห์เวลาทำงานของอัลกอริทึมการแยกวิเคราะห์มันบอกว่าจำนวนของอาร์กิวเมนต์ที่เป็นไปได้สำหรับ clauses คือ O (n ^ 2h) โดยที่ h คือ arity สูงสุดของ clauses และ n คือความยาวอินพุต ในไวยากรณ์ของคุณ XZ โดยทั่วไปจะไม่ต่อเนื่องกันในการป้อนข้อมูลดั้งเดิม
เคิร์ต

3
@ เคิร์ตฉันคิดว่าคุณพบข้อบกพร่อง ในบทความอื่น ("ตัวเลขจีน, MIX, Scrambling และ Range Concatenation Grammars"), Boullier กล่าวอย่างชัดเจนว่า: "แน่นอนช่วงต่อเนื่องเท่านั้นที่สามารถต่อกันเป็นช่วงใหม่ได้ใน PRCG, เทอร์มินัล, ตัวแปรและการขัดแย้งในประโยคใด ๆ ควรจะถูกผูกไว้กับช่วงโดยกลไกการแทนที่ " นี่อาจหมายความว่าไวยากรณ์ของฉันไม่ใช่ RCG ที่ถูกต้องความสงสัยของ Radu นั้นสมเหตุสมผลและวิธีการนี้ก็ไม่ได้ผลเช่นกัน
DaniCL

2
@Kurt ถูกต้อง ฉันค่อนข้างมั่นใจว่าฉันสามารถสร้างชุดของกฎการผลิตที่รับรู้ภาษาที่สมบูรณ์ของ NP-UNARY 3 ส่วน ชุดของจำนวนเต็มที่ไม่เป็นลบใด ๆ สามารถเข้ารหัสแบบ unary โดยสตริงในภาษา (1 * 0) ^ * UNARY 3PARTITION คือชุดของสตริงดังกล่าวทั้งหมดซึ่งชุดการเข้ารหัสสามารถแบ่งพาร์ติชันเป็นเซ็ตย่อย 3 องค์ประกอบซึ่งมีผลรวมเท่ากัน (ดูen.wikipedia.org/wiki/3-partition_problem .)
Jeffε

1
ไวยากรณ์สำหรับ UNARY 3 ส่วน: S (X0Y0Z) -> A (e, X0, Y0, Z); A (W, 1X, Y, Z), A (W, X, 1Y, Z), A (W, X, Y, 1Z) -> A (W1, X, Y, Z); A (W, 0X, 0Y, 0Z) -> B (W, XYZ); B (W, E) -> อี; B (W, X0Y0Z) -> C (W, W, X 0, Y0, Z); C (W, 1V, 1X, Y, Z), C (W, 1V, X, 1Y, Z), C (W, 1V, X, Y, 1Z) -> C (W, V, X, Y, Z); C (W, e, X, Y, Z) -> B (W, XYZ)
Radu GRIGore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.