หากคุณสามารถเปลี่ยนชื่อการเขียนโปรแกรมแบบไดนามิก ...


43

หากคุณสามารถเปลี่ยนชื่อการเขียนโปรแกรมแบบไดนามิกคุณจะเรียกมันว่าอะไร?


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

1
แน่นอนว่า dp คือ dp แต่การเขียนโปรแกรมและไดนามิกทั้งสองหมายถึงสิ่งที่แตกต่างกันในวันนี้ดังนั้นเมื่อฉันสอนการเขียนโปรแกรมแบบไดนามิกฉันหวังว่ามันจะมีชื่อแตกต่างกัน
Jack

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

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

2
แนวคิดอีกอย่างที่ไม่เกี่ยวกับแก้ม: "สิ่งที่ทำให้คุณได้งานที่ Google" - จากประสบการณ์ที่นักเรียนของฉันมี :)
Suresh Venkat

คำตอบ:


50

อัตชีวประวัติของ Richard Bellmanแนะนำว่าเขาเลือกคำว่า "การเขียนโปรแกรมแบบไดนามิก" เพื่อเบี่ยงเบนความสนใจโดยเจตนา

ปี 1950 ไม่ได้เป็นปีที่ดีสำหรับการวิจัยทางคณิตศาสตร์ เรามีสุภาพบุรุษที่น่าสนใจคนหนึ่งในวอชิงตันชื่อวิลสัน เขาเป็นรัฐมนตรีกลาโหมและจริง ๆ แล้วเขามีความกลัวและความเกลียดชังทางพยาธิวิทยาของคำว่า 'การวิจัย' ฉันไม่ได้ใช้คำเบา ๆ ฉันใช้มันอย่างแม่นยำ ใบหน้าของเขาจะขาดลอยเขาจะกลายเป็นสีแดงและเขาจะรุนแรงถ้าผู้คนใช้คำว่า 'การวิจัย' ในที่ที่เขาอยู่ คุณสามารถจินตนาการได้ว่าเขารู้สึกอย่างไรเกี่ยวกับคำว่า 'ทางคณิตศาสตร์' บริษัท แรนด์คอร์ปอเรชั่นได้รับการว่าจ้างจากกองทัพอากาศและกองทัพอากาศมีวิลสันเป็นเจ้านาย ดังนั้นฉันรู้สึกว่าฉันต้องทำอะไรบางอย่างเพื่อป้องกัน Wilson และกองทัพอากาศจากข้อเท็จจริงที่ว่าฉันกำลังทำคณิตศาสตร์ใน RAND Corporation

ฉันจะเลือกชื่ออะไรได้บ้าง ในตอนแรกฉันสนใจในการวางแผนในการตัดสินใจในการคิด แต่การวางแผนไม่ใช่คำที่ดีด้วยเหตุผลหลายประการ ฉันตัดสินใจใช้คำว่า 'Programming' ฉันอยากจะข้ามความคิดที่ว่ามันเป็นพลวัตนี่คือหลายขั้นตอนนี่คือเวลาที่แตกต่างกัน - ฉันคิดว่าเราจะฆ่านกสองตัวด้วยหินก้อนเดียว ลองมาคำที่มีความหมายที่แม่นยำอย่างแน่นอนคือ 'ไดนามิก' ในความรู้สึกทางกายภาพคลาสสิก นอกจากนี้ยังมีคุณสมบัติที่น่าสนใจมากในฐานะที่เป็นคำคุณศัพท์และนั่นเป็นไปไม่ได้ที่จะใช้คำว่า 'ไดนามิก' ในแง่ดูถูก ลองคิดถึงชุดค่าผสมที่อาจให้ความหมายที่ดูถูก มันเป็นไปไม่ได้. ดังนั้นฉันคิดว่า "การเขียนโปรแกรมแบบไดนามิก 'เป็นชื่อที่ดี มันไม่ใช่สิ่งที่แม้แต่สมาชิกสภาผู้แทนราษฎรจะคัดค้าน

(ในขณะที่รัสเซลและ Norvig ชี้ให้เห็นในตำราเรียน AI ของพวกเขาอย่างไรก็ตามเรื่องนี้จะต้องเป็นความคิดสร้างสรรค์ของความจริง Bellman ใช้วลี "การเขียนโปรแกรมแบบไดนามิก" ครั้งแรกในปี 1952และชาร์ลส์เออร์วินวิลสันไม่ได้เป็นกระทรวงกลาโหม )

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


10
แน่นอนว่าสิ่งที่ฉันต้องการจริงๆต้องการจะทำคือการเปลี่ยนชื่อ“ยามของสมการ” หรือเป็นนักวิทยาศาสตร์คอมพิวเตอร์เรียกมันว่า“การเกิดซ้ำใด ๆ”
Jeff

2
คำตอบของคุณถูกใช้ที่นี่: biostar.stackexchange.com/questions/17954
Pierre

28

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


6
การเรียกซ้ำแบบตารางจะทำให้รู้สึกดี
Suresh Venkat

21

การบันทึกเป็นตัวแปรที่พบได้ทั่วไป


8
มีการใช้การบันทึก แต่ไม่มีการกำหนดลักษณะ DP
แจ็ค

20
เผง การบันทึกคือการเขียนโปรแกรมแบบไดนามิกโดยไม่ได้ตั้งใจ
Jeff

@ profer erickson - พูดได้ดีมาก ฉันไม่สามารถหยุดหัวเราะได้.
Akash Kumar

7
ถึงกระนั้นถ้าเราได้รับเลือกชื่อใหม่สำหรับ DP แล้วการใช้การบันทึกช่วยจำจะค่อนข้างเหมาะสมสำหรับมัน เช่น "ระยะทางแก้ไขสามารถคำนวณได้ในเวลาโพลีโดยใช้การบันทึกความจำ"
โนม

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

8

เพื่อไปกับหารและพิชิตฉันจะพูดว่าประกบกันและรวมกัน

ฉันมักจะใช้ทั้งสองคำประกบกันและรวมกันในขณะที่การสอน / การอธิบาย DP; แต่ไม่ได้ใช้การประกบกันและรวมอย่างชัดเจน บางครั้งฉันใช้การซ้อนทับ - หาร - และ - พิชิตเพื่อเปรียบเทียบสองกระบวนทัศน์


6

หลังจากการบรรยายล่าสุดของฉันเกี่ยวกับการเขียนโปรแกรมแบบไดนามิกในการออกแบบอัลกอริทึมฉันได้ขอให้นักเรียนแนะนำชื่อใหม่สำหรับเทคนิคนี้ ในขณะที่ฉันสนุกกับ "การเขียนโปรแกรมแบบยาก ๆ " ฉันต้องการบางสิ่งที่อาจทำให้เทคนิคน่าจดจำยิ่งขึ้น หลังจากการอภิปรายที่นี่ฉันอาจเสนอชื่อสองชื่อหนึ่งชื่อสำหรับจากบนลงล่างและอีกชื่อสำหรับจากล่างขึ้นบน:
Multiway-Divide และ Memoized-Conquer (aka Divide ^ M & Conquer ^ M) และ
รวม subproblems ทั้งหมด (aka Merge_all)


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

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

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

@ ราฟาเอลขอโทษที่พูดอย่างคล่องแคล่ว แต่เนื่องจากคำถามนี้เกี่ยวกับการสอนฉันต้องการความคิดของความเป็นอิสระของปัญหาย่อยให้ชัดเจนและเพียงแค่พูดว่า "แนวคิดอิสระ" ไม่แม่นยำ เมื่อคุณลองแบ่งย่อยปัญหาย่อยที่คุณสร้างอาจไม่มีการอ้างอิง ความคิดเห็นอื่นของคุณมุ่งเน้นไปที่ขั้นตอนของอัลกอริทึม DP; ฉันชอบที่จะมุ่งเน้นไปที่การกำหนดปัญหาที่จะแก้ไขอย่างแม่นยำก่อน ตัวอย่างที่ฉันชอบ: การหาน้ำหนักแบบสามเหลี่ยมและการสลายตัวแบบนูนต่ำสุดของรูปหลายเหลี่ยมแบบง่าย ๆ ( cs.unc.edu/~snoeyink/demos/convdecomp/MWTDemo.html )
Jack

มันโอเคที่จะเป็นจี้ แต่ให้พิจารณาการนำเข้าคำสอนเกี่ยวกับการเลือกคำศัพท์: คุณบอกนักเรียนว่าปัญหาย่อยนั้นเป็นอิสระจากนั้นให้อัลกอริทึมที่ไม่แยกการคำนวณ แต่ในความเป็นจริงแล้วอาศัยการคำนวณแบบ "interleaved" อย่างหนัก ฉันคิดว่ามันอาจทำให้สับสนมาก ดังนั้นคุณต้องแยกความคิด / คณิตศาสตร์ / การเพิ่มประสิทธิภาพ / ... และความเป็นอิสระในการคำนวณในบางจุด
Raphael


2

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


3
ฟังดูเหมือนบางสิ่งบางอย่างที่คุณทำที่ call center outsourced;)
Suresh Venkat

2

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


ปัญหาหลักของฉันกับ DP คือ P. ดังนั้นฉันไม่ใช่แฟนของความคิดนี้ ..
Suresh Venkat

1

อาจเป็นสิ่งที่มีคำว่าตารางและเติมเช่นนี้เป็นสิ่งที่เกิดขึ้น


7
Bah การเขียนโปรแกรมแบบไดนามิกไม่เกี่ยวกับตาราง ; มันเกี่ยวกับการเรียกซ้ำที่ชาญฉลาด
Jeff

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

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

1
JeffE เป็นชื่อของเทคนิคที่แทบจะไม่ครอบคลุมแอปพลิเคชันทั้งหมด ยกตัวอย่างเช่น "diagonalisation"; ในแอปพลิเคชันขั้นสูงไม่มี diagonale ใด ๆ ในสายตา (หรืออย่างน้อยก็ไม่ใช่พื้นที่พิเศษของการกระทำ) แต่ฉันไม่รักมากเกินไปกับ "การเติมตาราง" ในขณะที่ฉันคิดว่ามันอาจเป็นชื่อที่สมเหตุสมผลสำหรับผู้เริ่มต้น
Raphael

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

1

มุมมองแบบเรียกซ้ำหรือเส้นขอบฟ้าแบบเรียกซ้ำ


ขอบฟ้าขี้เกียจ? คุณชะลอการคำนวณผลลัพธ์จำนวนมากจนกว่าจะจำเป็น DP ไม่จำเป็นต้องเรียกซ้ำ
Chad Brewbaker

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