“动态规划”并不是指“计算机编程”
Hacker News 摘要原标题:“Dynamic Programming” is not referring to “computer programming”
在这篇博客文章中,作者探讨了“动态规划”(Dynamic Programming)这一术语的真正含义,并强调它并不意味着“计算机编程”。文章指出,当人们在算法课程或LeetCode学习指南中看到“动态规划”这一短语时,常常会询问“在这个上下文中,‘动态’是什么意思”,而更重要的问题是“在这个上下文中,‘编程’是什么意思”。实际上,这里的“编程”指的是计划(programming),这是为控制、管理或行政目的而进行的规划。
作者提到,与“计算机编程”(如编写软件)相比,“动态规划”更接近于“电视节目编排”,即创建一个时间表。这个术语最早是在1950年代被创造出来,当时土木工程师会用“编排一座新办公楼”来表示规划建造过程中的每个子步骤的顺序和时间线。
文章举了一个例子,简化地描述了建筑工程中的几个步骤,强调这些步骤必须按照依赖关系的顺序进行,因为每个步骤都会依赖于之前完成的步骤。例如,如果电工在伐木工人还没有完成清场时就到达工地,他们将无法完成工作。动态规划在计算机科学中的意义类似,即“规划解决完整问题所需的每个子步骤的顺序”。
在具体的计算例子中,例如计算Fibonacci数列,文章展示了如何通过有序的步骤(从已知的fib(0)和fib(1)开始)依次计算到fib(10)。无论是自顶向下地解决问题,还是自底向上地逐步计算,最终的计划都是相同的,因此两者都被视为动态规划。
博客还提到“动态规划”这一术语是由理查德·贝尔曼(Richard Bellman)在1950年代创造的,当时的背景是他需要为自己的工作选择一个不会引发争议的名称,因为当时他所处的环境对“研究”这个词有着很大的偏见。他选择了“编程”这个词,目的是想表明他的工作是动态的、多阶段的,并且带有时变特性。
最后,作者鼓励读者在理解动态规划时,更加关注其“编程”的含义,而非仅仅停留在“动态”这个表面的理解。