如果您可以重命名动态编程…


43

如果您可以重命名动态编程,您将如何称呼它?


1
我会说动态编程就是动态编程。那是与算法不同的概念。如果您问“动态编程的算法应用”,那对我来说更有意义。
冈本

1
dp当然是dp,但是编程和动态在今天都意味着不同,所以当我教动态编程时,我希望它有不同的名称。
杰克

4
抱歉,我不够清楚。您是否对动态编程感兴趣,包括对控制和策略计划等的使用,甚至是随机动态编程,还是对动态编程作为算法设计的一种方法感兴趣?这里的主要受众只会知道后者,但是您的问题很笼统,其中包括前者。
冈本

1
吉尾,我认为您应该在回答中解释更一般的概念,回答不同之处,因为它可以启发我们许多人。
拉斐尔

2
另一种完全不开玩笑的想法:“让您在Google工作的东西”-基于我的学生所拥有的经验:)
Suresh Venkat

Answers:


50

理查德·贝尔曼(Richard Bellman)的自传表明,他选择“动态编程”一词是故意分散注意力。

1950年代不是数学研究的好年头。我们在华盛顿有一位非常有趣的绅士,名叫威尔逊。他曾任国防部长,实际上对“研究”一词有病态的恐惧和仇恨。我不是在轻率地使用这个词。我正在精确地使用它。如果人们在他的面前使用“研究”一词,他的脸就会闷闷不乐,他会变成红色,并且会变得暴力。您可以想象他对“数学”一词的感受。兰德公司受雇于空军,而空军实质上是由威尔逊担任老板的。因此,我觉得我必须做些事情来保护威尔逊和空军免受我实际上是在兰德公司内部从事数学工作的事实。

我可以选择什么标题,什么名字?首先,我对计划,决策,思考感兴趣。但是出于各种原因,规划并不是一个好词。因此,我决定使用“编程”一词。我想了解一下这是动态的,多阶段的,随时间变化的想法,我想,让我们用一块石头杀死两只鸟。让我们用一个在古典物理意义上具有绝对精确含义的词,即“动态”。它也有一个非常有趣的性质,作为形容词,这在贬义的意义上不可能使用“动态”一词。尝试考虑一些可能赋予其贬义性的组合。不可能。因此,我认为“动态编程”是个好名字。连国会议员都无法反对。

(正如罗素(Russell)和诺维格(Norvig)在其AI教科书中指出的那样,这个故事必须是对真理的创造性修饰。贝尔曼(Bellman)在1952年首次使用了“动态编程”这一短语,而查尔斯·欧文·威尔逊(Charles Erwin Wilson)直到1953年才成为国防部长。 )

无论如何,Bellman的最初动机是建议进行多阶段计划,但至少出于算法目的,我更喜欢节俭的自下而上递归,但音节较少。


10
当然,我真正想做的是重命名“贝尔曼方程”,或者像计算机科学家所说的那样,“任何重复”。
Jeffε

2
您的答案在这里使用:biostar.stackexchange.com/questions/17954
Pierre

28

DP有两个重要方面:(1)定义子问题(即,建立“表”,该表可以是可能由整数,顶点,顶点子集等索引的多维数组),以及(2)递归求解子问题。我建议将“表格/表格递归”作为一个名称,同时引用这两个方面。


6
表格递归确实具有很好的感觉。
Suresh Venkat

21

记忆化是一个相当普遍的变体。


8
使用了记忆功能,但不表征dp。
杰克

20
究竟。记忆是偶然的动态编程。
Jeffε

@埃里克森教授-说得很好。我止不住地笑。
Akash Kumar

7
不过,如果我们要为DP选择一个新名称,那么使用备忘录非常适合。例如,“编辑距离可以使用备忘录在多个时间内计算”。
Noam

动态编程是记忆的一种特殊情况,加上显式地指示控制流而不是遵循自然的应用评估顺序。很可惜,通常是这样讲的,因为它过分强调填写表而不是递归规范。它就像魔术一样。
尼尔·多伦多

8

要进行分而治之,我要说“ 拼接与结合”。

在讲解/解释DP时,我通常会同时使用两个单词,剪接组合;但未明确使用剪接结合。有时我使用重叠的分而治之来对比这两种范例。


6

在我最近关于算法设计中的动态编程的演讲之后,我请学生们为该技术提出一个新的名字。当我为“艰难的编程”而逗乐时,我想要一些可以使这项技术更令人难忘的东西。在这里进行讨论之后,我可以提出两个名称,一个用于自上而下,一个用于自下而上:
Multiway-Divide和Memoized-Conquer(又名Divide ^ M&Conquer ^ M),并
合并所有子问题(又名Merge_all)。


1
我认为与通常的分而治之建立牢固的联系(如在Mergesort中)不是一个好主意。在那里,子问题独立解决,并且仅合并了两个结果。在DP中,检查的子问题不是独立的,并且所有组合都已检查。(均以粗略表述)。因此,我认为名称应突出区别,而不是营造相似感。
拉斐尔

@Raphael,我对建立牢固的协会的危险性表示担忧,但不同意您对差异的说法。在DP中,即使共享子问题解决方案,子问题也必须 “独立解决” ,这一点至关重要。我通常会指出,如果某些甲骨文告诉您正确的划分,那将是分裂和征服,但是由于我不会说希腊语(与我的博士生顾问不同),所以我必须尝试所有可能的划分。
杰克

2
是的,子问题在概念上是独立的。但是,正如您指出的那样,我使用相同的部分结果与它们相关。这将DP与D&C分开,因为例如可以并行化后者而无需多次计算子问题(或传达结果),而不是前者。您的类比很好,但是在这种情况下并不能保证其名称,因为找到正确的划分是问题的重要组成部分。我想您可以说,DP是基于该推理的D&C的概括。
拉斐尔

@Raphael,很抱歉成为一个学徒,但是由于这是关于教学的问题,我希望明确解决子问题独立性的概念,仅说“概念上独立”是不准确的。当您尝试除法时,您产生的子问题可能没有依赖性。您的其他评论集中在DP算法的步骤上。我更喜欢首先专注于精确定义要解决的问题。我喜欢的例子:分钟重量三角测量和分钟凸简单多边形(的分解cs.unc.edu/~snoeyink/demos/convdecomp/MWTDemo.html
杰克

悬挂是可以的。但是考虑一下单词选择的教学意义:您告诉学生子问题是独立的,然后为他们提供一种算法,该算法不会分离其计算,但实际上很大程度上依赖于“交织”计算。我认为这可能非常令人困惑。因此,您确实必须在某个时候将概念/数学/优化/ ...与计算独立性区分开来。
拉斐尔


2

我最近与一些同事讨论了这个问题,经过激烈的讨论,我们提出了表格调用缓存


3
这听起来像是您在外包呼叫中心所做的事情;)
Suresh Venkat

2

我建议使用归纳编程的名称-从我们时代到欧拉,开普勒等人的美好时光,就像桥梁一样。或者甚至是反向归纳编程。是的,在我看来,DP与归纳紧密相关。备注,缓存,表等只是技术的要素,而不是破解事物的方法的核心。


我与DP主要问题是P.所以我没有这个想法的粉丝..
苏雷什Venkat

1

可能包含单词tablefill的东西,因为这就是发生的情况。


7
呸。动态编程与无关;这是关于智能递归的。
Jeffε

3
我认为最好将两个方面分开:“从问题中提取递归结构,并将其记为递归”(建模)和“以自下而上的方式解决所获得的递归”(算法)。我感觉动态编程(在算法)指的是,这也是线性规划,整数规划,半定节目等的情况下
雄冈本

1
有时会使用表格。在树上进行动态编程(例如:最大独立集)通常不使用表[= array]来记录重复发生;它使用一棵树,或者在某些情况下使用数组的树,或者在树的笛卡尔积的情况下使用树的数组。类似地,对于有限制的树宽图,通过dag进行动态编程或通过树分解进行动态编程。
Jeffε

1
JeffE是一项技术的名称,几乎没有涵盖所有应用程序。以“对角线化”为例;在高级应用程序中,视线中没有任何对角线(或者至少不是唯一的作用区域)。但是无论如何,我不太喜欢“餐桌填充”,尽管我认为对于初学者来说这可能是一个合理的名称。
拉斐尔

3
我在这个问题上的2美分。动态编程具有两个不同的方面来设计算法。首先是要了解dp的机制,如:智能递归加备忘录可带来更快的算法。第二个方面是如何认识到问题可以接受智能递归并提出解决方案。两者都很重要。对于后者,一个常见的情况是在有限的交互作用下进行分而治之,我认为值得明确强调。
Chandra Chekuri 2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.