การทำซ้ำ (การกระจาย) ที่ยาวที่สุดที่ตามมาในสตริง


26

คำชี้แจงปัญหาที่ไม่เป็นทางการ:

รับสตริงเช่นเราต้องการให้สีตัวอักษรสีแดงและบางตัวอักษรสีน้ำเงิน (และบางส่วนไม่ได้เลย) เช่นการอ่านตัวอักษรสีแดงจากซ้ายไปขวาให้ผลเช่นเดียวกับการอ่าน ตัวอักษรสีน้ำเงินเท่านั้นACCABBAB

ในตัวอย่างเราสามารถระบายสีพวกมันได้ดังนี้: ACCABBAB

ดังนั้นเราจึงบอกว่าเป็น subsequence ซ้ำC C B B B นอกจากนี้ยังมีการวนซ้ำซ้ำที่ยาวที่สุด (ซึ่งง่ายต่อการตรวจสอบ)CABACCABBAB

เราสามารถคำนวณส่วนประกอบซ้ำที่ยาวที่สุดได้อย่างมีประสิทธิภาพหรือไม่

คำถามทางการ:

มันยากที่จะตัดสินใจว่าจะให้สตริงกับหรือไม่ว่ามีการเรียงตัวของความยาวkซ้ำอยู่ในสตริงหรือไม่?kk

  • ถ้าเป็นเช่นนั้น: ปัญหาใดที่สามารถลดปัญหานี้ได้
  • ถ้าไม่: อัลกอริทึมที่มีประสิทธิภาพคืออะไร? (เห็นได้ชัดว่าอัลกอริธึมนี้สามารถใช้ในการคำนวณการวนซ้ำที่ยาวที่สุด)

คำถามโบนัส:

จะมีการเรียงลำดับความยาวหากขนาดของตัวอักษรถูกล้อมด้วยค่าคงที่หรือไม่?n/2o(n)

(สิ่งนี้เป็นที่รู้จักกันว่าเป็นจริงสำหรับตัวอักษรไบนารี)

แก้ไข 2: คำตอบเชิงลบเพื่อโบนัสคำถามที่เป็นที่รู้จักกันไปแล้วสำหรับตัวอักษรที่มีขนาดอย่างน้อย5ในความเป็นจริงสำหรับตัวอักษรขนาดมีสตริงกับ subsequences ซ้ำที่ยาวที่สุดของความยาวของเพียง1/2}) สตริงสุ่มเพียงพอที่จะแสดงสิ่งนี้ ผลลัพธ์มีอยู่แล้ว แต่ฉันมองข้ามไป5ΣO(n·Σ1/2)

แก้ไข: หมายเหตุ:

บางคนหมายถึง "ซับสตริง" เมื่อพวกเขาพูดว่า "ลำดับ" ฉันไม่. นี่ไม่ใช่ปัญหาในการค้นหาสตริงย่อยสองครั้ง


Sekti ขอบคุณ คุณพูดถูก: ความคิดเห็นแรกของฉันผิดพลาด; ตอนนี้ฉันลบมันแล้ว ในทางกลับกันความคิดเห็นที่เหลือของฉันกำลังพูดถึงองค์ประกอบที่ไม่ต่อเนื่องกัน หากได้รับการแก้ไขจะมีวิธีการแก้ปัญหาของคุณ (ด้วยการเรียงลำดับที่ไม่ต่อเนื่องซึ่งได้รับคำสั่งให้ไม่ทับซ้อนกัน) ในเวลา ปัญหาย่อย dp แต่ละรายการจะติดตามดัชนีของตัวอักษรสีแดงทั้งหมดและตัวอักษรสีน้ำเงินทั้งหมดที่เลือกไว้ นี่อาจไม่น่าสนใจเพราะไม่ได้บอกเราว่าเกิดอะไรขึ้นเมื่อเป็นส่วนหนึ่งของอินพุต O ( n 2 k + 2 ) kkO(n2k+2)k
DW

@DW ทำไมถึงไม่สามารถคำถามอย่างเป็นทางการได้รับการตอบอย่างมีประสิทธิภาพด้วยนี้การปรับเปลี่ยนของ subsequence ทั่วไปที่ยาวที่สุด? บางทีฉันอาจพลาดบางสิ่งบางอย่างและบางคนสามารถชี้แจงให้ฉันได้
Bryce Kille

@BryceKille ฉันไม่รู้ อาจจะสามารถ หากคุณเข้าใจวิธีการทำฉันหวังว่าคุณจะเขียนคำตอบ!
DW

คำตอบ:


-2

สิ่งนี้สามารถแก้ไขได้ เวลาพหุนามโดยการสร้างกราฟที่แต่ละโหนดแสดงให้เห็นถึงจุดในบาง subsequence ซ้ำของดังกล่าวว่า[เจ] ขอบระหว่างโหนดและหมายความว่าสามารถดำเนินการต่อโดยเพื่อสร้างความยาวซ้ำ 2( i , j ) S S [ i ] = S [ j ] u v u vG(i,j)SS[i]=S[j]uvuv

1.ค้นหาโหนด สิ่งนี้สามารถทำได้ในเวลาโดยการสร้างรายการเรียงลำดับของดัชนีสำหรับอักขระแต่ละตัวแล้วแจกแจงคู่ที่ไม่ซ้ำกัน ไม่มีโหนดมากกว่าc m = n 2O(n2)cm=n2

2.ค้นหาขอบ มันต้องใช้ถึงเวลาที่จะตรวจสอบว่าโหนดสามารถอย่างต่อเนื่องโดยโหนดดังนั้นโดยพิจารณาทุกคู่ขั้นตอนนี้จะใช้เวลาเวลาu v ( u , v ) O ( m 2 )O(1)uv(u,v)O(m2)

3.โปรดทราบว่าเส้นทางที่ยาวที่สุดในอาจไม่ใช่ลำดับที่ซ้ำกันที่ถูกต้อง พิจารณาเส้นทางและBCหากมีขอบแล้วจะเป็นความยาวที่ซ้ำกันของความยาว 3 ดังนั้นจึงใช้เวลาในการค้นหาความยาวที่ซ้ำกันทั้งหมด 3 ในกรณีทั่วไปจะใช้เวลาเชิงเส้นเพื่อตรวจสอบว่าเส้นทางที่ถูกต้องสองเส้นทาง ความยาวสามารถรวมกันเป็นเส้นทางที่ถูกต้องของความยาว1a b b c a c a b c O ( m 4 ) n n + 1GabbcacabcO(m4)nn+1

4. ทำซ้ำขั้นตอนที่ 3 จนกว่าจะไม่พบเส้นทางอีกต่อไป


อืมมม เร็วเกินไป ในขั้นตอนที่ 3 จำนวนองค์ประกอบที่ต้องพิจารณามีขนาดใหญ่ขึ้นเรื่อย ๆ มันไม่ใช่พหุนาม
noplogist

1
ยินดีต้อนรับสู่ CS.SE และขอขอบคุณที่พยายามแก้ไขปัญหานี้! ฉันเกรงว่าฉันไม่เข้าใจอัลกอริทึมของคุณ ขั้นตอนที่ 3 คืออะไร ทั้งหมดที่ฉันเห็นใน "3. " เป็นแถลงการณ์ / ข้อสังเกตที่เปิดเผยได้ แต่ฉันไม่เห็นข้อกำหนดขั้นตอนของสิ่งที่อัลกอริทึมควรทำ นอกจากนี้ฉันไม่เห็นความหมายซ้ำขั้นตอนที่ 3 หรือเหตุผลสำหรับการอ้างสิทธิ์ของคุณว่าเวลาเพียงพอ ความคิดเห็นที่ตามมาของคุณทำให้ดูเหมือนว่าคุณไม่เชื่อว่าคำตอบของคุณจะถูกต้องอีกต่อไป ถ้าเป็นเช่นนั้นอาจเป็นการดีกว่าที่จะลบคำตอบเพื่อหลีกเลี่ยงความสับสน O(nnm2)
DW

คุณสามารถยกเลิกการลบหรือโพสต์คำตอบใหม่ได้ตลอดเวลาหากคุณหาคำตอบได้ในภายหลัง
DW

DW ขอบคุณ อินพุตถึงขั้นตอนที่ 3 คือการวนซ้ำทั้งหมดของความยาว n และเอาท์พุทเป็นการวนซ้ำซ้ำทั้งหมดของความยาว n + 1 ฉันเชื่อว่าอัลกอริทึมนั้นถูกต้อง แต่ไม่ใช่อัลกอริธึมเวลาแบบพหุนาม ตอนนี้ฉันได้ทำเครื่องหมายการเรียกร้องที่ฉันพิจารณาว่าไม่ถูกต้อง
noplogist

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