การตัดสินใจเกี่ยวกับปัญหาย่อยสำหรับการเขียนโปรแกรมแบบไดนามิก


39

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


ดูเหมือนว่าไม่มีคำตอบที่มีอยู่ (ณ เดือนเมษายน 2019) ดีพอโดยเฉพาะสำหรับผู้เริ่มต้น ฉันจะแนะนำบทเรียนเกี่ยวกับเว็บไซต์อื่น ๆ
Apass.Jack

คำตอบ:


35

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


14
ฉันอ้างว่าเป็นกลยุทธ์เดียว
JeffE

2
@JeffE ใช่ฉันอ่านและใช้บันทึกย่อของคุณเมื่อสอนคลาสอัลกอริทึมของฉันและมีประสิทธิภาพ ข้อความอ้างอิง: "ไดนามิกไม่ได้เกี่ยวกับการกรอกตารางมันเป็นเรื่องของการเรียกซ้ำแบบสมาร์ท!"
Dai

2
ความเข้าใจของฉันเกี่ยวกับวิธีการสอน DPs ได้รับอิทธิพลอย่างมากจากบันทึกย่อของ @ JeffE :)
Suresh

3
นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนขั้นตอนการเรียกซ้ำจากบนลงล่างโดยอัตโนมัติเป็นอัลกอริทึมการเขียนโปรแกรมแบบไดนามิก เมื่อคุณกำลังจะกลับมาให้เก็บคำตอบไว้ในตารางแฮช ในการเริ่มต้นการโทรแต่ละครั้งให้ตรวจสอบว่าคำตอบอยู่ในตารางแฮชแล้วหรือไม่และถ้าใช่ให้ส่งคืนทันที อัลกอริทึมจำนวนมากกลายเป็นเรื่องง่ายด้วยความคิดนี้ ตัวอย่างเช่นตารางดังกล่าวขั้นตอนวิธีแบบเรียกซ้ำในความพยายามจะทำงานกับ DAWG โดยอัตโนมัติ ด้วยการจัดเก็บค่า Sentinel ในตารางที่จุดเริ่มต้นของการโทรอัลกอริทึมเดียวกันสามารถทำงานได้แม้ใน DFAs อัลกอริธึมบน BDDs นั้นง่ายมากในการระบุแบบเรียกซ้ำ
Jules

1
ท้ายสุด แต่ไม่ท้ายสุดนี่มีข้อได้เปรียบด้านประสิทธิภาพมากมาย ตัวอย่างเช่นอัลกอริทึมผลรวมย่อยของชุดค่าจากล่างขึ้นบนแบบดั้งเดิมสามารถคำนวณรายการตารางที่ไม่จำเป็นจำนวนมากได้ ด้วยวิธีนี้เฉพาะรายการตารางที่จำเป็นจะถูกคำนวณ
Jules

4

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

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

ดังนั้นการคิดถึงวิธีการแบ่งและพิชิตจะช่วยให้คุณมีความเข้าใจเกี่ยวกับสิ่งที่อาจเป็นปัญหาย่อยสำหรับปัญหาเฉพาะของคุณ


1
"โครงสร้างพื้นฐานที่ดีที่สุด" (อะไรก็ตามที่มีความหมาย) อาจไม่เพียงพอสำหรับการแก้ปัญหา DP "ปัญหาย่อยที่ทับซ้อนกัน" ไม่ใช่สิ่งที่จำเป็นอย่างแน่นอน
Raphael

1
โครงสร้างพื้นฐานที่ดีที่สุดและ supproblems ที่ทับซ้อนกันทั้งคู่แสดงโดยปัญหาที่ DP สามารถแก้ไขได้อย่างมีประสิทธิภาพ แน่นอนว่าโครงสร้างพื้นฐานที่ดีที่สุดเพียงอย่างเดียวนั้นไม่เพียงพอสำหรับการแก้ไข DP อย่างไรก็ตามถ้าคุณไม่มีปัญหาย่อยที่ทับซ้อนกันคุณสามารถแก้ปัญหาด้วยการหารสามัญและเอาชนะด้วยราคาเดียวกัน: แน่นอนประโยชน์ของ DP ที่มีต่อการแบ่งการพิชิตคือแต่ละ subproblem จะได้รับการแก้ไขเพียงครั้งเดียวเมื่อพบในต้นไม้เรียกซ้ำ .
Massimo Cafaro

1
ไม่ใช่สูตรของฉัน: คุณจะพบกับ "ความรู้เบื้องต้นเกี่ยวกับอัลกอริทึม" โดย Cormen, Leiserson, Rivest และ Stein และตำราอื่น ๆ อีกมากมายเกี่ยวกับอัลกอริทึม
Massimo Cafaro

1
Jup และส่วนใหญ่ผิดอย่างน้อยบางส่วน ฉันยินดีที่จะอธิบายอย่างละเอียดหากคุณโพสต์คำถามที่เหมาะสม
Raphael

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

2

ประสบการณ์ของฉันคือการหาวิธีที่จะ "ลดความซ้ำซ้อนที่แจกแจงด้วยความช่วยเหลือในการจัดเก็บค่าที่มีประโยชน์ที่ระบุแล้ว" อย่างไรก็ตามการเขียนโปรแกรมแบบไดนามิกเป็นที่นิยมมากใน ICPC (International Collegiate Programming Contest) ทุกคนสามารถมีความรู้สึกของตัวเองเกี่ยวกับ DP หลังจากฝึกฝนปัญหา ICPC หลายอย่าง

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